Flutter Discord交互插件discord_interactions的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter Discord交互插件 discord_interactions 的使用

Features

Feature Status
Manage Application Commands Full support (unit-tested)
Create message components Full support (unit-tested)
Respond to commands Full support (unit-tested)
File uploads Full support (unit-tested)

Supported APIs

API Status
Audit Logs Full support (unit-tested)
Channels Full support (mostly unit-tested)
Emojis Full support (unit-tested)
Guilds Full support (mostly unit-tested)
Guild Scheduled Events Full support (untested)
Guild Templates Full support (untested)
Invites Full support (unit-tested)
Stage Instances Full support (untested)
Stickers Full support (partially unit-tested)
Users Full support (unit-tested)
Voice Full support (unit-tested)
Webhooks Full support (untested)

全量支持所有 Discord API 端点的计划正在进行中。

Getting Started

这个包是为了在无服务器平台上运行一个 Discord bot。下面是一个基于 Google Cloud Run 的示例,但其他支持运行 Dart 代码的提供商也可以工作。

示例项目结构

my_discord_bot/
├── lib/
│   ├── main.dart
│   └── credentials.dart
└── script/
    └── create_commands.dart

创建应用和机器人

  1. Discord Developer Portal 上创建一个应用。
  2. 为你的应用创建一个机器人。
  3. 使用 OAuth2 URL 生成器为机器人生成邀请链接,并将机器人邀请到一个服务器(Guild)。
    • 对于基本交互机器人,只需 applications.commands 权限即可管理并响应应用程序命令。
    • 如果需要进行权限管理和服务器管理等操作,则需要 bot 权限。
    • 只有 applications.commands 权限的机器人不会显示在用户列表中。

配置凭据

lib/credentials.dart 中配置你的凭据:

class Credentials {
  static const applicationPublicKey = 'your-application-public-key';
  static const applicationId = 'your-application-id';
  static const botToken = 'your-bot-token';
  static const userAgentUrl = 'your-user-agent-url';
  static const guildId = 'your-guild-id';
}

部署

按照 Google Cloud Run 快速入门指南中的 PrerequisitesBuild and deploy with a single command 步骤进行部署。

Usage

请求验证

首先,你需要验证所有发送给机器人的请求。你必须拒绝无效的请求。InteractionValidator 类可以帮助你完成这个任务。applicationPublicKey 来自你在 Discord 开发者门户上的应用页面。

import 'package:discord_interactions/discord_interactions.dart';

final validator = InteractionValidator(applicationPublicKey: Credentials.applicationPublicKey);

final valid = validator.validate(headers: request.headers, body: body);
if (!valid) {
    return Response(401, body: 'invalid request signature');
}

响应 Ping 请求

其次,你必须用 pong 响应来回应 ping 请求。

final interaction = Interaction.fromJson(jsonDecode(body));

if (interaction.type == InteractionType.ping) {
    return Response.ok(jsonEncode(InteractionResponse.pong()));
}

响应 Application Commands

现在你可以响应应用程序命令了。

final api = DiscordApi(
  applicationId: Credentials.applicationId,
  userAgent: DiscordUserAgent(
    url: Credentials.userAgentUrl,
    versionNumber: '1.0.0',
  ),
  botToken: Credentials.botToken,
);

await api.interactions.createInteractionResponse(
    interaction.id,
    token: interaction.token,
    response:
        InteractionResponse.message(content: 'Hello, Discord Interactions!'),
);

创建命令

你可以通过运行 dart run script/create_commands.dart 来创建命令。

// script/create_commands.dart
import 'package:discord_interactions/discord_interactions.dart';
import '../lib/credentials.dart';

void main() async {
  final api = DiscordApi(
    applicationId: Credentials.applicationId,
    userAgent: DiscordUserAgent(
      url: Credentials.userAgentUrl,
      versionNumber: '1.0.0',
    ),
    botToken: Credentials.botToken,
  );

  await api.applications.commands.createGlobalCommand(
    Command(
      name: 'hello',
      description: 'Say hello!',
      options: [
        Option(
          type: OptionType.string,
          name: 'name',
          description: 'Your name',
          required: true,
        ),
      ],
    ),
  );
}

Additional Information

此包仍在开发中。如果你有任何建议或反馈,请在 GitHub 上提交问题。

更多关于如何本地测试 webhook bots 的信息可以参考 discord_interactions_test

以上就是使用 discord_interactions 插件的基本指南,希望对你有所帮助!


更多关于Flutter Discord交互插件discord_interactions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Discord交互插件discord_interactions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用discord_interactions插件的示例代码。这个插件允许你与Discord的交互API进行集成,处理命令、组件交互等。

首先,确保你的Flutter项目已经配置好,并且你已经添加了discord_interactions插件到你的pubspec.yaml文件中。

dependencies:
  flutter:
    sdk: flutter
  discord_interactions: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你需要配置你的Discord应用,以启用交互功能,并获取所需的客户端ID和公钥。

以下是一个简单的Flutter应用示例,它使用discord_interactions插件来处理来自Discord的交互:

import 'package:flutter/material.dart';
import 'package:discord_interactions/discord_interactions.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DiscordInteractionPage(),
    );
  }
}

class DiscordInteractionPage extends StatefulWidget {
  @override
  _DiscordInteractionPageState createState() => _DiscordInteractionPageState();
}

class _DiscordInteractionPageState extends State<DiscordInteractionPage> {
  late DiscordInteractions discordInteractions;

  @override
  void initState() {
    super.initState();
    // 替换为你的客户端ID和公钥
    final String clientId = 'YOUR_CLIENT_ID';
    final String publicKey = 'YOUR_PUBLIC_KEY';

    // 初始化DiscordInteractions实例
    discordInteractions = DiscordInteractions(
      clientId: clientId,
      publicKey: publicKey,
      onInteractionCreate: (InteractionCreateEvent event) {
        // 处理交互事件
        print('Received interaction: ${event.toJson()}');

        // 示例:回复一个ping命令
        if (event.type == InteractionType.ping) {
          event.respondWithPong();
        } else if (event.type == InteractionType.applicationCommand) {
          final commandName = event.data!.name;
          if (commandName == 'example') {
            event.respondWithMessage(content: 'Hello, this is an example response!');
          }
        }
      },
    );

    // 登录并监听交互事件
    discordInteractions.login();
  }

  @override
  void dispose() {
    // 注销并停止监听
    discordInteractions.logout();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Discord Interactions Example'),
      ),
      body: Center(
        child: Text('This Flutter app listens for Discord interactions.'),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化DiscordInteractions实例:使用你的客户端ID和公钥进行初始化。
  2. 设置事件处理函数:在onInteractionCreate回调中处理不同类型的交互事件。在这个例子中,我们处理了ping命令和一个名为example的自定义命令。
  3. 登录并开始监听:调用discordInteractions.login()开始监听来自Discord的交互事件。
  4. 注销并清理:在dispose方法中调用discordInteractions.logout()来停止监听并清理资源。

请注意,你需要确保你的Discord应用已经在Discord开发者门户中配置了正确的回调URL,并且已经启用了交互功能。此外,你可能还需要在你的服务器上设置一个反向代理来处理Discord的签名验证,这通常是通过使用像@discordjs/rest这样的库在Node.js环境中完成的,但在Flutter中,这个插件已经为你处理了大部分工作。

这个示例代码只是一个基础入门,你可以根据实际需求进行扩展和修改。

回到顶部