/// <summary> /// 正常模式的回复 /// 正常模式不会进行随机拼句回复,而是尽量爬取网上的有用信息来回应 /// </summary> /// <param name="user"></param> /// <param name="question"></param> /// <returns></returns> string getAnswerNormal(long user, string question) { string answer = ""; string msg = ""; answer = baidu.getZhidaoAnswer(question); if (answer.Length > 0) { msg = answer + "..."; } if (modes.rand.Next(0, 100) > 75 || msg.Length <= 0) { try { var tiebares = baidu.getBaiduTiebaAnswers(question); if (tiebares.Length > 0) { string tiebaanswer = tiebares[modes.rand.Next(0, tiebares.Length)].Trim(); msg = tiebaanswer; //sendPrivate(masterQQ, question + "\r\n\r\n" + tiebaanswer); } } catch (Exception e) { FileIOActor.log(e.Message + "\r\n" + e.StackTrace); } } if (msg.Length <= 0) { msg = modes.getSaoHua(); } return(msg); }
/// <summary> /// bot各类所需资源的初始化 /// 这里会保证全局只初始化一遍 /// </summary> public void tryInit() { lock (dealmsgMutex) { if (!inited) { try { if (Directory.Exists(rootDict + historyPath)) { Directory.CreateDirectory(rootDict + historyPath); } modes.init(rootDict + DataModePath); baidu.init(rootDict + DataBaiduPath); proof.init(rootDict + DataProofPath); weather.init(rootDict + DataWeatherPath); userBlacklist = new Dictionary <long, long>(); groupBlacklist = new Dictionary <long, long>(); groupWhitelist = new Dictionary <long, long>(); List <string> userblacklistlines = FileIOActor.readLines(rootDict + userBlacklistFile).ToList(); foreach (var line in userblacklistlines) { var uitem = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); if (uitem.Length >= 2) { userBlacklist[long.Parse(uitem[0])] = long.Parse(uitem[1]); } } List <string> groupblacklistlines = FileIOActor.readLines(rootDict + groupBlacklistFile).ToList(); foreach (var line in groupblacklistlines) { groupBlacklist[long.Parse(line)] = 0; } List <string> groupwhitelistlines = FileIOActor.readLines(rootDict + groupWhitelistFile).ToList(); foreach (var line in groupwhitelistlines) { groupWhitelist[long.Parse(line)] = 0; } askname = FileIOActor.readLines(rootDict + asknameFile).ToList(); inited = true; } catch (Exception e) { FileIOActor.log(e.Message + "\r\n" + e.StackTrace); inited = false; } } } }
/// <summary> /// 记录群/私人聊天信息到文件中 /// </summary> /// <param name="group"></param> /// <param name="user"></param> /// <param name="msg"></param> void saveMsg(long group, long user, string msg) { lock (savemsgMutex) { try { string time = DateTime.Now.ToString("yyyy-MM-dd_HH:mm:ss"); if (user == myQQ) { time += "[me]"; } if (group <= 0) { // private string ppath = $"{rootDict}{historyPath}\\private\\"; if (!Directory.Exists(ppath)) { Directory.CreateDirectory(ppath); } File.AppendAllText($"{ppath}{user}.txt", $"{time}\t{msg}\r\n", Encoding.UTF8); } else { // group string ppath = $"{rootDict}{historyPath}\\group\\"; if (!Directory.Exists(ppath)) { Directory.CreateDirectory(ppath); } string gfile = $"{ppath}{group}.txt"; if (!File.Exists(gfile)) { // 第一次入群,主动发一下自我介绍 sendGroup(group, -1, getWelcomeString()); } File.AppendAllText(gfile, $"{time}\t{user}\t{msg}\r\n", Encoding.UTF8); } } catch (Exception e) { FileIOActor.log(e.Message + "\r\n" + e.StackTrace); } } }
/// /// 面对输入的逻辑: /// -0 若未初始化,先初始化 /// 0 记录聊天内容 /// 1 先检查群聊中是否需要我响应该消息,并过滤掉at的指令等(如果私聊则跳过这一步) /// 2 检查对方权限,作对应忽略 /// 3 按内容处理 /// 4 记录输出的聊天内容 /// /// <summary> /// 判断是否回复特定qq号的消息 /// 根据ignore文件内的配置来作判断 /// </summary> /// <param name="user"></param> /// <returns></returns> bool allowuser(long user) { if (DateTime.Now.Minute == 0) { // 整小时,重置互乐次数 lock (userblackMutex) { try { userBlacklist = new Dictionary <long, long>(); List <string> userlines = FileIOActor.readLines(rootDict + userBlacklistFile).ToList(); foreach (var line in userlines) { var item = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); if (item.Length >= 2) { userBlacklist[long.Parse(item[0])] = long.Parse(item[1]); } } } catch (Exception e) { FileIOActor.log(e.Message + "\r\n" + e.StackTrace); } } } if (userBlacklist.Keys.Contains(user)) { long lefttime = userBlacklist[user]; log(lefttime.ToString()); if (lefttime > 0) { userBlacklist[user] = lefttime - 1; log(userBlacklist[user].ToString()); return(true); } log("igore.."); return(false); } log("no ignore" + user.ToString()); return(true); }