Skip to content

Commit

Permalink
feat: add member change function impl
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuisyuu committed Jul 22, 2024
1 parent 2f33cf4 commit bcb4d13
Show file tree
Hide file tree
Showing 13 changed files with 224 additions and 13 deletions.
9 changes: 9 additions & 0 deletions src/Bot/BotInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public sealed class BotInstance(Config config)

public static event AsyncEventHandler<MessageReceivedEventArgs>? MessageReceived;
public static event AsyncEventHandler<PokedEventArgs>? Poked;
public static event AsyncEventHandler<MembersAddedEventArgs>? MembersAdded;
public static event AsyncEventHandler<MembersLeftEventArgs>? MembersLeft;

private static void RegisterFunctions()
{
Expand All @@ -21,6 +23,7 @@ private static void RegisterFunctions()
EatBreak eatBreak = new();
Repeater repeater = new();
Poke poke = new();
MemberChange memberChange = new();

loveYou.Register();
wannaCao.Register();
Expand All @@ -29,13 +32,19 @@ private static void RegisterFunctions()
eatBreak.Register();
repeater.Register();
poke.Register();
memberChange.Register();
}

private void RegisterEvents()
{
_qqBot.MessageReceived += MessageReceived;
_qqBot.Poked += Poked;
_qqBot.MembersAdded += MembersAdded;
_qqBot.MembersLeft += MembersLeft;

_tgBot.MessageReceived += MessageReceived;
_tgBot.MembersAdded += MembersAdded;
_tgBot.MembersLeft += MembersLeft;
}

public async Task RunAsync()
Expand Down
51 changes: 51 additions & 0 deletions src/Bot/EventArg/MembersAddedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using DXKumaBot.Bot.Message;
using Lagrange.Core.Event.EventArg;

namespace DXKumaBot.Bot.EventArg;

public class MembersAddedEventArgs : EventArgs
{
private readonly IBot _bot;

public MembersAddedEventArgs(IBot bot, GroupMemberIncreaseEvent message)
{
_bot = bot;
QqMessage = message;
SourceType = MessageSource.Qq;
}

public MembersAddedEventArgs(IBot bot, TgMessage message)
{
_bot = bot;
TgMessage = message;
SourceType = MessageSource.Telegram;
}

public MessageSource SourceType { get; }
public TgMessage? TgMessage { get; }
public GroupMemberIncreaseEvent? QqMessage { get; }

public string UserName => SourceType switch
{
MessageSource.Qq => ((QqBot)_bot).GetUserInfo(QqMessage!.MemberUin).Result!.Nickname,
MessageSource.Telegram => throw new NotSupportedException(),
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
};

public long UserId => SourceType switch
{
MessageSource.Qq => QqMessage!.GroupUin,
MessageSource.Telegram => throw new NotSupportedException(),
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
};

public async Task Reply(MessagePair messages)
{
await _bot.SendMessageAsync(messages, SourceType switch
{
MessageSource.Qq => QqMessage!.GroupUin,
MessageSource.Telegram => TgMessage!.Chat.Id,
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
}, SourceType is MessageSource.Telegram ? TgMessage : default);
}
}
51 changes: 51 additions & 0 deletions src/Bot/EventArg/MembersLeftEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using DXKumaBot.Bot.Message;
using Lagrange.Core.Event.EventArg;

namespace DXKumaBot.Bot.EventArg;

public class MembersLeftEventArgs : EventArgs
{
private readonly IBot _bot;

public MembersLeftEventArgs(IBot bot, GroupMemberDecreaseEvent message)
{
_bot = bot;
QqMessage = message;
SourceType = MessageSource.Qq;
}

public MembersLeftEventArgs(IBot bot, TgMessage message)
{
_bot = bot;
TgMessage = message;
SourceType = MessageSource.Telegram;
}

public MessageSource SourceType { get; }
public TgMessage? TgMessage { get; }
public GroupMemberDecreaseEvent? QqMessage { get; }

public string UserName => SourceType switch
{
MessageSource.Qq => ((QqBot)_bot).GetUserInfo(QqMessage!.MemberUin).Result!.Nickname,
MessageSource.Telegram => $"{TgMessage!.LeftChatMember!.FirstName}{TgMessage!.LeftChatMember!.LastName}",
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
};

public string UserId => SourceType switch
{
MessageSource.Qq => QqMessage!.MemberUin.ToString(),
MessageSource.Telegram => TgMessage!.LeftChatMember!.Username,
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
} ?? throw new NullReferenceException();

public async Task Reply(MessagePair messages)
{
await _bot.SendMessageAsync(messages, SourceType switch
{
MessageSource.Qq => QqMessage!.GroupUin,
MessageSource.Telegram => TgMessage!.Chat.Id,
_ => throw new ArgumentOutOfRangeException(nameof(SourceType), SourceType, null)
}, SourceType is MessageSource.Telegram ? TgMessage : default);
}
}
1 change: 0 additions & 1 deletion src/Bot/EventArg/MessageRecivedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using DXKumaBot.Bot.Message;
using Lagrange.Core.Event.EventArg;
using TgMessage = Telegram.Bot.Types.Message;

namespace DXKumaBot.Bot.EventArg;

Expand Down
2 changes: 1 addition & 1 deletion src/Bot/IBot.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using DXKumaBot.Bot.Message;
using TgMessage = Telegram.Bot.Types.Message;

namespace DXKumaBot.Bot;

public interface IBot
{
Task SendMessageAsync(MessagePair messages, BotMessage source, bool noReply);
Task SendMessageAsync(MessagePair messages, long id, TgMessage? msg);
}
1 change: 0 additions & 1 deletion src/Bot/Message/BotMessage.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Lagrange.Core.Message;
using TgMessage = Telegram.Bot.Types.Message;

namespace DXKumaBot.Bot.Message;

Expand Down
33 changes: 32 additions & 1 deletion src/Bot/QQBot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using DXKumaBot.Utils;
using Lagrange.Core;
using Lagrange.Core.Common;
using Lagrange.Core.Common.Entity;
using Lagrange.Core.Common.Interface;
using Lagrange.Core.Common.Interface.Api;
using Lagrange.Core.Message;
Expand All @@ -29,9 +30,15 @@ await SendMessageAsync(Convert.ToUInt32(source.ChatId), messages.Text!, messages
noReply ? default : source.QqMessage);
}

public event AsyncEventHandler<MessageReceivedEventArgs>? MessageReceived;
public async Task SendMessageAsync(MessagePair messages, long id, TgMessage? _)
{
await SendMessageAsync(Convert.ToUInt32(id), messages.Text!, messages.Media);
}

public event AsyncEventHandler<MessageReceivedEventArgs>? MessageReceived;
public event AsyncEventHandler<PokedEventArgs>? Poked;
public event AsyncEventHandler<MembersAddedEventArgs>? MembersAdded;
public event AsyncEventHandler<MembersLeftEventArgs>? MembersLeft;

private void RegisterEvents()
{
Expand Down Expand Up @@ -59,6 +66,24 @@ private void RegisterEvents()
await Poked.Invoke(sender, new(this, args));
};
_bot.Invoker.OnGroupMemberIncreaseEvent += async (sender, args) =>
{
if (MembersAdded is null)
{
return;
}
await MembersAdded.Invoke(sender, new(this, args));
};
_bot.Invoker.OnGroupMemberDecreaseEvent += async (sender, args) =>
{
if (MembersLeft is null)
{
return;
}
await MembersLeft.Invoke(sender, new(this, args));
};
}

public async Task RunAsync()
Expand All @@ -81,6 +106,12 @@ public async Task RunAsync()
await _bot.LoginByPassword();
}


public async Task<BotUserInfo?> GetUserInfo(uint userId)
{
return await _bot.FetchUserInfo(userId);
}

private static BotDeviceInfo GetDeviceInfo()
{
if (!File.Exists("DeviceInfo.json"))
Expand Down
40 changes: 34 additions & 6 deletions src/Bot/TgBot.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
global using TgMessage = Telegram.Bot.Types.Message;
using DXKumaBot.Bot.EventArg;
using DXKumaBot.Bot.Message;
using System.Net;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using File = System.IO.File;
using TgMessage = Telegram.Bot.Types.Message;

namespace DXKumaBot.Bot;

Expand All @@ -20,20 +20,48 @@ await SendMessageAsync(source.ChatId, messages, source.TgMessage?.MessageThreadI
noReply ? default : source.TgMessage);
}

public async Task SendMessageAsync(MessagePair messages, long id, TgMessage? msg)
{
await SendMessageAsync(id, messages, msg!.MessageThreadId, msg);
}

public event Utils.AsyncEventHandler<MessageReceivedEventArgs>? MessageReceived;
public event Utils.AsyncEventHandler<MembersAddedEventArgs>? MembersAdded;
public event Utils.AsyncEventHandler<MembersLeftEventArgs>? MembersLeft;

public void Run()
{
_bot.StartReceiving(async (bot, update, _) =>
{
if (update is not { Type: UpdateType.Message, Message: { Type: MessageType.Text, Text: not null } } ||
MessageReceived is null)
if (update is { Type: UpdateType.Message, Message: { Type: MessageType.Text, Text: not null } } &&
MessageReceived is not null)
{
return;
await MessageReceived.Invoke(bot, new(this, update.Message));
}
await MessageReceived.Invoke(bot, new(this, update.Message));
}, (_, e, _) => { Console.WriteLine(e); });
if (update is
{
Type: UpdateType.Message, Message: { Type: MessageType.ChatMembersAdded, NewChatMembers: not null }
} &&
MembersAdded is not null)
{
await MembersAdded.Invoke(bot, new(this, update.Message));
}
if (update is
{
Type: UpdateType.Message, Message: { Type: MessageType.ChatMemberLeft, LeftChatMember: not null }
} &&
MembersLeft is not null)
{
await MembersLeft.Invoke(bot, new(this, update.Message));
}
}, (_, e, _) =>
{
#if DEBUG
Console.WriteLine(e);
#endif
});
}

private async Task SendMessageAsync(long id, MessagePair messages, int? threadId = null, TgMessage? source = null)
Expand Down
6 changes: 6 additions & 0 deletions src/Functions/IFunction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace DXKumaBot.Functions;

public interface IFunction
{
void Register();
}
37 changes: 37 additions & 0 deletions src/Functions/MemberChange.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using DXKumaBot.Bot;
using DXKumaBot.Bot.Message;
using Telegram.Bot.Types;

namespace DXKumaBot.Functions;

public sealed class MemberChange : IFunction
{
private const int SpecialGroup = 967611986;

public void Register()
{
BotInstance.MembersAdded += async (_, args) =>
{
if (args.SourceType is MessageSource.Qq)
{
await args.Reply(new(args.QqMessage!.GroupUin is SpecialGroup
? $"恭喜{args.UserName}{args.UserId})发现了迪拉熊宝藏地带,发送dlxhelp试一下吧~"
: $"欢迎{args.UserName}{args.UserId})加入本群,发送dlxhelp和迪拉熊一起玩吧~"));
}
if (args.SourceType is MessageSource.Telegram)
{
foreach (User user in args.TgMessage!.NewChatMembers!)
{
await args.Reply(new($"欢迎{user.FirstName}{user.LastName}{user.Username})加入本群,发送dlxhelp和迪拉熊一起玩吧~"));
}
}
};
BotInstance.MembersLeft += async (_, args) =>
{
await args.Reply(new(args.SourceType is MessageSource.Qq && args.QqMessage!.GroupUin is SpecialGroup
? $"很遗憾,{args.UserName}{args.UserId})离开了迪拉熊的小窝QAQ"
: $"{args.UserName}{(string.IsNullOrEmpty(args.UserId) ? $"{args.UserId}" : string.Empty)}离开了迪拉熊QAQ"));
};
}
}
2 changes: 1 addition & 1 deletion src/Functions/Poke.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace DXKumaBot.Functions;

public sealed class Poke
public sealed class Poke : IFunction
{
private readonly string[] _replies =
[
Expand Down
2 changes: 1 addition & 1 deletion src/Functions/RegexFunctionBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace DXKumaBot.Functions;

public abstract class RegexFunctionBase
public abstract class RegexFunctionBase : IFunction
{
public void Register()
{
Expand Down
2 changes: 1 addition & 1 deletion src/Functions/Repeater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace DXKumaBot.Functions;

public sealed class Repeater
public sealed class Repeater : IFunction
{
private readonly ConcurrentDictionary<long, (string, int)> _lastMessages = new();

Expand Down

0 comments on commit bcb4d13

Please sign in to comment.