diff --git a/README.md b/README.md index 100b5cc..81aa6c3 100644 --- a/README.md +++ b/README.md @@ -1 +1,8 @@ -ChirpNestBot \ No newline at end of file +ChirpNestBot + +- [ ] Crontab : engine, user interface +- [ ] Impersonate +- [ ] Items parsing/identification +- [ ] Withdrawal bot +- [x] Foray interception +- [ ] Tribute interception \ No newline at end of file diff --git a/def.go b/def.go index e326c60..d45dc66 100644 --- a/def.go +++ b/def.go @@ -77,6 +77,9 @@ type ChatWarsMessageMeAck struct { UserID64 int64 `json:"user_id"` GuildID64 int64 `json:"guild_id"` State string `json:"state"` + Level int64 `json:"level"` + ExpVal int64 `json:"exp_val"` + ExpTarget int64 `json:"exp_target"` } type ChatWarsMessageGRolesAck struct { @@ -208,16 +211,18 @@ const ( commandDeleteMsg = 4 commandRefreshMsg = 5 - objTypeUser = 1 - objTypeGuild = 2 - objTypeMessage = 3 - objTypeWar = 4 - objTypeWarReport = 5 - objTypeJob = 6 - objTypeItem = 7 - objTypeCastle = 8 - objTypeFair = 9 - objTypeUnion = 10 + objTypeUser = 1 + objTypeGuild = 2 + objTypeMessage = 3 + objTypeWar = 4 + objTypeWarReport = 5 + objTypeJob = 6 + objTypeItem = 7 + objTypeCastle = 8 + objTypeFair = 9 + objTypeUnion = 10 + objTypeTribute = 11 + objTypeExperience = 12 castleDeer = 1 castleDragon = 2 @@ -301,6 +306,8 @@ const ( objSubTypeCastle = 801 objSubTypeFair = 901 objSubTypeUnion = 1001 + objSubTypeTribute = 1101 + objSubTypeExperience = 1201 objJobStatusNew = 0 objJobStatusPillageGo = 1 diff --git a/msg.go b/msg.go index dd75a17..1df35a5 100644 --- a/msg.go +++ b/msg.go @@ -31,11 +31,20 @@ func parseSubTypeMessageReportAck(m *ChatWarsMessage, r *regexp.Regexp) (*ChatWa } func parseSubTypeMessageMeAck(m *ChatWarsMessage, r *regexp.Regexp) (*ChatWarsMessageMeAck, error) { + var i int64 + cwm := ChatWarsMessageMeAck{ UserID64: getObjUserID(r.ReplaceAllString(m.Text, "${Player}")), GuildID64: getObjGuildID(r.ReplaceAllString(m.Text, "${Guild}")), State: r.ReplaceAllString(m.Text, "${State}"), } + i, _ := strconv.ParseInt(r.ReplaceAllString(m.Text, "${ExpNow}"), 10, 64) + cwm.ExpNow = i + i, _ := strconv.ParseInt(r.ReplaceAllString(m.Text, "${ExpLvl}"), 10, 64) + cwm.ExpLvl = i + i, _ := strconv.ParseInt(r.ReplaceAllString(m.Text, "${Level}"), 10, 64) + cwm.Level = i + /* log.Printf("parseSubTypeMessageReport : Me report identified\n") log.Printf("parseSubTypeMessageReport : Class : %s\n", r.ReplaceAllString(m.Text, "${Class}")) diff --git a/obj.go b/obj.go index 7c0b8b4..d2a4c6d 100644 --- a/obj.go +++ b/obj.go @@ -95,7 +95,7 @@ func addObjMsg(msgID64 int64, msgChatID64 int64, msgUserID64 int64, msgSenderUse logOnError(err, "addObjMsg : exec insert obj_msg") if err != nil { err2 := tx.Rollback() - logOnError(err2, "addObjMsg : rollback exec insert obj") + logOnError(err2, "addObjMsg : rollback exec insert obj_msg") return 0, err } @@ -144,7 +144,7 @@ func addObjCastle(logo string, name string) (int64, error) { logOnError(err, "addObjCastle : exec insert obj_castle") if err != nil { err2 := tx.Rollback() - logOnError(err2, "addObjCastle : rollback exec insert obj") + logOnError(err2, "addObjCastle : rollback exec insert obj_castle") return 0, err } @@ -228,7 +228,7 @@ func addObjGuild(tag string, name string) (int64, error) { logOnError(err, "addObjGuild : exec insert obj_guild") if err != nil { err2 := tx.Rollback() - logOnError(err2, "addObjGuild : rollback exec insert obj") + logOnError(err2, "addObjGuild : rollback exec insert obj_guild") return 0, err } @@ -322,7 +322,7 @@ func addObjUser(name string) (int64, error) { logOnError(err, "addObjUser : exec insert obj_user") if err != nil { err2 := tx.Rollback() - logOnError(err2, "addObjUser : rollback exec insert obj") + logOnError(err2, "addObjUser : rollback exec insert obj_user") return 0, err } @@ -384,3 +384,52 @@ func getObjMsgDate(objID64 int64) (time.Time, error) { return m.Date, nil } } + +func addObjXP(userID64 int64, val int64, target int64, level int64, date time.Time) (int64, error) { + tx, err := db.Begin() + logOnError(err, "addObjXP : start transaction") + if err != nil { + return 0, err + } + + res, err := tx.Exec(`INSERT INTO obj (obj_type_id, obj_sub_type_id) + VALUES (` + strconv.Itoa(objTypeExperience) + `,` + strconv.Itoa(objSubTypeExperience) + `);`) + logOnError(err, "addObjXP : exec insert obj") + if err != nil { + err2 := tx.Rollback() + logOnError(err2, "addObjXP : rollback insert obj") + return 0, err + } + + objId, err := res.LastInsertId() + if err != nil { + err2 := tx.Rollback() + logOnError(err2, "addObjXP : rollback get lastInsertId") + return 0, err + } + + stmt, err := tx.Prepare(`INSERT INTO obj_xp (obj_id, user_id, val, target, level, date) + VALUES (?, ?, ?, ?, ?, ?);`) + logOnError(err, "addObjXP : prepare insert obj_xp") + if err != nil { + err2 := tx.Rollback() + logOnError(err2, "addObjXP : rollback prepare insert obj_xp") + return 0, err + } + defer stmt.Close() + + _, err = stmt.Exec(objId, userID64, val, target, level, date) + logOnError(err, "addObjXP : exec insert obj_xp") + if err != nil { + err2 := tx.Rollback() + logOnError(err2, "addObjXP : rollback exec insert obj_xp") + return 0, err + } + + err = tx.Commit() + logOnError(err, "addObjXP : commit") + if err != nil { + return 0, err + } + return objId, nil +} diff --git a/sql.go b/sql.go index 3870640..a890909 100644 --- a/sql.go +++ b/sql.go @@ -271,6 +271,35 @@ func initDB() { failOnError(err, "initDB : create table obj_item") log.Println("initDB : obj_item created ...") + _, err = db.Exec(`CREATE TABLE obj_tribute ( + obj_id BIGINT UNSIGNED NOT NULL + ,user_id BIGINT UNSIGNED NOT NULL + ,item_id BIGINT UNSIGNED NOT NULL + ,quantity SMALLINT NOT NULL + ,xp SMALLINT NOT NULL + ,date DATETIME NOT NULL + ,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE + ,FOREIGN KEY (user_id) REFERENCES obj_user(obj_id) ON DELETE CASCADE + ,FOREIGN KEY (item_id) REFERENCES obj_item(obj_id) ON DELETE CASCADE + ,UNIQUE KEY (user_id, date) + ) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`) + failOnError(err, "initDB : create table obj_tribute") + log.Println("initDB : obj_tribute created ...") + + _, err = db.Exec(`CREATE TABLE obj_xp ( + obj_id BIGINT UNSIGNED NOT NULL + ,user_id BIGINT UNSIGNED NOT NULL + ,val BIGINT UNSIGNED NOT NULL + ,target BIGINT UNSIGNED NOT NULL + ,level SMALLINT UNSIGNED NOT NULL + ,date DATETIME NOT NULL + ,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE + ,FOREIGN KEY (user_id) REFERENCES obj_user(obj_id) ON DELETE CASCADE + ,UNIQUE KEY (user_id, date) + ) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`) + failOnError(err, "initDB : create table obj_xp") + log.Println("initDB : obj_xp created ...") + _, err = db.Exec(`CREATE TABLE obj_job ( obj_id BIGINT UNSIGNED NOT NULL ,priority SMALLINT NOT NULL @@ -311,9 +340,6 @@ func initDB() { _, err = db.Exec(`INSERT INTO code_obj_sub_type (id, intl_id, name, obj_type_id) VALUES (` + strconv.Itoa(objSubTypeUser) + `, "user", "User", ` + strconv.Itoa(objTypeUser) + `) ,(` + strconv.Itoa(objSubTypeGuild) + `, "guild", "Guild", ` + strconv.Itoa(objTypeGuild) + `) - ,(` + strconv.Itoa(objSubTypeCastle) + `, "castle", "Castle", ` + strconv.Itoa(objTypeCastle) + `) - ,(` + strconv.Itoa(objSubTypeUnion) + `, "union", "Union", ` + strconv.Itoa(objTypeUnion) + `) - ,(` + strconv.Itoa(objSubTypeFair) + `, "fair", "Fair", ` + strconv.Itoa(objTypeFair) + `) ,(` + strconv.Itoa(objSubTypeMessageUnknown) + `, "unknown", "Unknown", ` + strconv.Itoa(objTypeMessage) + `) ,(` + strconv.Itoa(objSubTypeMessageWar) + `, "war", "War report", ` + strconv.Itoa(objTypeMessage) + `) ,(` + strconv.Itoa(objSubTypeMessageMiniWar) + `, "mini_war", "Mini war reprot", ` + strconv.Itoa(objTypeMessage) + `) @@ -382,6 +408,11 @@ func initDB() { ,(` + strconv.Itoa(objSubTypeItemRecipe) + `, "item_recipe", "Time", ` + strconv.Itoa(objTypeItem) + `) ,(` + strconv.Itoa(objSubTypeItemPart) + `, "item_part", "Time", ` + strconv.Itoa(objTypeItem) + `) ,(` + strconv.Itoa(objSubTypeItemOther) + `, "item_other", "Time", ` + strconv.Itoa(objTypeItem) + `) + ,(` + strconv.Itoa(objSubTypeCastle) + `, "castle", "Castle", ` + strconv.Itoa(objTypeCastle) + `) + ,(` + strconv.Itoa(objSubTypeUnion) + `, "union", "Union", ` + strconv.Itoa(objTypeUnion) + `) + ,(` + strconv.Itoa(objSubTypeFair) + `, "fair", "Fair", ` + strconv.Itoa(objTypeFair) + `) + ,(` + strconv.Itoa(objSubTypeTribute) + `, "fair", "Fair", ` + strconv.Itoa(objTypeTribute) + `) + ,(` + strconv.Itoa(objSubTypeExperience) + `, "fair", "Fair", ` + strconv.Itoa(objTypeExperience) + `) ;`) failOnError(err, "initDB : populate table code_obj_sub_type") log.Println("initDB : code_obj_sub_type populated ...") diff --git a/workers.go b/workers.go index abdb435..52a87ed 100644 --- a/workers.go +++ b/workers.go @@ -145,6 +145,8 @@ func SQLIdentifyMsgWorker(id int, objIds <-chan int64) { logOnError(err, "SQLIdentifyMsgWorker["+strconv.Itoa(id)+"] : Parsing objSubTypeMessageMeAck.") cwm.Msg = m clientMsgMeAck(cwm) + _, err = addObjXP(cwm.UserID64, cwm.ExpVal, cwm.ExpTarget, cwm.Level, m.Date) + logOnError(err, "SQLIdentifyMsgWorker["+strconv.Itoa(id)+"] : addObjXP(MeAck)") err = setObjSubTypeId(objId, objSubTypeMessageMeAck) logOnError(err, "SQLIdentifyMsgWorker["+strconv.Itoa(id)+"] : setObjSubTypeId(MeAck)") case objSubTypeMessageGoQuestAck: