QQChannelBot 1.0.9

There is a newer version of this package available.
See the version list below for details.
dotnet add package QQChannelBot --version 1.0.9                
NuGet\Install-Package QQChannelBot -Version 1.0.9                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="QQChannelBot" Version="1.0.9" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add QQChannelBot --version 1.0.9                
#r "nuget: QQChannelBot, 1.0.9"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install QQChannelBot as a Cake Addin
#addin nuget:?package=QQChannelBot&version=1.0.9

// Install QQChannelBot as a Cake Tool
#tool nuget:?package=QQChannelBot&version=1.0.9                

QQ机器人框架

NuGet NuGet downloads

使用.NET6技术封装的QQ机器人通信框架

使用说明

1.配置日志输出等级

Log.LogLevel = LogLevel.Debug;

2.创建机器人, 配置参数请查阅 QQ机器管理后台

ChannelBot bot = new(new()
{
    BotAppId = 开发者ID,
    BotToken = 机器人令牌,
    BotSecret = 机器人密钥
});

3.注册自定义消息命令

// 注册自定义命令,这里让机器人复读用户的消息
// 如:用户发送 @机器人 复读 123
//   机器人将回复 123
bot.AddCommand("复读", async (sender, e, msg) =>
{
    await sender.SendMessageAsync(e.ChannelId, new MsgText(e.Id, msg));
});

4.如何接收 @机器人 消息

// 订阅 OnAtMessage 事件,处理所有收到的 @机器人 消息
// 注1:被 AddCommand 命令匹配的消息不会出现在这里
// 注2:若要接收服务器推送的所有消息,请订阅 OnDispatch 事件
// sender是ChannelBot对象,e是Message对象,type是消息类型(暂无用,后面可能删除)
bot.OnAtMessage += async (sender, e, type) =>
{
};

5.启动机器人(开始运行并监听频道消息)

bot.Start();

以下是API调用玩法示例

注:AddCommand注册普通指令,任何成员可触发;AddCommandSuper注册管理员指令,仅频道主、管理员、子频道管理员可触发。
// 注册自定义命令,这里测试embed消息 ( 实现功能为获取用户信息,指令格式: @机器人 UserInfo @用户 )
bot.AddCommand("用户信息", async (sender, e, msg) =>
{
    string userId = Regex.IsMatch(msg, @"<@!(\d+)>") ? Regex.Match(msg, @"<@!(\d+)>").Groups[1].Value : e.Author.Id;
    Member member = await bot.GetGuildMemberAsync(e.GuildId, userId) ?? new()
    {
        User = e.Author,
        Roles = e.Member.Roles,
        JoinedAt = e.Member.JoinedAt,
    };
    GuildRoles? grs = await bot.GetGuildRolesAsync(e.GuildId);
    var roles = grs?.Roles.Where(gr => member.Roles.Contains(gr.Id)).Select(gr => gr.Name).ToList() ?? new List<string> { "未知身份组" };
    MsgEmbed ReplyEmbed = new MsgEmbed(e.Id)
    {
        Title = member.User.UserName,
        Prompt = $"{member.User.UserName} 的信息卡",
        Thumbnail = member.User.Avatar
    }
    .AddLine($"用户昵称:{member.Nick}")
    .AddLine($"账户类别:{(member.User.Bot ? "机器人" : "人类")}")
    .AddLine($"角色分类:{string.Join("、", roles)}")
    .AddLine($"加入时间:{member.JoinedAt.Remove(member.JoinedAt.IndexOf('+'))}");
    await sender.SendMessageAsync(e.ChannelId, ReplyEmbed);
});
// 指令格式:@机器人 创建公告 公告内容
bot.AddCommandSuper("创建公告", async (sender, e, msg) =>
{
    Message? sendmsg = await bot.SendMessageAsync(e.ChannelId, msg, e.Id);
    await bot.CreateAnnouncesAsync(sendmsg!);
});
// 指令格式:@机器人 删除公告
bot.AddCommandSuper("删除公告", async (sender, e, msg) =>
{
    await bot.DeleteAnnouncesAsync(e.ChannelId);
});
// 指令格式:@机器人 创建全局公告 公告内容
bot.AddCommandSuper("创建全局公告", async (sender, e, msg) =>
{
    Message? sendmsg = await bot.SendMessageAsync(e.ChannelId, msg, e.Id);
    await bot.CreateAnnouncesGlobalAsync(sendmsg!);
});
// 指令格式:@机器人 删除全局公告
bot.AddCommandSuper("删除全局公告", async (sender, e, msg) =>
{
    await bot.DeleteAnnouncesGlobalAsync(e.ChannelId);
});
// 指令格式:@机器人 禁言 @用户 10天
// 或使用格式:@机器人 禁言 @用户 到 2077-12-12 23:59:59
bot.AddCommandSuper("禁言", async (sender, e, msg) =>
{
    string? userId = Regex.IsMatch(msg, @"<@!(\d+)>") ? Regex.Match(msg, @"<@!(\d+)>").Groups[1].Value : null;
    if (userId == null)
    {
        await sender.SendMessageAsync(e.ChannelId, new MessageToCreate($"{MsgTag.UserTag(e.Author.Id)} 未指定禁言的用户!", e.Id));
        return;
    }
    Match? timeGroups = Regex.IsMatch(msg, @"(\d+)(天|小时|时|分|秒)") ? Regex.Match(msg, @"(\d+)(天|小时|时|分|秒)") : null;
    string timeType = timeGroups?.Groups[2].Value ?? "秒";
    int timeDelay = int.Parse(timeGroups?.Groups[1].Value ?? "60");
    int delaySecond = timeType switch
    {
        "天" => 60 * 60 * 24,
        "小时" => 60 * 60,
        "时" => 60 * 60,
        "分" => 60,
        _ => 1
    } * timeDelay;
    string? timsTamp = Regex.IsMatch(msg, @"\d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d") ? Regex.Match(msg, @"\d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d").Groups[0].Value : null;
    await bot.MuteMemberAsync(e.GuildId, userId, timsTamp != null ? new MuteTime(timsTamp) : new MuteTime(delaySecond));
    await sender.SendMessageAsync(e.ChannelId, new MessageToCreate()
    {
        Content = $"{e.Mentions!.Find(u => u.Id == userId)?.UserName} 已被禁言{(timsTamp != null ? ",解除时间:" + timsTamp : timeDelay.ToString() + timeType)}",
        MsgId = e.Id
    });
});
// 指令格式:@机器人 解除禁言 @用户
bot.AddCommandSuper("解除禁言", async (sender, e, msg) =>
{
    string? userId = Regex.IsMatch(msg, @"<@!(\d+)>") ? Regex.Match(msg, @"<@!(\d+)>").Groups[1].Value : null;
    if (userId == null)
    {
        await sender.SendMessageAsync(e.ChannelId, new MessageToCreate($"{MsgTag.UserTag(e.Author.Id)} 未指定解除的用户!", e.Id));
        return;
    }
    await bot.MuteMemberAsync(e.GuildId, userId, new MuteTime(0));
    await sender.SendMessageAsync(e.ChannelId, new MessageToCreate($"{e.Mentions!.Find(u => u.Id == userId)?.UserName} 已解除禁言", e.Id));
});
// 指令格式:@机器人 全体禁言 10天
// 或使用格式:@机器人 全体禁言 到 2077-12-12 23:59:59
bot.AddCommandSuper("全员禁言", async (sender, e, msg) =>
{
    Match? timeGroups = Regex.IsMatch(msg, @"(\d+)(天|小时|时|分|秒)") ? Regex.Match(msg, @"(\d+)(天|小时|时|分|秒)") : null;
    string timeType = timeGroups?.Groups[2].Value ?? "秒";
    int timeDelay = int.Parse(timeGroups?.Groups[1].Value ?? "60");
    int delaySecond = timeType switch
    {
        "天" => 60 * 60 * 24,
        "小时" => 60 * 60,
        "时" => 60 * 60,
        "分" => 60,
        _ => 1
    } * timeDelay;
    string? timsTamp = Regex.IsMatch(msg, @"\d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d") ? Regex.Match(msg, @"\d{4}-\d\d-\d\d\s+\d\d:\d\d:\d\d").Groups[0].Value : null;
    await bot.MuteGuildAsync(e.GuildId, timsTamp != null ? new MuteTime(timsTamp) : new MuteTime(delaySecond));
    await sender.SendMessageAsync(e.ChannelId, new MessageToCreate()
    {
        Content = $"{e.Author.UserName} 已启用全员禁言{(timsTamp != null ? ",解除时间:" + timsTamp : timeDelay.ToString() + timeType)}",
        MsgId = e.Id
    });
});
// 指令格式:@机器人 解除全体禁言
bot.AddCommandSuper("解除全员禁言", async (sender, e, msg) =>
{
    await bot.MuteGuildAsync(e.GuildId, new MuteTime(0));
    await sender.SendMessageAsync(e.ChannelId, new MessageToCreate($"已解除全员禁言", e.Id));
});

Ark模板消息构建方法

注:模板消息的构造支持多种方式,以下尽量展示了不同的构造方式,也可以混合使用各种构造方式。
bot.AddCommand("testArk", async (sender, e, msg) =>
{
    // Ark23测试通过
    await sender.SendMessageAsync(e.ChannelId, new MsgArk23(e.Id)
        .SetDesc("描述")
        .SetPrompt("提示消息")
        .AddLine("第一行内容")
        .AddLine("第二行内容")
        .AddLine("百度")
        .AddLine("淘宝")
        .AddLine("腾讯")
        .AddLine("微软")
        .AddLine("最后一行"));

    // Ark24测试通过
    await sender.SendMessageAsync(e.ChannelId, new MsgArk24()
        .SetReplyMsgId(e.Id)
        .SetDesc("描述")
        .SetPrompt("提示")
        .SetTitle("标题")
        .SetMetaDesc("详情")
        .SetImage("")
        .SetLink("")
        .SetSubTitle("子标题"));

    // Ark34测试通过
    await sender.SendMessageAsync(e.ChannelId, new MsgArk34()
    {
        MsgId = e.Id,
        Desc = "描述",
        Prompt = "提示",
        MetaTitle = "标题",
        MetaDesc = "详情",
        MetaIcon = "",
        MetaPreview = "",
        MetaUrl = ""
    });

    // Ark37测试通过
    await sender.SendMessageAsync(e.ChannelId, new MsgArk37(e.Id, "提示", "标题", "子标题"));
});
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net6.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.6.2 578 3/4/2022
1.6.1 421 2/19/2022
1.6.0 430 1/30/2022
1.5.4 464 1/22/2022
1.5.3 423 1/21/2022
1.5.2 458 1/20/2022
1.5.1 465 1/18/2022
1.5.0 466 1/18/2022
1.4.2 436 1/16/2022
1.4.1 463 1/14/2022
1.4.0 423 1/13/2022
1.3.9 431 1/12/2022
1.3.8 440 1/11/2022
1.3.7 279 1/10/2022
1.3.6 298 1/10/2022
1.3.5 256 1/9/2022
1.3.4 250 1/8/2022
1.3.3 253 1/6/2022
1.3.2 271 1/4/2022
1.3.1 260 1/3/2022
1.3.0 283 1/2/2022
1.2.9 255 1/2/2022
1.2.8 260 1/1/2022
1.2.7 275 12/31/2021
1.2.6 258 12/30/2021
1.2.5 253 12/30/2021
1.2.4 259 12/30/2021
1.2.3 229 12/29/2021
1.2.2 255 12/28/2021
1.2.1 253 12/28/2021
1.2.0 260 12/27/2021
1.1.3 249 12/26/2021
1.1.2 267 12/26/2021
1.1.1 250 12/26/2021
1.1.0 268 12/24/2021
1.0.9 307 12/24/2021
1.0.8 244 12/23/2021
1.0.7 258 12/23/2021
1.0.6 250 12/23/2021
1.0.5 257 12/23/2021
1.0.4 252 12/22/2021
1.0.3 272 12/22/2021
1.0.2 271 12/21/2021
1.0.1 269 12/20/2021
1.0.0 237 12/20/2021

新增Ark37消息模板;重构消息模板构建方式,更方便更多样化。