Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Deliay committed Dec 30, 2024
1 parent ac4e12d commit c26f80b
Show file tree
Hide file tree
Showing 12 changed files with 1,719 additions and 91 deletions.
16 changes: 6 additions & 10 deletions Mikibot.Analyze/Bot/RandomImage/RandomImageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,14 @@ public class RandomImageService(IMiraiService miraiService, ILogger<RandomImageS
{
protected override async ValueTask Process(GroupMessageReceiver message, CancellationToken token = default)
{

if (message.GroupId == "650042418")
foreach (var raw in message.MessageChain)
{
foreach (var raw in message.MessageChain)
if (raw is PlainMessage plain && plain.Text == "来张毬图")
{
if (raw is PlainMessage plain && plain.Text == "来张")
{
await MiraiService.SendMessageToSomeGroup([message.GroupId], token,
[
new ImageMessage() { Url = "https://nas.drakb.me/GetAkumariaEmotion/getEmotion/" }
]);
}
await MiraiService.SendMessageToGroup(message.Sender.Group, token,
[
new ImageMessage() { Url = "https://nas.drakb.me/GetAkumariaEmotion/getEmotion/" }
]);
}
}
}
Expand Down
8 changes: 7 additions & 1 deletion Mikibot.Analyze/Mikibot.Analyze.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
<PackageReference Include="NPOI" Version="2.7.2" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
<PackageReference Include="Polly" Version="8.5.0" />
<PackageReference Include="Mirai.Net" Version="2.5.2" />
<PackageReference Include="Autofac" Version="8.2.0" />
Expand All @@ -28,6 +27,7 @@
<PackageReference Include="FFMpegCore" Version="5.1.0" />
<PackageReference Include="Mikibot.Crawler" Version="1.0.5" />
<PackageReference Include="Lagrange.Core" Version="0.3.1" />
<PackageReference Include="SatoriClient-ZeroAshUpdated" Version="1.0.0-alpha.1" />
</ItemGroup>

<ItemGroup>
Expand All @@ -51,6 +51,12 @@
<None Include="Notification\Deprecated\DanmakuSpeedStatisticService.cs" />
<Compile Remove="Service\Deprecated\LiveStreamEventService.cs" />
<None Include="Service\Deprecated\LiveStreamEventService.cs" />
<Compile Remove="Notification\Deprecated\DanmakuCollectorService.cs" />
<None Include="Notification\Deprecated\DanmakuCollectorService.cs" />
<Compile Remove="Notification\Deprecated\DanmakuExportGuardList.cs" />
<None Include="Notification\Deprecated\DanmakuExportGuardList.cs" />
<Compile Remove="Notification\Deprecated\DanmakuRecordControlService.cs" />
<None Include="Notification\Deprecated\DanmakuRecordControlService.cs" />
</ItemGroup>

</Project>
9 changes: 7 additions & 2 deletions Mikibot.Analyze/MiraiHttp/IMiraiService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ namespace Mikibot.Analyze.MiraiHttp
public interface IMiraiService
{
ValueTask Run();
ValueTask SendMessageToAllGroup(CancellationToken token, params MessageBase[] messages);
ValueTask SendMessageToGroup(Group group, CancellationToken token, params MessageBase[] messages);
ValueTask SendMessageToSliceManGroup(CancellationToken token, params MessageBase[] messages);
public void SubscribeMessage(Action<GroupMessageReceiver> next, CancellationToken token);


[Obsolete("Will be removed in future version")]
ValueTask SendMessageToSomeGroup(HashSet<string> groupIds, CancellationToken token, params MessageBase[] messages);
[Obsolete("Will be removed in future version")]
ValueTask SendMessageToSliceManGroup(CancellationToken token, params MessageBase[] messages);
[Obsolete("Will be removed in future version")]
ValueTask SendMessageToAllGroup(CancellationToken token, params MessageBase[] messages);
}
}
148 changes: 148 additions & 0 deletions Mikibot.Analyze/MiraiHttp/SatoriBotBridge.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
using Microsoft.Extensions.Logging;
using Mirai.Net.Data.Messages;
using Mirai.Net.Data.Messages.Concretes;
using Mirai.Net.Data.Messages.Receivers;
using Mirai.Net.Data.Shared;
using Satori.Client;
using Satori.Client.Extensions;
using Satori.Protocol.Elements;
using Satori.Protocol.Events;

namespace Mikibot.Analyze.MiraiHttp;

public class SatoriBotBridge(ILogger<SatoriBotBridge> logger) : IDisposable, IMiraiService
{
private static readonly string EnvSatoriEndpoint
= Environment.GetEnvironmentVariable("ENV_SATORI_ENDPOINT") ?? "http://localhost:5500";

private static readonly string EnvSatoriToken
= Environment.GetEnvironmentVariable("ENV_SATORI_TOKEN") ?? "";

private static Element? ConvertSingleMessageElementToSatori(MessageBase message)
{
return message switch
{
PlainMessage plain => new TextElement() { Text = plain.Text, },
ImageMessage { Url.Length: > 0 } image => new ImageElement() { Src = image.Url, },
ImageMessage { Base64.Length: > 0 } image => new ImageElement() { Src = $"blob://{image.Base64}" },
ImageMessage { Path.Length: > 0 } image => new ImageElement() { Src = $"file://{image.Path}" },
VoiceMessage { Url.Length: > 0 } image => new AudioElement() { Src = image.Url, },
VoiceMessage { Base64.Length: > 0 } image => new AudioElement() { Src = $"blob://{image.Base64}" },
VoiceMessage { Path.Length: > 0 } image => new AudioElement() { Src = $"file://{image.Path}" },
_ => null
};
}

private static IEnumerable<Element> ConvertMessageToSatori(IEnumerable<MessageBase> messageChain)
{
return messageChain
.Select(ConvertSingleMessageElementToSatori)
.OfType<Element>();
}

private static MessageBase? ConvertSingleMessageElementToSatori(Element message)
{
return message switch
{
TextElement plain => new PlainMessage() { Text = plain.Text, },
_ => null
};
}
private static IEnumerable<MessageBase> ConvertMessageToMirai(IEnumerable<Element> messages)
{
return messages
.Select(ConvertSingleMessageElementToSatori)
.OfType<MessageBase>();
}

public async ValueTask SendMessageToGroup(Group group, CancellationToken token, params MessageBase[] messages)
{
ArgumentNullException.ThrowIfNull(Bot);

await Bot.CreateMessageAsync(group.Id, ConvertMessageToSatori(messages));
}

private readonly Dictionary<Action<GroupMessageReceiver>, CancellationTokenRegistration> _subscriber = [];
public void SubscribeMessage(Action<GroupMessageReceiver> next, CancellationToken token)
{
logger.LogInformation("注册消费消息: {}", next);
_subscriber.Add(next, token.Register(() =>
{
_subscriber.TryGetValue(next, out var reg);
using var regDispose = reg;
_subscriber.Remove(next);
}));
}

private SatoriClient? Client { get; set; }
private SatoriBot? Bot { get; set; }
public async ValueTask Run()
{
Client = new SatoriClient(EnvSatoriEndpoint, EnvSatoriToken);

Bot = await Client.GetBotAsync();

Bot.MessageCreated += BotOnMessageCreated;
_ = Client.StartAsync();
}

private void BotOnMessageCreated(object? sender, Event e)
{
if (e.Message is not { User: not null, Channel: not null }) return;

var group = e.Message.Channel is not null
? new Group()
{
Id = e.Message.Channel.Id,
Name = e.Message.Channel.Name,
Permission = Permissions.Member,
} : null;
var member = new Member()
{
Id = e.Message.User.Id,
Name = e.Message.User.Name,
Group = group,
};
var type = e.Channel is not null
? MessageReceivers.Group
: MessageReceivers.Friend;

var elements = ElementSerializer.Deserialize(e.Message.Content);
var message = new MessageChain(ConvertMessageToMirai(elements));

foreach (var (next, _) in _subscriber)
{
next(new GroupMessageReceiver()
{
Type = type,
Sender = member,
MessageChain = message,
});
}
}

public void Dispose()
{
Client?.Dispose();
}

public async ValueTask SendMessageToSomeGroup(HashSet<string> groupIds, CancellationToken token, params MessageBase[] messages)
{
ArgumentNullException.ThrowIfNull(Bot);

var elements = ConvertMessageToSatori(messages).ToList();
foreach (var groupId in groupIds)
{
await Bot.CreateMessageAsync(groupId, elements);
}
}

public ValueTask SendMessageToAllGroup(CancellationToken token, params MessageBase[] messages)
{
throw new NotImplementedException();
}
public ValueTask SendMessageToSliceManGroup(CancellationToken token, params MessageBase[] messages)
{
throw new NotImplementedException();
}
}
45 changes: 22 additions & 23 deletions Mikibot.Analyze/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@
appBuilder.RegisterType<MikibotDatabaseContext>().AsSelf().InstancePerDependency();

appBuilder.Register((_) => MiraiBotConfig.FromEnviroment());
#if DEBUG
appBuilder.RegisterType<ConsoleMiraiService>().As<IMiraiService>().SingleInstance();
appBuilder.RegisterType<LocalOssService>().As<IOssService>().SingleInstance();
// appBuilder.RegisterType<ConsoleEmailService>().As<IEmailService>().SingleInstance();
appBuilder.RegisterType<LagrangeBotBridge>().As<IMiraiService>().SingleInstance();
#else
appBuilder.RegisterType<LagrangeBotBridge>().As<IMiraiService>().SingleInstance();
// #if DEBUG
// appBuilder.RegisterType<ConsoleMiraiService>().As<IMiraiService>().SingleInstance();
// appBuilder.RegisterType<LocalOssService>().As<IOssService>().SingleInstance();
// // appBuilder.RegisterType<ConsoleEmailService>().As<IEmailService>().SingleInstance();
// // appBuilder.RegisterType<LagrangeBotBridge>().As<IMiraiService>().SingleInstance();
// #else
// appBuilder.RegisterType<LagrangeBotBridge>().As<IMiraiService>().SingleInstance();
// appBuilder.RegisterType<MiraiService>().As<IMiraiService>().SingleInstance();
appBuilder.RegisterType<LocalOssService>().As<IOssService>().SingleInstance();
appBuilder.RegisterType<ConsoleEmailService>().As<IEmailService>().SingleInstance();
#endif
appBuilder.RegisterType<SatoriBotBridge>().As<IMiraiService>().SingleInstance();
// appBuilder.RegisterType<LocalOssService>().As<IOssService>().SingleInstance();
// appBuilder.RegisterType<ConsoleEmailService>().As<IEmailService>().SingleInstance();
// #endif

// appBuilder.RegisterType<LiveStreamEventService>().AsSelf().SingleInstance();

Expand All @@ -38,13 +39,13 @@
// appBuilder.RegisterType<DanmakuCollectorService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<DanmakuRecordControlService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<DanmakuExportGuardList>().AsSelf().SingleInstance();
appBuilder.RegisterType<MikiDanmakuProxyService>().AsSelf().SingleInstance();
appBuilder.RegisterType<MikiLiveEventProxyService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<MikiDanmakuProxyService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<MikiLiveEventProxyService>().AsSelf().SingleInstance();

appBuilder.RegisterType<BiliBiliVideoLinkShareProxyService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<AntiBoyFriendFanVoiceService>().AsSelf().SingleInstance();
//appBuilder.RegisterType<AiImageGenerationService>().AsSelf().SingleInstance();
appBuilder.RegisterType<AiVoiceGenerationService>().AsSelf().SingleInstance();
// appBuilder.RegisterType<AiVoiceGenerationService>().AsSelf().SingleInstance();
appBuilder.RegisterType<RandomImageService>().AsSelf().SingleInstance();
appBuilder.RegisterType<OptionaSelectorService>().AsSelf().SingleInstance();
appBuilder.RegisterType<PingtiItemReplaceService>().AsSelf().SingleInstance();
Expand All @@ -66,10 +67,8 @@
logger.LogInformation("Done");

var mirai = app.Resolve<IMiraiService>();
logger.LogInformation("Intiializing mirai service...");
logger.LogInformation("Initializing mirai service...");
await mirai.Run();
logger.LogInformation("Done");


var statusCrawler = app.Resolve<LiveStatusCrawlService>();
var followerStat = app.Resolve<DailyFollowerStatisticService>();
Expand All @@ -79,11 +78,11 @@
// var danmakuCrawler = app.Resolve<DanmakuCollectorService>();
// var danmakuExportGuard = app.Resolve<DanmakuExportGuardList>();

var aiVoice = app.Resolve<AiVoiceGenerationService>();
// var aiVoice = app.Resolve<AiVoiceGenerationService>();
//var aiImage = app.Resolve<AiImageGenerationService>();
var bffAnti = app.Resolve<AntiBoyFriendFanVoiceService>();
var mxmkDanmakuProxy = app.Resolve<MikiDanmakuProxyService>();
var mxmkLiveEventProxy = app.Resolve<MikiLiveEventProxyService>();
// var bffAnti = app.Resolve<AntiBoyFriendFanVoiceService>();
// var mxmkDanmakuProxy = app.Resolve<MikiDanmakuProxyService>();
// var mxmkLiveEventProxy = app.Resolve<MikiLiveEventProxyService>();
var biliParser = app.Resolve<BiliBiliVideoLinkShareProxyService>();
var randomImage = app.Resolve<RandomImageService>();
var optionaSelector = app.Resolve<OptionaSelectorService>();
Expand All @@ -102,12 +101,12 @@ await Task.WhenAll(
statusCrawler.Run(token),
followerStat.Run(token),
// eventService.Run(token),
bffAnti.Run(token),
// bffAnti.Run(token),
biliParser.Run(token),
randomImage.Run(token),
//aiImage.Run(token),
aiVoice.Run(token),
// aiVoice.Run(token),
optionaSelector.Run(token),
// pingti.Run(token),
pingti.Run(token)
]);
}
Loading

0 comments on commit c26f80b

Please sign in to comment.