/// <summary> /// 零参数指令的参数检查 /// 同时检查成员是否存在 /// </summary> /// <returns> /// <para><see langword="true"/> 指令合法</para> /// <para><see langword="false"/> 有多余参数</para> /// </returns> internal async ValueTask <bool> ZeroArgsCheck() { //检查参数 switch (BotUtils.CheckForLength(CommandArgs, 0)) { case LenType.Extra: await MessageEventArgs.SourceGroup.SendGroupMessage(CQCode.CQAt(MessageEventArgs.Sender.Id), "\r\n听不见!重来!(有多余参数)"); return(false); case LenType.Legitimate: return(true); default: await MessageEventArgs.SourceGroup.SendGroupMessage(CQCode.CQAt(MessageEventArgs.Sender.Id), "发生未知错误,请联系机器人管理员"); ConsoleLog.Error("Unknown error", "LenType"); return(false); } }
/// <summary> /// 退会 /// </summary> private async void QuitGuild() { //检查公会是否存在 if (DBHelper.GuildExists() != 1) { await SourceGroup.SendGroupMessage("该群未创建公会"); return; } //获取成员参数 List <long> quitList = new List <long>(); switch (BotUtils.CheckForLength(CommandArgs, 1)) { case LenType.Illegal: quitList.Add(Sender); break; case LenType.Legitimate: //只有单一成员时需判断uid参数 quitList.AddRange(MessageEventArgs.Message.GetAllAtList()); if (quitList.Count == 0) { if (long.TryParse(CommandArgs[1], out long uid)) { quitList.Add(uid); } else { await SourceGroup.SendGroupMessage("没有At任何成员"); return; } } break; case LenType.Extra: quitList.AddRange(MessageEventArgs.Message.GetAllAtList()); if (quitList.Count == 0) { await SourceGroup.SendGroupMessage("没有At任何成员"); return; } break; } //检查列表中是否有机器人 if (quitList.Any(member => member == MessageEventArgs.LoginUid)) { quitList.Remove(MessageEventArgs.LoginUid); await SourceGroup.SendGroupMessage("不要在成员中At机器人啊kora"); if (quitList.Count == 0) { return; } } Log.Debug("Guild Mgr", $"Get quit list count={quitList.Count}"); Dictionary <long, int> databaseRet = new Dictionary <long, int>(); //删除退会成员 foreach (long member in quitList) { databaseRet.Add(member, DBHelper.QuitGuild(member, SourceGroup)); } //构建格式化信息 List <CQCode> responseMsg = new List <CQCode>(); if (databaseRet.Any(ret => ret.Value == 0)) { responseMsg.Add(CQCode.CQText("以下成员已退出:")); foreach (long member in databaseRet.Where(member => member.Value == 0) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } if (databaseRet.Any(ret => ret.Value == 1)) { if (responseMsg.Count != 0) { responseMsg.Add(CQCode.CQText("\r\n")); } responseMsg.Add(CQCode.CQText("以下成员并不在公会中:")); foreach (long member in databaseRet.Where(member => member.Value == 1) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } if (databaseRet.Any(ret => ret.Value == -1)) { if (responseMsg.Count != 0) { responseMsg.Add(CQCode.CQText("\r\n")); } responseMsg.Add(CQCode.CQText("以下成员在退出时发生错误:")); foreach (long member in databaseRet.Where(member => member.Value == -1) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } //发送信息 await SourceGroup.SendGroupMessage(responseMsg); }
/// <summary> /// 加入公会 /// </summary> private async void JoinGuild() { //检查公会是否存在 if (DBHelper.GuildExists() != 1) { await SourceGroup.SendGroupMessage("该群未创建公会"); return; } //处理需要加入的成员列表 List <long> joinList = new List <long>(); switch (BotUtils.CheckForLength(CommandArgs, 1)) { case LenType.Illegal: joinList.Add(Sender); break; case LenType.Extra: case LenType.Legitimate: joinList.AddRange(MessageEventArgs.Message.GetAllAtList()); if (joinList.Count == 0) { await SourceGroup.SendGroupMessage("没有At任何成员"); return; } break; } //检查列表中是否有机器人 if (joinList.Any(member => member == MessageEventArgs.LoginUid)) { joinList.Remove(MessageEventArgs.LoginUid); await SourceGroup.SendGroupMessage("不要在成员中At机器人啊kora"); if (joinList.Count == 0) { return; } } Log.Debug("Guild Mgr", $"Get join list count={joinList.Count}"); //从API获取成员信息 Log.Debug("Guild Mgr", "Get group member infos"); var(apiStatus, groupMemberList) = await SourceGroup.GetGroupMemberList(); if (apiStatus != APIStatusType.OK) { Log.Error("API error", $"api ret code {(int) apiStatus}"); await SourceGroup.SendGroupMessage(CQCode.CQAt(Sender), "\r\nAPI调用错误请重试"); return; } //加入待加入的成员 Dictionary <long, int> databaseRet = new Dictionary <long, int>(); foreach (long member in joinList) { //获取群成员名 string memberName = groupMemberList.Any(memberInfo => memberInfo.UserId == member) ? groupMemberList.Where(memberInfo => memberInfo.UserId == member) .Select(memberInfo => string.IsNullOrEmpty(memberInfo.Card) ? memberInfo.Nick : memberInfo.Card) .First() : "N/A"; //添加成员 databaseRet.Add(member, DBHelper.JoinGuild(member, SourceGroup, memberName)); } //构建格式化信息 List <CQCode> responseMsg = new List <CQCode>(); if (databaseRet.Any(ret => ret.Value == 0)) //成员成功加入 { responseMsg.Add(CQCode.CQText("以下成员已加入:")); foreach (long member in databaseRet.Where(member => member.Value == 0) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } if (databaseRet.Any(ret => ret.Value == 1)) //成员已存在 { if (responseMsg.Count != 0) { responseMsg.Add(CQCode.CQText("\r\n")); } responseMsg.Add(CQCode.CQText("以下成员已在公会中,仅更新信息:")); foreach (long member in databaseRet.Where(member => member.Value == 1) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } if (databaseRet.Any(ret => ret.Value == -1)) //数据库错误 { if (responseMsg.Count != 0) { responseMsg.Add(CQCode.CQText("\r\n")); } responseMsg.Add(CQCode.CQText("以下成员在加入时发生错误:")); foreach (long member in databaseRet.Where(member => member.Value == -1) .Select(member => member.Key) .ToList()) { responseMsg.Add(CQCode.CQText("\r\n")); responseMsg.Add(CQCode.CQAt(member)); } } //发送信息 await SourceGroup.SendGroupMessage(responseMsg); }
/// <summary> /// 创建公会 /// </summary> private async void CreateGuild() { //检查群是否已经被标记为公会 switch (this.DBHelper.GuildExists()) { case 1: await base.SourceGroup.SendGroupMessage(CQCode.CQAt(base.Sender), $"此群已被标记为[{DBHelper.GetGuildInfo(base.SourceGroup).GuildName}]公会"); return; } //公会名 string guildName; //公会区服 Server guildServer; //判断公会名 switch (BotUtils.CheckForLength(this.CommandArgs, 1)) { case LenType.Extra: if (BotUtils.CheckForLength(this.CommandArgs, 2) == LenType.Legitimate) { guildName = CommandArgs[2]; } else { await base.SourceGroup.SendGroupMessage(CQCode.CQAt(base.Sender), "\r\n有多余参数"); return; } break; case LenType.Legitimate: var groupInfo = await base.SourceGroup.GetGroupInfo(); if (groupInfo.apiStatus != APIStatusType.OK) { Log.Error("API error", $"api ret code {(int) groupInfo.apiStatus}"); await base.SourceGroup.SendGroupMessage(CQCode.CQAt(base.Sender), "\r\nAPI调用错误请重试"); return; } guildName = groupInfo.groupInfo.GroupName; break; default: return; } //判断区服 if (Enum.IsDefined(typeof(Server), CommandArgs[1])) { guildServer = (Server)Enum.Parse(typeof(Server), CommandArgs[1]); if (guildServer != Server.CN) { await base.SourceGroup.SendGroupMessage("暂不支持国服以外的服务器"); return; } } else { await base.SourceGroup.SendGroupMessage(CQCode.CQAt(base.Sender), "弟啊,你哪个服务器的"); return; } switch (this.DBHelper.CreateGuild(guildServer, guildName, base.SourceGroup)) { case -1: await BotUtils.DatabaseFailedTips(MessageEventArgs); break; case 0: await base.SourceGroup.SendGroupMessage($"公会[{guildName}]已创建"); break; default: await base.SourceGroup.SendGroupMessage("发生了未知错误"); break; } }