Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[All] AiRecord #670

Merged
merged 12 commits into from
Nov 3, 2024
32 changes: 32 additions & 0 deletions Lagrange.Core/Common/Entity/AiCharacter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
namespace Lagrange.Core.Common.Entity;

[Serializable]
public class AiCharacter
{
public string VoiceId { get; set; }

public string CharacterName { get; set; }

public string CharacterVoiceUrl { get; set; }

public AiCharacter(string voiceId, string characterName, string characterVoiceUrl)
{
VoiceId = voiceId;
CharacterName = characterName;
CharacterVoiceUrl = characterVoiceUrl;
}
}

[Serializable]
public class AiCharacterList
{
public string Type { get; set; }

public List<AiCharacter> Characters { get; set; }

public AiCharacterList(string type, List<AiCharacter> characters)
{
Type = type;
Characters = characters;
}
}
29 changes: 20 additions & 9 deletions Lagrange.Core/Common/Interface/Api/OperationExt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@ public static Task<BotGroupClockInResult> GroupClockIn(this BotContext bot, uint
public static Task<bool> MarkAsRead(this BotContext bot, MessageChain targetChain)
{
uint timestamp = (uint)(targetChain.Time - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
return bot.ContextCollection.Business.OperationLogic.MarkAsRead(targetChain.GroupUin ?? 0, targetChain.Uid, targetChain.Sequence, timestamp);
return bot.ContextCollection.Business.OperationLogic.MarkAsRead(targetChain.GroupUin ?? 0, targetChain.Uid,
targetChain.Sequence, timestamp);
}

public static Task<bool> UploadFriendFile(this BotContext bot, uint targetUin, FileEntity fileEntity)
Expand Down Expand Up @@ -241,7 +242,7 @@ public static Task<MessageResult> FriendShake(this BotContext bot, uint friendUi

public static Task<List<string>?> FetchMarketFaceKey(this BotContext bot, List<string> faceIds)
=> bot.ContextCollection.Business.OperationLogic.FetchMarketFaceKey(faceIds);

/// <summary>
/// Set the avatar of the bot itself
/// </summary>
Expand All @@ -252,22 +253,32 @@ public static Task<bool> SetAvatar(this BotContext bot, ImageEntity avatar)

public static Task<bool> FetchSuperFaceId(this BotContext bot, uint id)
=> bot.ContextCollection.Business.OperationLogic.FetchSuperFaceId(id);

public static Task<SysFaceEntry?> FetchFaceEntity(this BotContext bot, uint id)
=> bot.ContextCollection.Business.OperationLogic.FetchFaceEntity(id);

public static Task<bool> GroupJoinEmojiChain(this BotContext bot, uint groupUin, uint emojiId, uint targetMessageSeq)
=> bot.ContextCollection.Business.OperationLogic.GroupJoinEmojiChain(groupUin, emojiId, targetMessageSeq);

public static Task<bool> FriendJoinEmojiChain(this BotContext bot, uint friendUin, uint emojiId, uint targetMessageSeq)
public static Task<bool> FriendJoinEmojiChain(this BotContext bot, uint friendUin, uint emojiId,
uint targetMessageSeq)
=> bot.ContextCollection.Business.OperationLogic.FriendJoinEmojiChain(friendUin, emojiId, targetMessageSeq);

public static Task<string> UploadImage(this BotContext bot, ImageEntity entity)
=> bot.ContextCollection.Business.OperationLogic.UploadImage(entity);

public static Task<ImageOcrResult?> OcrImage(this BotContext bot, string url)
=> bot.ContextCollection.Business.OperationLogic.ImageOcr(url);

public static Task<ImageOcrResult?> OcrImage(this BotContext bot, ImageEntity entity)
=> bot.ContextCollection.Business.OperationLogic.ImageOcr(entity);
}

public static Task<(int Code, string ErrMsg, string? Url)> GetGroupGenerateAiRecordUrl(this BotContext bot, uint groupUin, string character, string text)
=> bot.ContextCollection.Business.OperationLogic.GetGroupGenerateAiRecordUrl(groupUin, character, text);

public static Task<(int Code, string ErrMsg, RecordEntity? RecordEntity)> GetGroupGenerateAiRecord(this BotContext bot, uint groupUin, string character, string text)
=> bot.ContextCollection.Business.OperationLogic.GetGroupGenerateAiRecord(groupUin, character, text);

public static Task<(int Code, string ErrMsg, List<AiCharacterList>? Result)> GetAiCharacters(this BotContext bot, uint chatType, uint groupUin = 42)
=> bot.ContextCollection.Business.OperationLogic.GetAiCharacters(chatType, groupUin);
}
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ public async Task<List<IBotFSEntry>> FetchGroupFSList(uint groupUin, string targ
if (((GroupFSListEvent)events[0]).IsEnd) break;
startIndex += 20;
}

return entries;
}

Expand Down Expand Up @@ -350,7 +351,8 @@ public async Task<bool> RecallFriendMessage(MessageChain chain)

foreach (var result in resolved)
{
var uins = await Task.WhenAll(ResolveUid(result.InvitorMemberUid), ResolveUid(result.TargetMemberUid), ResolveUid(result.OperatorUid));
var uins = await Task.WhenAll(ResolveUid(result.InvitorMemberUid), ResolveUid(result.TargetMemberUid),
ResolveUid(result.OperatorUid));
uint invitorUin = uins[0];
uint targetUin = uins[1];
uint operatorUin = uins[2];
Expand Down Expand Up @@ -664,7 +666,8 @@ public async Task<bool> SetAvatar(ImageEntity avatar)

var ticket = ((HighwayUrlEvent)highwayUrlResults[0]).SigSession;
var md5 = avatar.ImageStream.Value.Md5().UnHex();
return await Collection.Highway.UploadSrcByStreamAsync(90, avatar.ImageStream.Value, ticket, md5, Array.Empty<byte>());
return await Collection.Highway.UploadSrcByStreamAsync(90, avatar.ImageStream.Value, ticket, md5,
Array.Empty<byte>());
}

public async Task<bool> GroupSetAvatar(uint groupUin, ImageEntity avatar)
Expand Down Expand Up @@ -697,18 +700,20 @@ public async Task<bool> GroupSetAvatar(uint groupUin, ImageEntity avatar)
var ret = (FetchGroupAtAllRemainEvent)results[0];
return (ret.RemainAtAllCountForUin, ret.RemainAtAllCountForGroup);
}

public async Task<bool> FetchSuperFaceId(uint id) => await Collection.Business.CachingLogic.GetCachedIsSuperFaceId(id);

public async Task<SysFaceEntry?> FetchFaceEntity(uint id) => await Collection.Business.CachingLogic.GetCachedFaceEntity(id);

public async Task<bool> FetchSuperFaceId(uint id) =>
await Collection.Business.CachingLogic.GetCachedIsSuperFaceId(id);

public async Task<SysFaceEntry?> FetchFaceEntity(uint id) =>
await Collection.Business.CachingLogic.GetCachedFaceEntity(id);

public async Task<bool> GroupJoinEmojiChain(uint groupUin, uint emojiId, uint targetMessageSeq)
{
var groupJoinEmojiChainEvent = GroupJoinEmojiChainEvent.Create(targetMessageSeq, emojiId, groupUin);
var results = await Collection.Business.SendEvent(groupJoinEmojiChainEvent);
return results.Count != 0 && results[0].ResultCode == 0;
}

public async Task<bool> FriendJoinEmojiChain(uint friendUin, uint emojiId, uint targetMessageSeq)
{
string? friendUid = await Collection.Business.CachingLogic.ResolveUid(null, friendUin);
Expand All @@ -717,7 +722,59 @@ public async Task<bool> FriendJoinEmojiChain(uint friendUin, uint emojiId, uint
var results = await Collection.Business.SendEvent(friendJoinEmojiChainEvent);
return results.Count != 0 && results[0].ResultCode == 0;
}


public async Task<(int Code, string ErrMsg, string? Url)> GetGroupGenerateAiRecordUrl(uint groupUin, string character, string text)
{
var (code, errMsg, record) = await GetGroupGenerateAiRecord(groupUin, character, text);
if (code != 0)
return (code, errMsg, null);

var recordGroupDownloadEvent = RecordGroupDownloadEvent.Create(groupUin, record!.MsgInfo!);
var @event = await Collection.Business.SendEvent(recordGroupDownloadEvent);
if (@event.Count == 0) return (-1, "running event missing!", null);

var finalResult = (RecordGroupDownloadEvent)@event[0];
return finalResult.ResultCode == 0
? (finalResult.ResultCode, string.Empty, finalResult.AudioUrl)
: (finalResult.ResultCode, "Failed to get group ai record", null);
}

public async Task<(int Code, string ErrMsg, RecordEntity? Record)> GetGroupGenerateAiRecord(uint groupUin, string character, string text)
{
var groupAiRecordEvent = GroupAiRecordEvent.Create(groupUin, character, text);
while (true)
{
var results = await Collection.Business.SendEvent(groupAiRecordEvent);
if (results.Count == 0) return (-1, "running event missing!", null);
var aiRecordResult = (GroupAiRecordEvent)results[0];
if (aiRecordResult.ResultCode != 0)
return (aiRecordResult.ResultCode, aiRecordResult.ErrorMessage, null);
if (aiRecordResult.RecordInfo is not null)
{
var index = aiRecordResult.RecordInfo!.MsgInfoBody[0].Index;
return (aiRecordResult.ResultCode, string.Empty, new RecordEntity(index.FileUuid, index.Info.FileName, index.Info.FileHash.UnHex())
{
AudioLength = (int)index.Info.Time,
FileSha1 = index.Info.FileSha1,
MsgInfo = aiRecordResult.RecordInfo
});
}
}

}

public async Task<(int Code, string ErrMsg, List<AiCharacterList>? Result)> GetAiCharacters(uint chatType, uint groupUin)
{
var fetchAiRecordListEvent = FetchAiCharacterListEvent.Create(chatType, groupUin);

var results = await Collection.Business.SendEvent(fetchAiRecordListEvent);
if (results.Count == 0) return (-1, "Event missing!", null);

var result = (FetchAiCharacterListEvent)results[0];

return (result.ResultCode, result.ErrorMessage, result.AiCharacters);
}

public async Task<string> UploadImage(ImageEntity image)
{
await Collection.Highway.ManualUploadEntity(image);
Expand All @@ -728,14 +785,14 @@ public async Task<string> UploadImage(ImageEntity image)
var ret = (ImageDownloadEvent)result[0];
return ret.ImageUrl;
}

public async Task<ImageOcrResult?> ImageOcr(string imageUrl)
{
var imageOcrEvent = ImageOcrEvent.Create(imageUrl);
var results = await Collection.Business.SendEvent(imageOcrEvent);
return results.Count != 0 ? ((ImageOcrEvent)results[0]).ImageOcrResult : null;
}

public async Task<ImageOcrResult?> ImageOcr(ImageEntity image)
{
var imageUrl = await UploadImage(image);
Expand Down
32 changes: 32 additions & 0 deletions Lagrange.Core/Internal/Event/Action/FetchAiCharacterListEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using Lagrange.Core.Common.Entity;

namespace Lagrange.Core.Internal.Event.Action;

internal class FetchAiCharacterListEvent : ProtocolEvent
{
public uint GroupUin { get; set; }

public uint ChatType { get; set; }

public List<AiCharacterList>? AiCharacters { get; set; }

public string ErrorMessage { get; set; }=string.Empty;

private FetchAiCharacterListEvent(uint chatType, uint groupUin = 42) : base(true)
DarkRRb marked this conversation as resolved.
Show resolved Hide resolved
{
ChatType = chatType;
GroupUin = groupUin;
AiCharacters = new List<AiCharacterList>();
}

private FetchAiCharacterListEvent(int resultCode, List<AiCharacterList>? aiCharacters,string errMsg) : base(resultCode)
{
AiCharacters = aiCharacters;
ErrorMessage = errMsg;
}

public static FetchAiCharacterListEvent Create(uint chatType, uint groupUin) => new(chatType, groupUin);

public static FetchAiCharacterListEvent Result(int resultCode, List<AiCharacterList>? aiCharacters,string errMsg) =>
new(resultCode, aiCharacters, errMsg);
}
38 changes: 38 additions & 0 deletions Lagrange.Core/Internal/Event/Action/GroupAiRecordEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Lagrange.Core.Internal.Packets.Service.Oidb.Common;
using Lagrange.Core.Message.Entity;

namespace Lagrange.Core.Internal.Event.Action;

internal class GroupAiRecordEvent : ProtocolEvent
{
public uint GroupUin { get; set; }
public string Character { get; set; }= string.Empty;
public string Text { get; set; }= string.Empty;

public MsgInfo? RecordInfo { get; set; }
public string ErrorMessage { get; set; }= string.Empty;

private GroupAiRecordEvent(uint groupUin, string character, string text) : base(0)
{
GroupUin = groupUin;
Character = character;
Text = text;
}

private GroupAiRecordEvent(int resultCode, MsgInfo? msgInfo) : base(resultCode)
{
RecordInfo = msgInfo;
}

private GroupAiRecordEvent(int resultCode, string errMsg) : base(resultCode)
{
ErrorMessage = errMsg;
}

public static GroupAiRecordEvent Create(uint groupUin, string character, string text) =>
new(groupUin, character, text);

public static GroupAiRecordEvent Result(int resultCode, MsgInfo? msgInfo) => new(resultCode, msgInfo);

public static GroupAiRecordEvent Result(int resultCode, string errMessage) => new(resultCode, errMessage);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request;

#pragma warning disable CS8618
[ProtoContract]
[OidbSvcTrpcTcp(0x929B, 0)]
internal class OidbSvcTrpcTcp0x929B_0
{
[ProtoMember(1)] public uint GroupCode { get; set; }

[ProtoMember(2)] public string VoiceId { get; set; }

[ProtoMember(3)] public string Text { get; set; }

[ProtoMember(4)] public uint ChatType { get; set; } = 1; //1 voice,2 song

[ProtoMember(5)] private OidbSvcTrpcTcp0x929B_0ClientMsgInfo ClientMsgInfo { get; set; }
}

[ProtoContract]
internal class OidbSvcTrpcTcp0x929B_0ClientMsgInfo
{
[ProtoMember(1)] private uint MsgRandom { get; set; } = 233;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request;

[ProtoContract]
[OidbSvcTrpcTcp(0x929C, 0)]
internal class OidbSvcTrpcTcp0x929C_0
{
[ProtoMember(1)] public uint Group { get; set; }

[ProtoMember(2)] public uint ChatType { get; set; } = 1; //1 voice,2 song
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Request;

[ProtoContract]
[OidbSvcTrpcTcp(0x929D, 0)]
internal class OidbSvcTrpcTcp0x929D_0
{
[ProtoMember(1)] public uint Group { get; set; }

[ProtoMember(2)] public uint ChatType { get; set; } //1 voice,2 song
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Lagrange.Core.Internal.Packets.Service.Oidb.Common;
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Response;

[ProtoContract]
internal class OidbSvcTrpcTcp0x929B_0Response
{
[ProtoMember(1)] uint Field1 { get; set; } //1 complete ,2 wait

[ProtoMember(2)] uint? Field2 { get; set; } //319

[ProtoMember(3)] uint Field3 { get; set; } //20

[ProtoMember(4)] public MsgInfo? MsgInfo { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using ProtoBuf;

namespace Lagrange.Core.Internal.Packets.Service.Oidb.Response;
#pragma warning disable CS8618
[ProtoContract]
internal class OidbSvcTrpcTcp0x929C_0Response
{
[ProtoMember(1)] public List<OidbSvcTrpcTcp0x929C_0ResponseProperty> Property { get; set; }
}

[ProtoContract]
internal class OidbSvcTrpcTcp0x929C_0ResponseProperty
{
[ProtoMember(1)] public string CharacterId { get; set; }

[ProtoMember(2)] public string CharacterName { get; set; }

[ProtoMember(3)] public string CharacterVoiceUrl { get; set; }
}
Loading