diff --git a/bot.go b/bot.go index 65d69a9..6f72994 100644 --- a/bot.go +++ b/bot.go @@ -32,6 +32,8 @@ func BotHandlers(b *tb.Bot) { b.Handle("/g_stock", botGStock) + b.Handle("/msg_export_all", botMsgExportAll) + b.Handle(tb.OnPhoto, botPhoto) b.Handle(tb.OnChannelPost, botChannelPost) b.Handle(tb.OnQuery, botQuery) @@ -179,6 +181,36 @@ func botMsgRescanAll(m *tb.Message) { return } +func botMsgExportAll(m *tb.Message) { + if !m.Private() { + return + } + + f, err := exportMessages() + logOnError(err, "botMsgExportAll : exportMessages") + if err != nil { + c := TGCommand{ + Type: commandReplyMsg, + Text: `Error exporting messages`, + FromMsgID64: int64(m.ID), + FromChatID64: m.Chat.ID, + } + TGCmdQueue <- c + + return + } + + c := TGCommand{ + Type: commandReplyFile, + File: f, + FromMsgID64: int64(m.ID), + FromChatID64: m.Chat.ID, + } + TGCmdQueue <- c + + return +} + func botMsgDump(m *tb.Message) { var res string r := regexp.MustCompile("^[0-9]+$") diff --git a/def.go b/def.go index 68c2b83..c8a46ba 100644 --- a/def.go +++ b/def.go @@ -8,6 +8,10 @@ import ( tb "gopkg.in/tucnak/telebot.v2" ) +type DataBackup struct { + Messages []ChatWarsMessage `json:"messages"` +} + type MQKeepAlive struct { UserID64 int64 `json:"user_id"` Nickname string `json:"nick"` @@ -32,13 +36,14 @@ type ChatWarsClient struct { } type TGCommand struct { - Type int64 `json:"type"` - FromChatID64 int64 `json:"from_chat_id"` - FromUserID64 int64 `json:"from_user_id"` - FromMsgID64 int64 `json:"from_msg_id"` - ToChatID64 int64 `json:"to_chat_id"` - ToUserID64 int64 `json:"to_user_id"` - Text string `json:"text"` + Type int64 `json:"type"` + FromChatID64 int64 `json:"from_chat_id"` + FromUserID64 int64 `json:"from_user_id"` + FromMsgID64 int64 `json:"from_msg_id"` + ToChatID64 int64 `json:"to_chat_id"` + ToUserID64 int64 `json:"to_user_id"` + Text string `json:"text"` + File tb.File `json:"file"` } type ChatWarsCastle struct { @@ -192,6 +197,10 @@ type Job struct { Payload []byte } +type JobPayloadMsgRefresh struct { + ObjID64 int64 `json:"obj_id"` +} + type JobPayloadPillage struct { ObjID64 int64 `json:"obj_id"` } @@ -235,6 +244,7 @@ const ( commandSendMsg = 3 commandDeleteMsg = 4 commandRefreshMsg = 5 + commandSendFile = 6 objTypeUser = 1 objTypeGuild = 2 @@ -331,6 +341,7 @@ const ( objSubTypeJobRescanMsg = 606 objSubTypeJobSetJobDone = 607 objSubTypeJobMsgClient = 608 + objSubTypeJobMsgRefresh = 609 objSubTypeItemResource = 701 objSubTypeItemAlch = 702 objSubTypeItemMisc = 703 diff --git a/items.go b/items.go index 5b1b6f1..03ed0e6 100644 --- a/items.go +++ b/items.go @@ -367,6 +367,8 @@ func resetObjItem() { reloadObjItem(`p20`, `Potion of Morph`, objSubTypeItemMisc, 1) // PROPAGATE TO WIKI reloadObjItem(`p21`, `Bottle of Morph`, objSubTypeItemMisc, 1) // PROPAGATE TO WIKI reloadObjItem(`pmp`, `Pumpkin`, objSubTypeItemMisc, -1) + reloadObjItem(`pol`, `Proof of Loyalty`, objSubTypeItemMisc, -1) + reloadObjItem(`tde`, `deerhorn earlooms`, objSubTypeItemMisc, -1) reloadObjItem(`r01`, `Champion Sword recipe`, objSubTypeItemRecipe, 10) reloadObjItem(`r02`, `Trident recipe`, objSubTypeItemRecipe, 10) reloadObjItem(`r03`, `Hunter Bow recipe`, objSubTypeItemRecipe, 10) diff --git a/msg.go b/msg.go index 2f16d32..9217636 100644 --- a/msg.go +++ b/msg.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "fmt" "log" "regexp" @@ -269,3 +270,42 @@ func parseSubTypeMessagePillageInc(m *ChatWarsMessage, r *regexp.Regexp) (*ChatW return &cwm, nil } + +func exportMessages() (tb.File, error) { + var f tb.File + bkp := DataBackup{} + ids := getSQLListID64(`SELECT om.obj_id id FROM obj_msg om;`) + for _, id := range ids { + m := getMsg(id) + append(bkp.Messages, m) + } + b, err := json.Marshal(bkp) + logOnError(err, "exportMessages : Marshal") + if err != nil { + return nil, err + } + + zbuf := new(bytes.Buffer) + zw := zip.NewWriter(zbuf) + zf, err := zw.Create(`backup.json`) + logOnError(err, "exportMessages : Create") + if err != nil { + return nil, err + } + + _, err = zf.Write(b) + logOnError(err, "exportMessages : Write") + if err != nil { + return nil, err + } + + err = zw.Close() + logOnError(err, "exportMessages : Close") + if err != nil { + return nil, err + } + + f = f.FromReader(bytes.NewReader(zbuf.Bytes())) + return f, nil + +} diff --git a/sql.go b/sql.go index c3f1b22..e6b8da6 100644 --- a/sql.go +++ b/sql.go @@ -417,6 +417,7 @@ func initDB() { ,(` + strconv.Itoa(objSubTypeJobRescanMsg) + `, "job_rescan_msg", "Rescan message job", ` + strconv.Itoa(objTypeJob) + `) ,(` + strconv.Itoa(objSubTypeJobSetJobDone) + `, "job_set_done", "Set job as done job", ` + strconv.Itoa(objTypeJob) + `) ,(` + strconv.Itoa(objSubTypeJobMsgClient) + `, "job_msg_client", "Send message via client", ` + strconv.Itoa(objTypeJob) + `) + ,(` + strconv.Itoa(objSubTypeJobMsgRefresh) + `, "job_msg_refresh", "Refresh message from client", ` + strconv.Itoa(objTypeJob) + `) ,(` + strconv.Itoa(objSubTypeItemResource) + `, "item_res", "Time", ` + strconv.Itoa(objTypeItem) + `) ,(` + strconv.Itoa(objSubTypeItemAlch) + `, "item_alch", "Time", ` + strconv.Itoa(objTypeItem) + `) ,(` + strconv.Itoa(objSubTypeItemMisc) + `, "item_misc", "Time", ` + strconv.Itoa(objTypeItem) + `) diff --git a/workers.go b/workers.go index db0bc16..658eb16 100644 --- a/workers.go +++ b/workers.go @@ -184,6 +184,13 @@ func SQLIdentifyMsgWorker(id int, objIds <-chan int64) { cwm.ObjID64 = objId err = insertMsgAuctionAnnounce(cwm) logOnError(err, "SQLIdentifyMsgWorker["+strconv.Itoa(id)+"] : insertMsgAuctionAnnounce") + if cwm.End.Add(15 * time.Second).After(time.Now()) { + p := JobPayloadMsgRefresh{ + ObjID64: m.ObjID64, + } + b, _ := json.Marshal(&p) + _, err = createJob(objSubTypeJobMsgRefresh, objJobPriority, m.UserID64, cwm.End.Add(15*time.Second).After(time.Now()), b) + } case objSubTypeMessageTimeAck: _, err := fromChatWarsDate(r.ReplaceAllString(m.Text, "${Day}") + " " + r.ReplaceAllString(m.Text, "${Month}") + " " + r.ReplaceAllString(m.Text, "${Year}") + " " + r.ReplaceAllString(m.Text, "${Hour}") + ":" + r.ReplaceAllString(m.Text, "${Minute}")) logOnError(err, "SQLIdentifyMsgWorker["+strconv.Itoa(id)+"] : fromChatWarsDate") @@ -264,6 +271,20 @@ func TGCmdWorker(id int, b *tb.Bot, cmds <-chan TGCommand) { _, err := b.Send(&ch, c.Text) logOnError(err, "TGCmdWorker["+strconv.Itoa(id)+"] : Send") } + case commandSendFile: + if c.ToChatID64 != 0 { + ch := tb.Chat{ + ID: c.ToChatID64, + } + _, err := b.Send(&ch, c.File) + logOnError(err, "TGCmdWorker["+strconv.Itoa(id)+"] : File") + } else if c.ToUserID64 != 0 { + ch := tb.Chat{ + ID: c.ToUserID64, + } + _, err := b.Send(&ch, c.File) + logOnError(err, "TGCmdWorker["+strconv.Itoa(id)+"] : File") + } default: } @@ -280,10 +301,10 @@ func MQTGCmdWorker(id int, cmds <-chan TGCommand) { logOnError(err, "MQTGCmdWorker["+strconv.Itoa(id)+"] : Marshal(c)") log.Printf("MQTGCmdWorker["+strconv.Itoa(id)+"] : new command.\n%s\n", string(j)) err = clientsQueue[c.FromUserID64].Channel.Publish( - "", // exchange + "", // exchange clientsQueue[c.FromUserID64].Queue.Name, // routing key - false, // mandatory - false, // immediate + false, // mandatory + false, // immediate amqp.Publishing{ ContentType: "application/json", Body: []byte(j),