将 Evennia 频道连接到 Discord

Discord 是一个流行的聊天服务,尤其适合游戏社区。如果你的游戏有一个 Discord 服务器,可以将其连接到你的游戏内频道,实现游戏内外的沟通。

配置 Discord

首先,你需要设置一个 Discord 机器人来连接到你的游戏。访问 bot applications 页面并创建一个新应用程序。需要将“MESSAGE CONTENT”选项切换为开启,并将你的机器人令牌添加到设置中。

# mygame/server/conf/secret_settings.py
DISCORD_BOT_TOKEN = '<your Discord bot token>'

如果还没有安装 pyopenssl 模块,则需要安装它。在你的 Evennia Python 环境中执行以下命令:

pip install pyopenssl

最后,在设置中启用 Discord:

DISCORD_ENABLED = True

启动或重新加载 Evennia 并以特权用户身份登录。现在应该有一个新命令可用:discord2chan。输入 help discord2chan 以获取其选项的说明。

添加新频道链接的命令如下:

discord2chan <evennia_channel> = <discord_channel_id>

evennia_channel 参数必须是现有 Evennia 频道的名称,而 discord_channel_id 是 Discord 频道的完整数字 ID。

你的机器人需要被添加到正确的 Discord 服务器,并具有访问频道的权限才能发送或接收消息。此命令不会验证你的机器人是否具有 Discord 权限!

Discord 设置步骤

本节将逐步介绍为你的 Evennia 游戏设置 Discord 连接的整个过程。如果你已经完成了其中的某些步骤,可以直接跳到下一个步骤。

创建 Discord 机器人应用程序

你需要一个活跃的 Discord 账户和对 Discord 服务器的管理员访问权限才能连接 Evennia。

确保你已在 Discord 网站上登录,然后访问 https://discord.com/developers/applications。点击右上角的“New Application”按钮,然后输入新应用程序的名称——使用你的 Evennia 游戏名称是一个不错的选择。

接下来,你将进入新应用程序的设置页面。点击侧边栏菜单中的“Bot”,然后点击“Build-a-Bot”以创建你的机器人账户。

保存显示的令牌! 这将是 Discord 唯一一次允许你查看该令牌——如果丢失,你将不得不重置它。此令牌用于确认机器人的身份,因此非常重要。

接下来,将此令牌添加到你的 secret 设置中。

# file: mygame/server/conf/secret_settings.py

DISCORD_BOT_TOKEN = '<token>'

保存后,向下滚动到 Bot 页面,找到“Message Content Intent”选项并将其切换为开启,否则你的机器人将无法读取任何人的消息。

最后,你可以为新机器人账户添加任何其他设置:显示图像、显示昵称、简介等。你可以随时返回更改这些设置,因此现在不必过于担心。

将机器人添加到服务器

在你的新应用程序中,点击侧边菜单中的“OAuth2”,然后点击“URL Generator”。在此页面上,你将生成一个邀请 URL,然后访问该 URL 将其添加到你的服务器。

在顶部框中,找到 bot 复选框并选中它:这将使第二个权限框出现。在该框中,你需要至少勾选以下选项:

  • 读取消息/查看频道(在“General Permissions”中)

  • 发送消息(在“Text Permissions”中)

最后,向下滚动到页面底部并复制生成的 URL。它应类似于以下内容:

https://discord.com/api/oauth2/authorize?client_id=55555555555555555&permissions=3072&scope=bot

访问该链接,选择你的 Evennia 连接的服务器并确认。

将机器人添加到你的服务器后,可以通过常规的 Discord 服务器管理进一步微调权限。

在 Evennia 中激活 Discord

在你的 Evennia 游戏中,你需要执行两个额外的步骤才能连接到 Discord。

首先,如果尚未安装 pyopenssl,请在你的虚拟环境中安装它。

pip install pyopenssl

其次,在设置文件中启用 Discord 集成。

# file: server/conf/settings.py
DISCORD_ENABLED = True

启动或重新加载游戏以应用更改的设置,然后以至少具有 Developer 权限的账户登录,并使用 discord2chan 命令在 Evennia 上初始化机器人账户。你应该会收到一条消息,表示机器人已创建,并且没有与 Discord 的活动连接。

将 Evennia 频道连接到 Discord 频道

你将需要 Evennia 频道的名称和 Discord 频道的频道 ID。频道 ID 是你访问频道时 URL 的最后一部分。

例如,如果 URL 是 https://discord.com/channels/55555555555555555/12345678901234567890,那么你的频道 ID 是 12345678901234567890

使用以下命令链接两个频道:

discord2chan <evennia channel> = <discord channel id>

现在两个频道应该可以相互传递消息。通过在 Evennia 频道和 Discord 频道上分别发送一条消息来确认这一点——它们应该都出现在另一端。

如果你没有看到任何消息从 Discord 发送或接收,请确保你的机器人有权限读取和发送消息,并且你的应用程序已设置“Message Content Intents”标志。

进一步自定义

discord2chan 的帮助文件中有更多关于如何使用命令自定义传递消息的信息。

然而,对于更复杂的需求,你可以创建自己的 DiscordBot 子类并将其添加到你的设置中。

# file: mygame/server/conf/settings.py
# 示例
DISCORD_BOT_CLASS = 'accounts.bots.DiscordBot'

如果你已经设置了 Discord 中继并正在更改此设置,请确保要么删除 Evennia 中的旧机器人账户,要么更改其类型类,否则它将不会生效。

核心的 DiscordBot 账户类已经设置了几个有用的钩子,用于在 Discord 和 Evennia 频道之间处理和传递频道消息,以及(默认未使用的)direct_msg 钩子,用于处理在 Discord 上发送给机器人的私信。

默认情况下,仅处理消息和服务器更新,但 Discord 自定义协议会将所有其他未处理的调度数据传递给 Evennia 机器人账户,以便你可以自己添加额外的处理。然而,此集成并不是一个完整的库,并没有记录 Discord 事件的全部可能范围。