670 lines
32 KiB
Go
670 lines
32 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"regexp"
|
|
"strconv"
|
|
)
|
|
|
|
func initDB() {
|
|
log.Println("Setting up database...")
|
|
|
|
tx, err := db.Begin()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer tx.Rollback()
|
|
|
|
_, err = tx.Exec("set foreign_key_checks = 0")
|
|
failOnError(err, "initDB : set foreign_key_checks = 0")
|
|
|
|
var name string
|
|
rows, err := db.Query("show tables")
|
|
failOnError(err, "initDB : show tables")
|
|
|
|
for rows.Next() {
|
|
err = rows.Scan(&name)
|
|
failOnError(err, "initDB : show tables listing")
|
|
|
|
_, err = tx.Exec("drop table " + name)
|
|
failOnError(err, "initDB : drop table "+name)
|
|
}
|
|
err = rows.Err()
|
|
failOnError(err, "initDB : show tables listing end")
|
|
rows.Close()
|
|
|
|
_, err = tx.Exec("set foreign_key_checks = 1")
|
|
failOnError(err, "initDB : set foreign_key_checks = 1")
|
|
|
|
err = tx.Commit()
|
|
failOnError(err, "initDB : commit cleanup")
|
|
|
|
log.Println("initDB : Database cleaned up")
|
|
|
|
_, err = db.Exec(`CREATE TABLE code_obj_type (
|
|
id SMALLINT UNSIGNED NOT NULL
|
|
,intl_id VARCHAR(32) NOT NULL
|
|
,name VARCHAR(80) NOT NULL
|
|
,PRIMARY KEY (id)
|
|
,UNIQUE KEY (intl_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table code_obj_type")
|
|
log.Println("initDB : code_obj_type created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE code_obj_sub_type (
|
|
id SMALLINT UNSIGNED NOT NULL
|
|
,intl_id VARCHAR(32) NOT NULL
|
|
,name VARCHAR(80) NOT NULL
|
|
,obj_type_id SMALLINT UNSIGNED NOT NULL
|
|
,PRIMARY KEY (id)
|
|
,UNIQUE KEY (intl_id)
|
|
,FOREIGN KEY (obj_type_id) REFERENCES code_obj_type(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table code_obj_sub_type")
|
|
log.Println("initDB : code_obj_sub_type created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj (
|
|
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
|
|
,obj_type_id SMALLINT UNSIGNED NOT NULL
|
|
,obj_sub_type_id SMALLINT UNSIGNED NOT NULL
|
|
,timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
,PRIMARY KEY (id)
|
|
,FOREIGN KEY (obj_type_id) REFERENCES code_obj_type(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (obj_sub_type_id) REFERENCES code_obj_sub_type(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj")
|
|
log.Println("initDB : obj created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_castle (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,logo VARCHAR(32) NOT NULL
|
|
,name VARCHAR(80) NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_castle")
|
|
log.Println("initDB : obj_guild created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_guild (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,tag VARCHAR(32) NOT NULL
|
|
,name VARCHAR(80) NOT NULL
|
|
,chat_id BIGINT
|
|
,deposit_chat_id BIGINT
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_guild")
|
|
log.Println("initDB : obj_guild created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_user (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,name VARCHAR(80) NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_user")
|
|
log.Println("initDB : obj_user created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_war (
|
|
obj_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
|
|
,start_time DATETIME NOT NULL
|
|
,end_time DATETIME NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_war")
|
|
log.Println("initDB : obj_war created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,msg_id BIGINT NOT NULL
|
|
,chat_id BIGINT NOT NULL
|
|
,user_id BIGINT NOT NULL
|
|
,sender_user_id BIGINT NOT NULL
|
|
,date DATETIME NOT NULL
|
|
,text VARCHAR(4096) NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,UNIQUE KEY (msg_id, chat_id, sender_user_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg")
|
|
log.Println("initDB : obj_msg created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_pillage_inc (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,attacker VARCHAR(32)
|
|
,guild VARCHAR(32)
|
|
,castle_id BIGINT UNSIGNED NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (castle_id) REFERENCES obj_castle(obj_id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_report")
|
|
log.Println("initDB : obj_msg_report created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_report (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,war_id BIGINT UNSIGNED NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (war_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_report")
|
|
log.Println("initDB : obj_msg_report created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_war_report (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,user_id BIGINT UNSIGNED NOT NULL
|
|
,war_id BIGINT UNSIGNED NOT NULL
|
|
,attack SMALLINT UNSIGNED NOT NULL
|
|
,defense SMALLINT UNSIGNED NOT NULL
|
|
,gold SMALLINT UNSIGNED NOT NULL
|
|
,stock SMALLINT UNSIGNED NOT NULL
|
|
,exp SMALLINT UNSIGNED NOT NULL
|
|
,stamina TINYINT NOT NULL
|
|
,crit TINYINT NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (war_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,UNIQUE KEY (user_id, war_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_war_report")
|
|
log.Println("initDB : obj_war_report created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_auction_announce (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,lot_id BIGINT UNSIGNED NOT NULL
|
|
,item_id BIGINT UNSIGNED
|
|
,cond VARCHAR(32)
|
|
,quality VARCHAR(32)
|
|
,seller_castle_id BIGINT UNSIGNED
|
|
,seller_guild_id BIGINT UNSIGNED
|
|
,seller_id BIGINT UNSIGNED
|
|
,buyer_castle_id BIGINT UNSIGNED
|
|
,buyer_guild_id BIGINT UNSIGNED
|
|
,buyer_id BIGINT UNSIGNED
|
|
,price SMALLINT NOT NULL
|
|
,status VARCHAR(32)
|
|
,end DATETIME NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,KEY (lot_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_auction_announce")
|
|
log.Println("initDB : obj_msg_auction_announce created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_mini_war (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,date DATETIME NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,UNIQUE KEY (date)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_mini_war")
|
|
log.Println("initDB : obj_msg_mini_war created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_mini_war_castle (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,castle_id BIGINT UNSIGNED NOT NULL
|
|
,gardian TINYINT NOT NULL
|
|
,result VARCHAR(8)
|
|
,gold INT NOT NULL
|
|
,stock INT NOT NULL
|
|
,points INT NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (castle_id) REFERENCES obj_castle(obj_id) ON DELETE CASCADE
|
|
,UNIQUE KEY (obj_id, castle_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_mini_war_castle")
|
|
log.Println("initDB : obj_msg_mini_war_castle created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_duel_fight (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,win_castle_id BIGINT UNSIGNED NOT NULL
|
|
,win_guild_id BIGINT UNSIGNED
|
|
,win_user_id BIGINT UNSIGNED NOT NULL
|
|
,win_life SMALLINT NOT NULL
|
|
,loss_castle_id BIGINT UNSIGNED NOT NULL
|
|
,loss_guild_id BIGINT UNSIGNED
|
|
,loss_user_id BIGINT UNSIGNED NOT NULL
|
|
,loss_life SMALLINT NOT NULL
|
|
,exp INT UNSIGNED NOT NULL
|
|
,weapon VARCHAR(80)
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,FOREIGN KEY (win_castle_id) REFERENCES obj_castle(obj_id) ON DELETE CASCADE
|
|
,FOREIGN KEY (loss_castle_id) REFERENCES obj_castle(obj_id) ON DELETE CASCADE
|
|
,FOREIGN KEY (win_guild_id) REFERENCES obj_guild(obj_id) ON DELETE CASCADE
|
|
,FOREIGN KEY (loss_guild_id) REFERENCES obj_guild(obj_id) ON DELETE CASCADE
|
|
,FOREIGN KEY (win_user_id) REFERENCES obj_user(obj_id) ON DELETE CASCADE
|
|
,FOREIGN KEY (loss_user_id) REFERENCES obj_user(obj_id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_duel_fight")
|
|
log.Println("initDB : obj_msg_duel_fight created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_auction_upd_req (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,lot_id BIGINT UNSIGNED NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,KEY (lot_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_auction_upd_req")
|
|
log.Println("initDB : obj_msg_auction_upd_req created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_msg_auction_upd_ack (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,seller VARCHAR(32)
|
|
,buyer VARCHAR(32)
|
|
,item VARCHAR(80)
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_msg_auction_upd_ack")
|
|
log.Println("initDB : obj_msg_auction_upd_ack created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE msg_rules (
|
|
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT
|
|
,prio SMALLINT NOT NULL
|
|
,descn VARCHAR(32) NOT NULL
|
|
,rule VARCHAR(4096) NOT NULL
|
|
,msg_type_id SMALLINT UNSIGNED NOT NULL
|
|
,UNIQUE KEY (id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table msg_rules")
|
|
log.Println("initDB : msg_rules created ...")
|
|
|
|
_, err = db.Exec(`CREATE TABLE obj_item (
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,intl_id VARCHAR(32)
|
|
,name VARCHAR(80)
|
|
,weight SMALLINT NOT NULL
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,UNIQUE KEY (intl_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
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
|
|
,user_id BIGINT UNSIGNED NOT NULL
|
|
,status SMALLINT NOT NULL
|
|
,schedule DATETIME NOT NULL
|
|
,is_done TINYINT NOT NULL
|
|
,in_work TINYINT NOT NULL
|
|
,seq_nr BIGINT UNSIGNED
|
|
,inserted TIMESTAMP
|
|
,pulled TIMESTAMP
|
|
,started TIMESTAMP
|
|
,ended TIMESTAMP
|
|
,payload VARCHAR(4000)
|
|
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
|
,KEY (is_done)
|
|
,KEY (in_work)
|
|
,KEY (user_id)
|
|
) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;`)
|
|
failOnError(err, "initDB : create table obj_job")
|
|
log.Println("initDB : obj_job created ...")
|
|
|
|
_, err = db.Exec(`INSERT INTO code_obj_type (id, intl_id, name)
|
|
VALUES (` + strconv.Itoa(objTypeUser) + `, "user", "User")
|
|
,(` + strconv.Itoa(objTypeGuild) + `, "guild", "Guild")
|
|
,(` + strconv.Itoa(objTypeMessage) + `, "msg", "Message")
|
|
,(` + strconv.Itoa(objTypeWar) + `, "war", "War")
|
|
,(` + strconv.Itoa(objTypeWarReport) + `, "war_report", "War Report")
|
|
,(` + strconv.Itoa(objTypeJob) + `, "job", "Job")
|
|
,(` + strconv.Itoa(objTypeItem) + `, "item", "Item")
|
|
,(` + strconv.Itoa(objTypeCastle) + `, "castle", "Castle")
|
|
,(` + strconv.Itoa(objTypeFair) + `, "fair", "Fair")
|
|
,(` + strconv.Itoa(objTypeUnion) + `, "union", "Trade Union")
|
|
,(` + strconv.Itoa(objTypeTribute) + `, "tribute", "Tribute")
|
|
,(` + strconv.Itoa(objTypeExperience) + `, "xp", "Experience")
|
|
;`)
|
|
failOnError(err, "initDB : populate table code_obj_type")
|
|
log.Println("initDB : code_obj_type populated ...")
|
|
|
|
_, 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(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) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGuildWar) + `, "guild_war", "Guilds war report", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageReportReq) + `, "report_req", "Player war report request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageReportAck) + `, "report_ack", "Player war report ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGReportReq) + `, "g_report_req", "Player guilds war report request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGReportAck) + `, "g_report_ack", "Player guilds war report ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageQuestResult) + `, "quest_res", "Quest result", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageDuelFight) + `, "duel_fight", "Duel fight result", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageHeroReq) + `, "hero_req", "Hero summary request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageHeroAck) + `, "hero_ack", "Hero summary ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageMeReq) + `, "me_req", "Hero short summary request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageMeAck) + `, "me_ack", "Hero short summary ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageInventoryReq) + `, "inv_req", "Inventory request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageInventoryAck) + `, "inv_ack", "Inventory ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePillageInc) + `, "pillage_inc", "Pillage incoming", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePillageGo) + `, "pillage_go", "Pillage go", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePillageTimeout) + `, "pillage_timeout", "Pillage timeout", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePillageWin) + `, "pillage_win", "Pillage win", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePillageLoss) + `, "pillage_loss", "Pillage loss", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTributeInc) + `, "tribute_inc", "Tribute incoming", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTributeAck) + `, "tribute_ack", "Tribute acknowledged", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageAuctionAnnounce) + `, "auction_announce", "Auction announce", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageAuctionUpdReq) + `, "auction_upd_req", "Auction update request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageAuctionUpdAck) + `, "auction_upd_ack", "Auction update acknowledgment", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTimeAck) + `, "time_ack", "Time Acknowledgment", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTimeReq) + `, "time_req", "Time Request", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGo) + `, "go", "Go", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessagePledge) + `, "pledge", "Pledge", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGoQuest) + `, "go_quest", "Go quest", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGoFastFight) + `, "fast_fight", "Arena fast fight", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGoArena) + `, "go_arena", "Go arena", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTop) + `, "top", "Top", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageMenu) + `, "menu", "Menu", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageBuyReq) + `, "buy_req", "Sell Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageSellReq) + `, "sell_req", "Buy Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageOrderbookReq) + `, "orderbook_req", "Orderbook Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageOrderbookAck) + `, "orderbook_acl", "Orderbook Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageWithdrawReq) + `, "withdraw_req", "Withdraw Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageWithdrawCode) + `, "withdraw_code", "Withdraw Code", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageWithdrawRcv) + `, "withdraw_rcv", "Withdraw Received", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageDepositReq) + `, "deposit_req", "Deposit Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageDepositAck) + `, "deposit_ack", "Deposit Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageStockReq) + `, "stock_req", "Stock Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageStockAck) + `, "stock_ack", "Stock Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageMiscReq) + `, "misc_req", "Misc Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMEssageMiscAck) + `, "misc_ack", "Misc Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTUReportReq) + `, "tureport_req", "Trade Union War Report Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTUReportAck) + `, "tureport_ack", "Trade Union War Report Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageUnionWar) + `, "union_war", "Union war report", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageTimeout) + `, "timeout", "Generic timeout", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGoQuestAck) + `, "go_quest_ack", "Go Quest Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGRolesReq) + `, "groles_req", "Guild roles Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGRolesAck) + `, "groles_ack", "Guild roles Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockResReq) + `, "gstock_res_req", "GStock Res Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockAlchReq) + `, "gstock_alch_req", "GStock Alch Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockMiscReq) + `, "gstock_misc_req", "GStock Misc Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockRecReq) + `, "gstock_rec_req", "GStock Rec Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockPartReq) + `, "gstock_part_req", "GStock Part Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockOthReq) + `, "gstock_oth_req", "Gstock Oth Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockAnyAck) + `, "gstock_any_ack", "Gstock Any Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockReq) + `, "gstock_req", "GStock Req", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeMessageGStockAck) + `, "gstock_ack", "GStock Ack", ` + strconv.Itoa(objTypeMessage) + `)
|
|
,(` + strconv.Itoa(objSubTypeJobPillage) + `, "job_pillage", "Pillage job", ` + strconv.Itoa(objTypeJob) + `)
|
|
,(` + strconv.Itoa(objSubTypeJobTribute) + `, "job_tribute", "Tribute job", ` + strconv.Itoa(objTypeJob) + `)
|
|
,(` + strconv.Itoa(objSubTypeJobWithdrawal) + `, "job_withdraw", "Withdrawal job", ` + strconv.Itoa(objTypeJob) + `)
|
|
,(` + strconv.Itoa(objSubTypeJobGStock) + `, "job_gstock", "GStock job", ` + strconv.Itoa(objTypeJob) + `)
|
|
,(` + 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) + `)
|
|
,(` + 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) + `, "tribute", "Tribute", ` + strconv.Itoa(objTypeTribute) + `)
|
|
,(` + strconv.Itoa(objSubTypeExperience) + `, "xp", "Experience", ` + strconv.Itoa(objTypeExperience) + `)
|
|
;`)
|
|
failOnError(err, "initDB : populate table code_obj_sub_type")
|
|
log.Println("initDB : code_obj_sub_type populated ...")
|
|
|
|
log.Println("initDB : Database set up")
|
|
}
|
|
|
|
func getMsg(objId int64) (*ChatWarsMessage, error) {
|
|
var m *ChatWarsMessage
|
|
|
|
stmt, err := db.Prepare(`SELECT om.msg_id, om.chat_id, om.user_id, om.sender_user_id, om.date, om.text FROM obj_msg om WHERE om.obj_id = ?`)
|
|
if err != nil {
|
|
return m, err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
m = new(ChatWarsMessage)
|
|
|
|
err = stmt.QueryRow(objId).Scan(&m.ID64, &m.ChatID64, &m.UserID64, &m.SenderUserID64, &m.Date, &m.Text)
|
|
if err != nil {
|
|
return m, err
|
|
}
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func insertMsgReport(objId int64, war_date int32, atk int32, def int32, exp int32, gold int32, stock int32, crit bool, stamina bool) error {
|
|
objSubTypeId, err := getObjSubTypeId(objId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if objSubTypeId != objSubTypeMessageUnknown {
|
|
return errors.New("Message is not of type Unknown")
|
|
}
|
|
/*
|
|
obj_id BIGINT UNSIGNED NOT NULL
|
|
,war_date TIMESTAMP NOT NULL
|
|
,attack SMALLINT UNSIGNED NOT NULL
|
|
,defense SMALLINT UNSIGNED NOT NULL
|
|
,gold SMALLINT UNSIGNED NOT NULL
|
|
,stock MALLINT UNSIGNED NOT NULL
|
|
,exp SMALLINT UNSIGNED NOT NULL
|
|
,stamina TINYINT NOT NULL
|
|
,crit TINYINT NOT NULL
|
|
|
|
stmt, err := db.Prepare(`INSERT INTO obj_msg_report (obj_id, war_date, attack, defense, gold, stock, exp, stamina, crit)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?FROM_UNIXTIME(?), ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
_, err = stmt.Exec(objId, m.ID64, m.ChatID64, m.UserID64, m.SenderUserID64, m.Date, m.Text)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*/
|
|
return nil
|
|
}
|
|
|
|
func insertMsgDuelFight(m *ChatWarsMessageDuelFight) error {
|
|
objSubTypeId, err := getObjSubTypeId(m.ObjID64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if objSubTypeId != objSubTypeMessageUnknown && objSubTypeId != objSubTypeMessageDuelFight {
|
|
return errors.New("Message type mismatch")
|
|
}
|
|
|
|
stmt, err := db.Prepare(`INSERT INTO obj_msg_duel_fight (obj_id, win_castle_id, win_guild_id, win_user_id, win_life, loss_castle_id, loss_guild_id, loss_user_id, loss_life, weapon)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
_, err = stmt.Exec(m.ObjID64, getObjCastleID(m.WinCastle), getObjGuildID(m.WinGuild), getObjUserID(m.WinUser), m.WinLife, getObjCastleID(m.LossCastle), getObjGuildID(m.LossGuild), getObjUserID(m.LossUser), m.LossLife, m.Weapon)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func insertMsgAuctionAnnounce(m *ChatWarsMessageAuctionAnnounce) error {
|
|
objSubTypeId, err := getObjSubTypeId(m.ObjID64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if objSubTypeId != objSubTypeMessageUnknown && objSubTypeId != objSubTypeMessageAuctionAnnounce {
|
|
return errors.New("Message type mismatch")
|
|
}
|
|
|
|
stmt, err := db.Prepare(`INSERT INTO obj_msg_auction_announce (obj_id, lot_id, item_id, cond, quality, seller_id, seller_guild_id, seller_castle_id, buyer_id, buyer_guild_id, buyer_castle_id, price, status, end)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
_, err = stmt.Exec(m.ObjID64, m.LotID, m.ItemID64, m.Cond, m.Quality, m.SellerUserID64, m.SellerGuildID64, m.SellerCastleID64, m.BuyerUserID64, m.BuyerGuildID64, m.BuyerCastleID64, m.Price, m.Status, m.End)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func insertMsgMiniWar(m *ChatWarsMessageMiniWar) error {
|
|
objSubTypeId, err := getObjSubTypeId(m.ObjID64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if objSubTypeId != objSubTypeMessageUnknown && objSubTypeId != objSubTypeMessageMiniWar {
|
|
return errors.New("Message type mismatch")
|
|
}
|
|
|
|
stmt1, err := db.Prepare(`INSERT INTO obj_msg_mini_war (obj_id, date)
|
|
VALUES (?, ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt1.Close()
|
|
|
|
_, err = stmt1.Exec(m.ObjID64, m.Time)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
stmt2, err := db.Prepare(`INSERT INTO obj_msg_mini_war_castle (obj_id, castle_id, gardian, result, gold, stock, points)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt2.Close()
|
|
|
|
for c, r := range m.Report {
|
|
_, err = stmt2.Exec(m.ObjID64, getObjCastleID(c), r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func insertMsgPillageInc(m *ChatWarsMessagePillageInc) error {
|
|
objSubTypeId, err := getObjSubTypeId(m.ObjID64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if objSubTypeId != objSubTypeMessageUnknown && objSubTypeId != objSubTypeMessagePillageInc {
|
|
return errors.New("Message type mismatch")
|
|
}
|
|
|
|
stmt, err := db.Prepare(`INSERT INTO obj_msg_pillage_inc (obj_id, attacker, guild, castle_id)
|
|
VALUES (?, ?, ?, ?);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
_, err = stmt.Exec(m.ObjID64, m.Attacker, m.Guild, getObjCastleID(m.Castle))
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func loadMsgParsingRules() (m map[int]MessageParsingRule, err error) {
|
|
var (
|
|
id int32
|
|
priority int32
|
|
descn string
|
|
rule string
|
|
msgTypeID int64
|
|
)
|
|
|
|
log.Println("Loading message parsing rules...")
|
|
m = make(map[int]MessageParsingRule)
|
|
count := int(0)
|
|
|
|
defer func() {
|
|
if rec := recover(); rec != nil {
|
|
log.Println("Error parsing rules : ", rec)
|
|
err = errors.New("panic")
|
|
}
|
|
}()
|
|
|
|
rules, err := db.Query(`SELECT r.id, r.prio, r.descn, r.rule, r.msg_type_id FROM msg_rules r ORDER BY r.prio DESC;`)
|
|
if err != nil {
|
|
return m, err
|
|
}
|
|
defer rules.Close()
|
|
|
|
for rules.Next() {
|
|
err = rules.Scan(&id, &priority, &descn, &rule, &msgTypeID)
|
|
if err != nil {
|
|
return m, err
|
|
}
|
|
i := new(MessageParsingRule)
|
|
i.ID = id
|
|
i.Priority = priority
|
|
i.Description = descn
|
|
i.Rule = rule
|
|
i.MsgTypeID = msgTypeID
|
|
i.re = regexp.MustCompile(rule)
|
|
m[count] = *i
|
|
// log.Printf("New rule : %s\n", rule)
|
|
count++
|
|
}
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func getSQLListID64(q string) []int64 {
|
|
var (
|
|
id int64
|
|
ids []int64
|
|
)
|
|
|
|
rows, err := db.Query(q)
|
|
s := fmt.Sprintf("getSQLListID64 : Query(%s)", q)
|
|
logOnError(err, s)
|
|
|
|
for rows.Next() {
|
|
err = rows.Scan(&id)
|
|
logOnError(err, "getSQLListID64 : scan next val")
|
|
ids = append(ids, id)
|
|
}
|
|
err = rows.Err()
|
|
logOnError(err, "getSQLListID64 : query end")
|
|
rows.Close()
|
|
|
|
return ids
|
|
}
|