using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Sog; using MySql.Data.MySqlClient; using SimpleHttpServer; using LitJson; using ProtoCSStruct; namespace Operation { public enum MailStatus { Ready = 0, Send = 1, Success = 2, Timeout = 3, ReCall = 4, }; public enum MailMsg { msg_Send = 1, msg_Success = 2, msg_Timeout = 3, } /// /// 暂时不去tick这部分代码,拉去逻辑测试没问题,可以删掉 /// public class SendMailSvc : BaseReloadableService { private long lastTickTimeMs = 0; private long lastKeepAlive = 0; public MySqlDB m_mySqlDb; public override int GetServiceType() { return OperationServiceType.SendMailSvc; } public override void Dispose() { m_mySqlDb.Dispose(); m_mySqlDb = null; } public SendMailSvc() { var config = OperationServerUtils.GetServerConfig(); m_mySqlDb = new MySqlDB(config.dbname, config.dbip, config.dbuser, config.dbpassword); } public void OnTick(long nowMs) { if (nowMs - lastTickTimeMs < 120000) { return; } lastTickTimeMs = nowMs; TickMailBoxTemp(); } public void TickMailBoxTemp() { TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0); int nowTime = Convert.ToInt32(ts.TotalMinutes); //获取当前时间戳 string strSql = ""; string nowTimeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); strSql = $"select * from mail_box_temp where dater <='{nowTimeStr}' and datee >='{nowTimeStr}' and status=0"; //邮件再有效期内 strSql += " order by Id asc"; TraceLog.Debug("MailStatus.TickMailBoxTemp sqlStr:{0}", strSql); MySqlDataReader reader = m_mySqlDb.ExecReader(strSql); if (reader == null) { TraceLog.Error("MailStatus.TickMailBoxTemp error: return reader is null!"); return; } if (!reader.HasRows) { TraceLog.Trace("MailStatus.TickMailBoxTemp DB has no record"); reader.Close(); return; } List mailIds = new List(); List> dataList = new List>(); try { while (reader.Read()) { int mailId = reader.GetInt32("Id"); mailIds.Add(mailId); string timeLimit = reader.GetDateTime("dater").ToString() + "#" + reader.GetDateTime("datee"); ExtMail ext = new ExtMail(); int gameDataIndex = reader.GetOrdinal("data"); if (!reader.IsDBNull(gameDataIndex)) { byte[] buffer = new byte[50 * 1024]; long gameDataLength = reader.GetBytes(gameDataIndex, 0, buffer, 0, buffer.Length); byte[] gameDataByte = new byte[gameDataLength]; Buffer.BlockCopy(buffer, 0, gameDataByte, 0, (int)gameDataLength); StructMessageParseUtils.ParseFrom(ref ext, gameDataByte); } byte[] dataByte = StructMessageParseUtils.ToByteArray(ref ext); Dictionary data = new Dictionary(); data["name"] = reader.GetString("name"); data["title"] = reader.GetString("title"); data["content"] = reader.GetString("content"); data["realmlist"] = reader.GetString("realmlist"); data["herolist"] = reader.GetString("herolist"); data["language"] = reader.GetString("language"); data["uuid"] = reader.GetString("uuid"); data["curstr"] = reader.GetString("curstr"); data["itemstr"] = reader.GetString("itemstr"); data["timeLimit"] = timeLimit; data["isSendToAll"] = reader.GetInt32("isSendToAll"); data["equipStr"] = reader.GetString("equipStr"); data["dataByte"] = dataByte; data["customItemStr"] = reader.GetString("customItemStr"); dataList.Add(data); } } catch (Exception ex) { if (reader != null) reader.Close(); TraceLog.Error("MailStatus.TickMailBoxTemp error:{0}!", ex.Message); } reader.Close(); var successful = DeleteMailTemp(mailIds); if (!successful) {//没有清理成功,就不能发送邮件 return; } for (int i = 0; i < dataList.Count; i++) { var data = dataList[i]; DBInsertIntoMailBox(data["name"].ToString(), data["title"].ToString(), data["content"].ToString(), data["realmlist"].ToString(), data["herolist"].ToString(), data["language"].ToString(), data["uuid"].ToString(), data["curstr"].ToString(), data["itemstr"].ToString(), data["timeLimit"].ToString(), (int)data["isSendToAll"], data["equipStr"].ToString(), (byte[])data["dataByte"], data["customItemStr"].ToString()); } } public bool DeleteMailTemp(List mailIds) { if (mailIds.Count <= 0) { return true; } string editSql = $"delete from mail_box_temp where Id in({string.Join(",", mailIds)});"; TraceLog.Debug("MailStatus.DeleteMailTemp: sql:{0}", editSql); try { m_mySqlDb.ExecNonQuery(editSql, null); } catch (Exception e) { TraceLog.Error("MailStatus.DeleteMailTemp error : {0}", e.Message); return false; } return true; } public int DBInsertIntoMailBox(string _name, string title11, string content11, string realmlist11, string herolist11, string language, string uuid, string curstr11, string itemstr11, string timeLimit11, int isSendToAll, string equipStr, byte[] dataByte, string customItemStr) { return MailDBUtils.DBInsertIntoMailBox(m_mySqlDb, _name, title11, content11, realmlist11, herolist11, language, uuid, curstr11, itemstr11, timeLimit11, isSendToAll, equipStr, dataByte, customItemStr); ; } } }