/// <summary> /// 初始化 <see cref="CQPrivateMessageEventArgs"/> 类的新实例 /// </summary> /// <param name="api">酷Q的接口实例</param> /// <param name="log">酷Q的日志实例</param> /// <param name="id">事件id</param> /// <param name="type">事件类型</param> /// <param name="name">事件名称</param> /// <param name="function">事件函数名</param> /// <param name="priority">事件优先级</param> /// <param name="subType">消息子类型</param> /// <param name="msgId">消息ID</param> /// <param name="fromQQ">来源QQ</param> /// <param name="msg">消息内容</param> /// <param name="isRegex">是否为正则消息</param> public CQPrivateMessageEventArgs(CQApi api, CQLog log, int id, int type, string name, string function, uint priority, int subType, int msgId, long fromQQ, string msg, bool isRegex) : base(api, log, id, type, name, function, priority) { this.SubType = (CQPrviateMessageType)subType; this.FromQQ = new QQ(api, fromQQ); this.Message = new QQMessage(api, msgId, msg, isRegex); }
/// <summary> /// 初始化 <see cref="CQDiscussMessageEventArgs"/> 类的新实例 /// </summary> /// <param name="id">事件Id</param> /// <param name="type">事件类型</param> /// <param name="name">事件名称</param> /// <param name="function">函数名称</param> /// <param name="priority">默认优先级</param> /// <param name="subType">子类型</param> /// <param name="msgId">消息Id</param> /// <param name="fromDiscuss">来源讨论组</param> /// <param name="fromQQ">来源QQ</param> /// <param name="msg">消息内容</param> /// <param name="isRegex">是否为正则消息</param> /// <param name="api">接口Api实例</param> public CQDiscussMessageEventArgs(int id, int type, string name, string function, uint priority, int subType, int msgId, long fromDiscuss, long fromQQ, string msg, bool isRegex, CQApi api) : base(id, type, name, function, priority) { this.SubType = (CQDiscussMessageType)subType; this.Message = new QQMessage(api, msgId, msg, isRegex); this.FromDiscuss = new Discuss(api, fromDiscuss); this.FromQQ = new QQ(api, fromQQ); }
/// <summary> /// 撤回消息 /// </summary> /// <param name="message">消息</param> /// <exception cref="ArgumentNullException">参数: message 为 null</exception> /// <returns>操作成功返回 <see langword="true"/>, 失败返回 <see langword="false"/></returns> public bool RemoveMessage(QQMessage message) { if (message == null) { throw new ArgumentNullException("message"); } return(this.RemoveMessage(message.Id)); }
/// <summary> /// 识别人形建造字符串 /// </summary> /// <param name="receive_msg">输入的指令</param> /// <returns>表示建造结果的字符串</returns> private List <GFLElements> Action_MakeTdoll(QQMessage receive_msg) { //Simulator simulator = new Simulator(); string[] order = receive_msg.Text.Split(); List <GFLElements> tdoll_info; if (order.Length == 2) // 输入的指令为建造公式 { try { string formula = order[1]; List <int> resources = Tdoll_FormulaDistinguish(formula); if (resources.Count == 4) { tdoll_info = simulator.BuildElement(resources, BUILD_NUM); } else { throw new ArgumentException("建造公式错误"); } } catch (FormatException e1) { throw e1; } catch (ArgumentException e2) { throw new ArgumentException("建造公式错误", e2); } } else if (order.Length == 5) //输入的指令为建造资源 { try { tdoll_info = this.simulator.BuildElement(int.Parse(order[1]), int.Parse(order[2]), int.Parse(order[3]), int.Parse(order[4]), BUILD_NUM); } catch (FormatException e1) { throw e1; } catch (ArgumentException e2) { throw new ArgumentException("非法资源数目", e2); } } else { throw new ArrayTypeMismatchException("建造指令形式错误"); } return(tdoll_info); }
/// <summary> /// 私聊消息处理 /// </summary> /// <param name="value">poll包中的value</param> private QQMessage ProcessPrivateMessage(Message.Result.Value value) { QQMessage message = new QQMessage(); message.AccountType = AccountType.Private; message.FriendID = value.from_uin; message.MessageType = MessageType.Receive; message.MessageContent = GetMessageText(value.content); //this.SendMessage(0, message.FriendID, "收到!QQ机器人正在处理,请稍等..."); return(message); }
/// <summary> /// 讨论组消息处理 /// </summary> /// <param name="value">poll包中的value</param> private QQMessage ProcessDisscussMessage(Message.Result.Value value) { QQMessage message = new QQMessage(); message.AccountType = AccountType.Discussion; message.DiscussionID = value.did; message.FriendID = value.send_uin; message.MessageType = MessageType.Receive; message.MessageContent = GetMessageText(value.content); //this.SendMessage(2, message.DiscussionID, "收到!QQ机器人正在处理,请稍等..."); return(message); }
/// <summary> /// 群聊消息处理 /// </summary> /// <param name="value">poll包中的value</param> private QQMessage ProcessGroupMessage(Message.Result.Value value) { QQMessage message = new QQMessage(); message.AccountType = AccountType.Group; message.GroupID = value.group_code; message.FriendID = value.send_uin; message.MessageType = MessageType.Receive; message.MessageContent = GetMessageText(value.content); //this.SendMessage(1, message.GroupID, "收到!QQ机器人正在处理,请稍等..."); return(message); }
public static void ProcessMessageHandler(QQMessage message) { /* * string answer = TulingRobot.Answer(message.MessageContent); * if (message.AccountType == AccountType.Private) * { * messageService.SendMessage(0, message.FriendID, answer); * } * else if (message.AccountType == AccountType.Group) * { * messageService.SendMessage(1, message.GroupID, answer); * } * else if (message.AccountType == AccountType.Discussion) * { * messageService.SendMessage(2, message.DiscussionID, answer); * } */ RobotPool robotPool = RobotPool.NewInstance(); IRobot robot = null; string answer = ""; if (message.AccountType == AccountType.Private) { robot = robotPool.ApplyOneAvailableRobot(RobotType.Private, message.FriendID); answer = robot.Consult(message.MessageContent); messageService.SendMessage(0, message.FriendID, answer); } else if (message.AccountType == AccountType.Group || message.AccountType == AccountType.Discussion) { robot = robotPool.ApplyOneAvailableRobot(RobotType.Public, message.QQAccount); answer = robot.Consult(message.MessageContent); if (message.AccountType == AccountType.Group) { messageService.SendMessage(1, message.GroupID, answer); } else { messageService.SendMessage(2, message.DiscussionID, answer); } } System.Console.WriteLine("Receive one message"); //Task.Run(() => MyQQDAL.AddOneMessage(message.QQAccount, message)); MyQQDAL.AddOneMessage(message.QQAccount, message); }
/// <summary> /// 初始化 <see cref="CQGroupMessageEventArgs"/> 类的新实例 /// </summary> /// <param name="api">酷Q的接口实例</param> /// <param name="log">酷Q的日志实例</param> /// <param name="id">事件Id</param> /// <param name="type">事件类型</param> /// <param name="name">事件名称</param> /// <param name="function">函数名称</param> /// <param name="priority">默认优先级</param> /// <param name="subType">子类型</param> /// <param name="msgId">消息Id</param> /// <param name="fromGroup">来源群号</param> /// <param name="fromQQ">来源QQ</param> /// <param name="fromAnonymous">来源匿名</param> /// <param name="msg">消息内容</param> /// <param name="isRegex">是否正则消息</param> public CQGroupMessageEventArgs(CQApi api, CQLog log, int id, int type, string name, string function, uint priority, int subType, int msgId, long fromGroup, long fromQQ, string fromAnonymous, string msg, bool isRegex) : base(api, log, id, type, name, function, priority) { this.SubType = (CQGroupMessageType)subType; this.Message = new QQMessage(api, msgId, msg, isRegex); this.FromGroup = new Group(api, fromGroup); this.FromQQ = new QQ(api, fromQQ); this.IsFromAnonymous = fromQQ == 80000000 && !string.IsNullOrEmpty(fromAnonymous); if (this.IsFromAnonymous) { this.FromAnonymous = new GroupMemberAnonymousInfo(fromAnonymous); } else { this.FromAnonymous = null; } }
private void ProcessMessage(string data) { Message poll = (Message)JsonConvert.DeserializeObject(data, typeof(Message)); if (poll.retcode != 0) { ProcessMessageError(poll); } else if (poll.result != null && poll.result.Count > 0) { QQMessage message = new QQMessage(); for (int i = 0; i < poll.result.Count; i++) { switch (poll.result[i].poll_type) { case "kick_message": ProcessMessageFlag = false; //MessageBox.Show(poll.result[i].value.reason); break; case "message": message = ProcessPrivateMessage(poll.result[i].value); break; case "group_message": message = ProcessGroupMessage(poll.result[i].value); break; case "discu_message": message = ProcessDisscussMessage(poll.result[i].value); break; default: break; } } if (ProcessMessageAction != null) { message.QQAccount = this.smartQQ.QQAccount; Task.Run(() => ProcessMessageAction(message)); //ProcessMessageAction(message); } } }
/// <summary> /// 机器人签到功能 /// </summary> /// <param name="qq"></param> /// <param name="group"></param> void CheckIn(QQMessage qqMessage) { int coins = Random.Next(Config.CheckInMinCoins, Config.CheckInMaxCoins + 1); switch (MySqlHelper.ExecuteScalar($"select checkin ({qqMessage.QQ}, {coins})")) { case 1: qqMessage.Reply("今日已签到"); break; case 2: case 3: qqMessage.Reply($"签到成功,金币加{coins}"); break; default: throw new NotImplementedException(); } }
public static void RevokeHImage(this QQMessage message, int delay) { if (message.IsSuccess) { if (delay > 0) { new Task(() => { try { Thread.Sleep(delay * 1000); message.RemoveMessage(); } catch (Exception ex) { } }).Start(); } } }
/// <summary> /// SauceNao调用 /// </summary> /// <param name="cqcode">图片CQ码</param> /// <param name="e"></param> public static void SauceNao_Call(CQCode cqcode, CQGroupMessageEventArgs e) { string url = "https://saucenao.com/search.php?output_type=2&api_key=56faa0cddf50860330a295e0c331be7c4b4c021f&db=999&numres=3&url="; url += CommonHelper.GetImageURL(cqcode.ToSendString()); using (HttpWebClient http = new HttpWebClient() { TimeOut = 10000, Encoding = Encoding.UTF8, Proxy = MainSave.Proxy, AllowAutoRedirect = true, }) { try { Directory.CreateDirectory(MainSave.ImageDirectory + "SauceNaotemp"); var result = JsonConvert.DeserializeObject <SauceNao_Result.SauceNAO>(http.DownloadString(url)); if (result == null || result.results == null || result.results.Count == 0) { e.CQLog.Info("SauceNao识图", "拉取结果失败,建议重试"); e.FromGroup.SendGroupMessage("诶嘿,网络出了点小差~"); return; } e.CQLog.Info("SauceNao识图", "结果获取成功,正在拉取缩略图"); int count = 1; result.results = result.results.Take(1).ToList(); string str = result.ToString(); foreach (var item in result.results) { try { string filename = Guid.NewGuid().ToString().ToString(); http.DownloadFile(item.header.thumbnail, $@"{MainSave.ImageDirectory}\SauceNaotemp\{filename}.jpg"); str = str.Replace($"{{{count}}}", CQApi.CQCode_Image($@"\SauceNaotemp\{filename}.jpg").ToSendString()); } catch { str = str.Replace($"{{{count}}}", item.header.thumbnail); } finally { count++; } } e.FromGroup.SendGroupMessage(str); List <int> ls = result.results.Where(x => x.data.pixiv_id.HasValue).Select(x => x.data.pixiv_id.Value).ToList(); if (ls.Count != 0) { e.FromGroup.SendGroupMessage("有Pixiv图片信息,尝试拉取原图..."); foreach (var item in ls) { try { http.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; if (!File.Exists($@"{MainSave.ImageDirectory}\LoliconPic\${item}.jpg")) { dynamic jObject = JObject.Parse(http.UploadString("https://api.pixiv.cat/v1/generate", $"p={item}")); string pixiv_url = string.Empty; try { var urllist = jObject.original_urls_proxy; pixiv_url = urllist[0]; e.FromGroup.SendGroupMessage("此图为多P图片,选择第一P下载"); MainSave.CQLog.Info("SauceNao识图", "此图为多P图片,选择第一P下载"); } catch { pixiv_url = jObject.Value <string>("original_url_proxy"); } if (!Directory.Exists($@"{MainSave.ImageDirectory}\LoliconPic")) { Directory.CreateDirectory($@"{MainSave.ImageDirectory}\LoliconPic"); } http.DownloadFile(pixiv_url, $@"{MainSave.ImageDirectory}\LoliconPic\{item}.jpg"); MainSave.CQLog.Info("SauceNao识图", $"pid={item}的图片下载成功,尝试发送"); } QQMessage staues = e.FromGroup.SendGroupMessage(CQApi.CQCode_Image($@"\LoliconPic\{item}.jpg")); } catch (Exception exc) { e.FromGroup.SendGroupMessage($"pid={item}的图片拉取失败,错误信息:{exc.Message}"); } } } } catch (Exception exc) { e.CQLog.Info("SauceNao搜图", $"搜索失败,错误信息:{exc.Message}在{exc.StackTrace}"); e.FromGroup.SendGroupMessage($"拉取失败,错误信息:{exc.Message}"); } try { string path = $@"{MainSave.ImageDirectory}\SauceNaotemp"; if (Directory.Exists(path)) { Directory.Delete(path, true); } } catch { } } }
public void DiscussMessage(object sender, CQDiscussMessageEventArgs e) { if (CoolRepeater.DisabledGroups.Contains(e.FromDiscuss.Id)) { return; } if (!CoolRepeater.EnabledGroups.Contains(e.FromDiscuss.Id)) { return; } if (CoolRepeater.IgnorePicture && e.Message.CQCodes.FirstOrDefault(c => c.Function == Native.Sdk.Cqp.Enum.CQFunction.Image) != null) { return; } var noContentMessage = new QQMessage(e.CQApi, -1, string.Empty); var groupLastMessages = CoolRepeater.GroupLastMessages; if (!groupLastMessages.ContainsKey($"D{e.FromDiscuss.Id}")) { groupLastMessages.Add($"D{e.FromDiscuss.Id}", new Tuple <long, QQMessage>(e.FromQQ.Id, noContentMessage)); } var groupMessageSenders = CoolRepeater.GropuMessageSenders; if (!groupMessageSenders.ContainsKey($"D{e.FromDiscuss.Id}")) { groupMessageSenders.Add($"D{e.FromDiscuss.Id}", new HashSet <long>()); } var groupRepeatedMessage = CoolRepeater.GroupRepeatedMessages; if (!groupRepeatedMessage.ContainsKey($"D{e.FromDiscuss.Id}")) { groupRepeatedMessage.Add($"D{e.FromDiscuss.Id}", noContentMessage); } var lastMessage = groupLastMessages[$"D{e.FromDiscuss.Id}"]; var senders = groupMessageSenders[$"D{e.FromDiscuss.Id}"]; var lastRepeated = groupRepeatedMessage[$"D{e.FromDiscuss.Id}"]; if (e.Message.Text != lastMessage.Item2.Text) { groupLastMessages[$"D{e.FromDiscuss.Id}"] = new Tuple <long, QQMessage>(e.FromQQ.Id, e.Message); senders.Clear(); return; } else { senders.Add(e.FromQQ.Id); } if (lastRepeated.Text == e.Message.Text) { senders.Clear(); return; } if (senders.Count >= (CoolRepeater.RepeatThreshold - 1)) { var repeatString = e.Message.ToSendString(); foreach (var s in CoolRepeater.BlockWords) { if (repeatString.Contains(s)) { senders.Clear(); return; } } if ((decimal) new Random().NextDouble() <= CoolRepeater.RepeatProbability) { if (CoolRepeater.GreaterChancesMoreRepeat) { senders.Clear(); } return; } e.CQApi.SendDiscussMessage(e.FromDiscuss, repeatString); groupRepeatedMessage[$"D{e.FromDiscuss.Id}"] = e.Message; senders.Clear(); } }
public static void SendHimages(this string command, bool fAllowR18, Action RecordLimit, Action RecordCD, Func <object, QQMessage> SendMessage, Action <QQMessage> RevokeHimage) { string strGetHttpResponse; if (RobotInfo.UserHImageCmd.Contains(command)) { strGetHttpResponse = $@"https://api.lolicon.app/setu/?{ (RobotInfo.Size1200 ? "size1200=true" : "") }"; } else { //分割请求接口所需的参数 long lImgCount = 1; string keyword = ""; string size1200 = ""; string strR18 = "0"; #region -- R18 -- Regex rxR18 = new Regex(RobotInfo.HImageR18Cmd); foreach (Match mchR18 in rxR18.Matches(command)) { strR18 = "1"; command = command.Replace(mchR18.Value, ""); //无论是否允许R18都现将命令中的R18移除, 避免和数量混淆 } if (!fAllowR18) //如果不允许R18 { strR18 = "0"; } #endregion -- R18 -- #region -- 色图数量 -- ; string strCount = command.GetRege(RobotInfo.HImageBeginCmd, RobotInfo.HImageCountCmd, RobotInfo.HImageUnitCmd); if (!long.TryParse(strCount, out lImgCount) && !string.IsNullOrEmpty(strCount)) { lImgCount = strCount.Chinese2Num(); } if (string.IsNullOrEmpty(strCount)) { lImgCount = 1; } if (lImgCount == 0) { return; } if (lImgCount > 10) { lImgCount = 10; } #endregion -- 色图数量 -- #region -- 关键词 -- string strKeyword = command.GetRege(RobotInfo.HImageUnitCmd, RobotInfo.HImageKeywordCmd, RobotInfo.HImageEndCmd); if (!string.IsNullOrWhiteSpace(strKeyword)) { if (strKeyword.EndsWith("的")) { strKeyword = strKeyword.Substring(0, strKeyword.Length - 1); } keyword = "&keyword=" + strKeyword; } #endregion -- 关键词 -- if (RobotInfo.Size1200) { size1200 = "&size1200=true"; } strGetHttpResponse = $@"https://api.lolicon.app/setu/?num={lImgCount}&r18={strR18}{keyword}{size1200}"; } string resultValue = DataHelper.GetHttpResponse(strGetHttpResponse); JObject jo = (JObject)JsonConvert.DeserializeObject(resultValue); JToken jt = jo["data"]; if (jo["code"].ToString() == "1") { SendMessage(RobotInfo.NoResult); return; } IEnumerable <ImageUrl> enumImg = jt.Select(i => new ImageUrl(i["p"].ToString(), i["pid"].ToString(), RobotInfo.Accelerate ? RobotInfo.AccelerateUrl + i["url"].ToString() : i["url"].ToString())); if (enumImg == null) { return; } StringBuilder sbAddress = new StringBuilder(); foreach (var item in enumImg) { sbAddress.AppendLine(@"https://www.pixiv.net/artworks/" + item.ID + $" (p{item.P})"); } if (string.IsNullOrEmpty(sbAddress.ToString())) { return; } QQMessage msgUrl = SendMessage(sbAddress.ToString()); if (msgUrl.IsSuccess && RobotInfo.LimitType == "Frequency") { RecordLimit?.Invoke(); } RecordCD?.Invoke(); foreach (var pair in enumImg) { string imgPath = pair.ID + "_" + pair.P + ".png"; if (!File.Exists(imgPath) || new FileInfo(imgPath).Length == 0) { string strImageSafeName = Path.Combine(Application.StartupPath, "data", "image", imgPath); Image img = Image.FromStream(WebRequest.Create(pair.URL).GetResponse().GetResponseStream()); img.Save(strImageSafeName); img.Dispose(); RuntimeHelper.DownloadedImagesName.Add(strImageSafeName); } QQMessage msgImg; if (RobotInfo.AntiShielding) { Bitmap temp = new Bitmap(Path.Combine(Application.StartupPath, "data", "image", imgPath)); Bitmap bmp = new Bitmap(temp); temp.Dispose(); bmp.AntiShielding(); string antiPath = pair.ID + "_" + pair.P + "_AntiShielding" + ".png"; string strImageSafeName = Path.Combine(Application.StartupPath, "data", "image", antiPath); bmp.Save(strImageSafeName); msgImg = SendMessage(CQApi.CQCode_Image(antiPath)); if (msgImg.IsSuccess && RobotInfo.LimitType == "Count") { RecordLimit?.Invoke(); } if (RobotInfo.LimitType == "Frequency") { RecordLimit?.Invoke(); } try { File.Delete(strImageSafeName); } catch { RuntimeHelper.DownloadedImagesName.Add(strImageSafeName); } } else { msgImg = SendMessage(CQApi.CQCode_Image(imgPath)); } RevokeHimage?.Invoke(msgImg); } }
/// <summary> /// 当群成员离开本群 /// </summary> /// <param name="e"></param> /// <returns></returns> public override QMEventHandlerTypes OnGroupMemberLeave(QMGroupMemberDecreaseEventArgs e) { QQMessage.Reply(e.FromQQ, e.FromGroup, "离开了本群:" + e.FromQQ); return(base.OnGroupMemberLeave(e)); }
/// <summary> /// 群员修改了群名片 /// </summary> /// <param name="e"></param> /// <returns></returns> public override QMEventHandlerTypes OnGroupMemberCardChange(QMGroupMemberCardChangeEventArgs e) { QQMessage.Reply(e.FromQQ, e.FromGroup, "修改了名片:" + e.NewCard); return(base.OnGroupMemberCardChange(e)); }
/// <summary> /// 当新人进群提示输出 /// </summary> /// <param name="e"></param> /// <returns></returns> public override QMEventHandlerTypes OnGroupMemberBeAllowAdd(QMGroupMemberIncreaseEventArgs e) { QQMessage.Reply(e.FromQQ, e.FromGroup, "欢迎新人进群:么么哒:"); return(base.OnGroupMemberBeAllowAdd(e)); }
/// <summary> /// 金币查询 /// </summary> /// <param name="qq"></param> /// <param name="group"></param> void Coins(QQMessage qqMessage) { int coins = Convert.ToInt32(MySqlHelper.ExecuteScalar($"select coins from checkin where qq = {qqMessage.QQ}")); qqMessage.Reply($"你目前拥有{coins}枚金币"); }