gms_email.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package gm_services
  2. import (
  3. "errors"
  4. "gadmin/internal/admin/forms"
  5. "gadmin/internal/admin/gmdb/filedb"
  6. "github.com/sirupsen/logrus"
  7. "os"
  8. "sort"
  9. "strings"
  10. "sync"
  11. "time"
  12. "github.com/jinzhu/copier"
  13. "github.com/jinzhu/now"
  14. "github.com/robfig/cron/v3"
  15. )
  16. var (
  17. emailDB *filedb.Collection
  18. // EmailsPool = forms.EmailList{}
  19. duration = 5 * time.Minute
  20. cronTab *cron.Cron
  21. lock sync.Mutex
  22. )
  23. func getEmailDB() *filedb.Collection {
  24. if emailDB != nil {
  25. return emailDB
  26. }
  27. emailDB = InitDb()
  28. return emailDB
  29. }
  30. func InitDb() *filedb.Collection {
  31. db := filedb.NewCollection(os.Getenv("STORAGE_EMAILS"))
  32. if err := db.LoadDb(); err != nil {
  33. logrus.Error("emailDB InitDb err:", err)
  34. return nil
  35. }
  36. return db
  37. }
  38. func SaveEmailDb() {
  39. if err := getEmailDB().SaveDb(); err != nil {
  40. logrus.Error("emailDB SaveDb err:", err)
  41. return
  42. }
  43. }
  44. func EmailCron() {
  45. cronTab = cron.New()
  46. cronTab.AddFunc("*/1 * * * *", timerSendLetter)
  47. cronTab.AddFunc("*/1 * * * *", SaveEmailDb)
  48. go cronTab.Run()
  49. }
  50. func timerSendLetter() {
  51. contents, _ := getEmailDB().All()
  52. // contents := EmailsPool
  53. now := time.Now().Unix()
  54. for _, v := range contents {
  55. if item, ok := v.(*forms.EmailItem); ok {
  56. if item.Deleted || item.Opt != "send" {
  57. continue
  58. }
  59. if item.SentAt == 0 && item.SendAt >= now-int64(duration) && item.SendAt <= now {
  60. // sendEmail
  61. logrus.WithField("from", "timerSendLetter").Infoln(item)
  62. err := sendLetterToWorld(item)
  63. if err != nil {
  64. logrus.Error("emailDB sendLetterToWorld err:", err)
  65. return
  66. }
  67. }
  68. }
  69. }
  70. }
  71. func GetEmails(page, perPage int) (emails []*forms.EmailItem, total int, err error) {
  72. mails, _ := getEmailDB().All()
  73. contents := forms.EmailList{}
  74. for _, v := range mails {
  75. contents = append(contents, v.(*forms.EmailItem))
  76. }
  77. // page, perPage = 1, 100000
  78. sort.Sort(contents)
  79. total = len(contents)
  80. if total >= page*perPage {
  81. emails = contents[(page-1)*perPage : page*perPage]
  82. } else if total > (page-1)*perPage {
  83. emails = contents[(page-1)*perPage:]
  84. }
  85. return
  86. }
  87. func DeleteEmail(id int64) (err error) {
  88. if id > 0 {
  89. mail, err := getEmailDB().Find(id)
  90. if err == nil {
  91. if v, ok := mail.(*forms.EmailItem); ok {
  92. v.Status = "已删除"
  93. if err = getEmailDB().Add(v); err != nil {
  94. logrus.Error("emailDB Add err:", err)
  95. return err
  96. }
  97. }
  98. }
  99. } else {
  100. err = errors.New("ID不能为0")
  101. }
  102. return
  103. }
  104. // AddEmails 添加邮件 存草稿|发送|删除
  105. // 只能删除草稿箱里的,
  106. func AddEmails(params *forms.EmailItemReq) (*forms.EmailItem, error) {
  107. lock.Lock()
  108. defer lock.Unlock()
  109. var row = new(forms.EmailItem)
  110. row.OperatorId = params.OperatorId
  111. if params.Id > 0 {
  112. mail, err := getEmailDB().Find(params.Id)
  113. if err != nil {
  114. return nil, err
  115. }
  116. if email, ok := mail.(*forms.EmailItem); ok {
  117. row = email
  118. copier.Copy(row, params)
  119. row.Title = strings.ReplaceAll(params.Title, "%", "")
  120. row.Content = strings.ReplaceAll(params.Content, "%", "")
  121. if email.Status == "已发送" || email.Status == "已删除" {
  122. return nil, errors.New("邮件状态无法编辑")
  123. }
  124. }
  125. } else {
  126. copier.Copy(row, params)
  127. row.Title = strings.ReplaceAll(params.Title, "%", "")
  128. row.Content = strings.ReplaceAll(params.Content, "%", "")
  129. }
  130. if params.Opt != "draft" {
  131. if params.SendWay == 1 {
  132. row.SendAt = time.Now().Unix()
  133. } else {
  134. if params.SendAt == "" {
  135. return nil, errors.New("发送时间不能为空")
  136. }
  137. stamp, _ := now.Parse(params.SendAt)
  138. row.SendAt = stamp.Unix()
  139. row.Status = "待发送"
  140. if row.SendAt == 0 {
  141. return nil, errors.New("发送时间不能为空")
  142. }
  143. }
  144. } else {
  145. if row.Status != "" {
  146. return nil, errors.New("邮件状态无法编辑")
  147. }
  148. if params.SendWay == 1 {
  149. row.SendAt = time.Now().Unix()
  150. } else {
  151. stamp, _ := now.Parse(params.SendAt)
  152. row.SendAt = stamp.Unix()
  153. }
  154. }
  155. err := getEmailDB().Add(row)
  156. if err != nil {
  157. return row, err
  158. }
  159. switch params.Opt {
  160. case "draft":
  161. // 存草稿
  162. case "send":
  163. // 发送邮件
  164. err = sendMail(row)
  165. }
  166. return row, err
  167. }
  168. func sendMail(params *forms.EmailItem) (err error) {
  169. if params.SendWay == 1 {
  170. // // 1 立即发送 0 待发送
  171. if err = sendLetterToWorld(params); err != nil {
  172. logrus.Error("emailDB sendLetterToWorld err:", err)
  173. return err
  174. }
  175. if err = getEmailDB().Add(params); err != nil {
  176. logrus.Error("emailDB Add err:", err)
  177. return err
  178. }
  179. }
  180. return
  181. }
  182. func sendLetterToWorld(params *forms.EmailItem) (err error) {
  183. /*var letter model.GlobalLetter
  184. copier.Copy(&letter, params)
  185. letter.Extra = makeExtData(params)
  186. letter.Type = 6
  187. letter.CreateTime = time.Now()
  188. letter.ExpireTime = time.Now().AddDate(0, 0, params.Expired)
  189. var (
  190. players []int64
  191. serverIds []int
  192. )
  193. serverIds = service.ServerOption.GetServerIds()
  194. switch params.RecieverType {
  195. case 1: // 全服
  196. msg := msg2.GMLetter{
  197. MsgId: character.GenerateMsgId(),
  198. Letter: &letter,
  199. Players: players,
  200. OperatorId: params.OperatorId,
  201. }
  202. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("%s,GM邮件(编号 %d) 投递成功,全服投递",
  203. utility.FormatSecond(time.Now()),
  204. params.Id)
  205. for _, serverId := range serverIds {
  206. DB, err := player.GetDBByServerID(serverId)
  207. if err != nil {
  208. logrus.Warnf("sendLetterToWorld GetDBByServerID err:%+v", err)
  209. continue
  210. }
  211. var resp *msg2.ResponseGMLetter
  212. res, err := config.GmNats.GmRequest(DB, "GMLetter", msg)
  213. if err != nil {
  214. logrus.Warnf("sendLetterToWorld GmRequest err:%+v", err)
  215. continue
  216. }
  217. if err = json.Unmarshal(res, &resp); err != nil {
  218. logrus.Warnf("sendLetterToWorld nats Unmarshal err:%+v", err)
  219. continue
  220. }
  221. rpc_share.LogChan <- rpc_share.LogMsg{
  222. MsgID: msg.MsgId,
  223. Data: resp,
  224. }
  225. }
  226. case 2: // 指定服
  227. serverIds := strings.Split(params.Recievers, ",")
  228. for _, serverId := range serverIds {
  229. sId := cast.ToInt(serverId)
  230. if sId > 0 {
  231. DB, err := player.GetDBByServerID(sId)
  232. if err != nil {
  233. logrus.Warnf("sendLetterToWorld2 GetDBByServerID2 err:%+v", err)
  234. continue
  235. }
  236. msg := msg2.GMLetter{
  237. MsgId: character.GenerateMsgId(),
  238. Letter: &letter,
  239. Players: players,
  240. OperatorId: params.OperatorId,
  241. }
  242. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("%s,GM邮件(编号 %d) 投递成功,投递服务器ID:%v",
  243. utility.FormatSecond(time.Now()), params.Id, sId)
  244. var resp *msg2.ResponseGMLetter
  245. res, err := config.GmNats.GmRequest(DB, "GMLetter", msg)
  246. if err != nil {
  247. logrus.Warnf("sendLetterToWorld2 GmRequest err:%+v", err)
  248. continue
  249. }
  250. if err = json.Unmarshal(res, &resp); err != nil {
  251. logrus.Warnf("sendLetterToWorld2 nats Unmarshal err:%+v", err)
  252. continue
  253. }
  254. rpc_share.LogChan <- rpc_share.LogMsg{
  255. MsgID: msg.MsgId,
  256. Data: resp,
  257. }
  258. }
  259. }
  260. case 3: // 指定玩家
  261. data := strings.Split(params.Recievers, ",")
  262. for _, v := range data {
  263. playerID := cast.ToInt64(v)
  264. if playerID > 0 {
  265. DB, err := player.GetDBByUserId(playerID)
  266. if err != nil {
  267. logrus.Warnf("sendLetterToWorld3 GetDBByUserId err:%+v", err)
  268. continue
  269. }
  270. msg := msg2.GMLetter{
  271. MsgId: character.GenerateMsgId(),
  272. Letter: &letter,
  273. Players: []int64{playerID},
  274. OperatorId: params.OperatorId,
  275. }
  276. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("%s,GM邮件(编号 %d) 投递成功,投递玩家ID:%v",
  277. utility.FormatSecond(time.Now()), params.Id, playerID)
  278. var resp *msg2.ResponseGMLetter
  279. res, err := config.GmNats.GmRequest(DB, "GMLetter", msg)
  280. if err != nil {
  281. logrus.Warnf("sendLetterToWorld3 GmRequest err:%+v", err)
  282. continue
  283. }
  284. if err = json.Unmarshal(res, &resp); err != nil {
  285. logrus.Warnf("sendLetterToWorld3 nats Unmarshal err:%+v", err)
  286. continue
  287. }
  288. rpc_share.LogChan <- rpc_share.LogMsg{
  289. MsgID: msg.MsgId,
  290. Data: resp,
  291. }
  292. }
  293. }
  294. }
  295. //if params.Recievers != "全员" {
  296. // data := strings.Split(params.Recievers, ",")
  297. // for _, v := range data {
  298. // playerID := cast.ToInt64(v)
  299. // if playerID > 0 {
  300. // players = append(players, playerID)
  301. // }
  302. // }
  303. //}
  304. //msg := msg2.GMLetter{
  305. // MsgId: character.GenerateMsgId(),
  306. // Letter: &letter,
  307. // Players: players,
  308. // OperatorId: params.OperatorId,
  309. //}
  310. //
  311. //err = gate.SendToWorld(0, &msg)
  312. //if err == nil {
  313. // rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("%s,GM邮件(编号 %d) 投递成功",
  314. // utility.FormatSecond(time.Now()),
  315. // params.Id)
  316. //}
  317. params.Status = "已发送"
  318. params.SentAt = time.Now().Unix()*/
  319. return
  320. }
  321. /*func makeExtData(params *forms.EmailItem) (data model.ExtraData) {
  322. var dim int64 = 1000000 //60306070
  323. for _, v := range params.Ext {
  324. uid := cast.ToInt64(v.Id)
  325. count := cast.ToInt(v.Count)
  326. if uid > dim {
  327. for i := 0; i < count; i++ {
  328. data.Equips = append(data.Equips, uid)
  329. }
  330. } else if uid > 0 {
  331. data.Materials = append(data.Materials, &model.DropMaterial{ID: uid, Count: count})
  332. }
  333. }
  334. return
  335. }*/