1771 lines
57 KiB
Go
1771 lines
57 KiB
Go
package main
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"log"
|
||
"regexp"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
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)
|
||
) 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)
|
||
,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 code_obj_castle (
|
||
id SMALLINT UNSIGNED NOT NULL
|
||
,user_id VARCHAR(32) NOT NULL
|
||
,intl_id VARCHAR(32) NOT NULL
|
||
,name VARCHAR(80) NOT NULL
|
||
,PRIMARY KEY (id)
|
||
) 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 (
|
||
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_user (
|
||
obj_id BIGINT UNSIGNED NOT NULL
|
||
,telegram_id BIGINT UNSIGNED NOT NULL
|
||
,user_id VARCHAR(32) NOT NULL
|
||
,name VARCHAR(80) NOT NULL
|
||
,guild_id BIGINT UNSIGNED
|
||
,last_msg TIMESTAMP
|
||
,busy_until TIMESTAMP
|
||
,role ENUM('commander', 'bartender', 'squire', 'none')
|
||
,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_guild (
|
||
obj_id BIGINT UNSIGNED NOT NULL
|
||
,tag VARCHAR(32) NOT NULL
|
||
,name VARCHAR(80) NOT NULL
|
||
,chat_id BIGINT NOT NULL
|
||
,deposit_chat_id BIGINT 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_guild")
|
||
log.Println("initDB : obj_guild 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 SMALLINT UNSIGNED NOT NULL
|
||
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
||
,FOREIGN KEY (castle_id) REFERENCES code_obj_castle(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 VARCHAR(80)
|
||
,cond VARCHAR(32)
|
||
,quality VARCHAR(32)
|
||
,seller VARCHAR(32)
|
||
,buyer VARCHAR(32)
|
||
,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 SMALLINT 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 code_obj_castle(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_auction_announce 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_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
|
||
,inserted TIMESTAMP
|
||
,pulled TIMESTAMP
|
||
,started TIMESTAMP
|
||
,ended TIMESTAMP
|
||
,payload VARCHAR(4000)
|
||
,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE
|
||
,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")
|
||
;`)
|
||
failOnError(err, "initDB : populate table code_obj_type")
|
||
log.Println("initDB : code_obj_type populated ...")
|
||
|
||
_, err = db.Exec(`INSERT INTO code_obj_castle (id, intl_id, user_id, name)
|
||
VALUES (` + strconv.Itoa(castleDeer) + `, "deer", "🦌", "Deerhorn")
|
||
,(` + strconv.Itoa(castleDragon) + `, "dragon", "🐉", "Dragonscale")
|
||
,(` + strconv.Itoa(castleHighnest) + `, "highnest", "🦅", "Highnest")
|
||
,(` + strconv.Itoa(castleMoon) + `, "moon", "🌑", "Moonlight")
|
||
,(` + strconv.Itoa(castlePotato) + `, "potato", "🥔", "Potato")
|
||
,(` + strconv.Itoa(castleShark) + `, "shark", "🦈", "Sharkteeth")
|
||
,(` + strconv.Itoa(castleWolf) + `, "wolf", "🐺", "Wolfpack")
|
||
;`)
|
||
failOnError(err, "initDB : populate table code_obj_castle")
|
||
log.Println("initDB : code_obj_castle populated ...")
|
||
|
||
_, err = db.Exec(`INSERT INTO code_obj_sub_type (id, intl_id, name, obj_type_id)
|
||
VALUES (` + 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(objSubTypeMessageReport) + `, "report", "Player war report", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageGReport) + `, "g_report", "Player guilds war report", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageQuest) + `, "quest", "Quest result", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageFight) + `, "fight", "Fight result", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageHero) + `, "hero", "Hero summary", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageMe) + `, "me", "Hero short summary", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageInventory) + `, "inv", "Inventory", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessagePillageInc) + `, "pillage_inc", "Pillage incoming", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessageTributeInc) + `, "tribute_inc", "Tribute incoming", ` + strconv.Itoa(objTypeMessage) + `)
|
||
,(` + strconv.Itoa(objSubTypeMessagePillageAck) + `, "pillage_ack", "Pillage acknowledged", ` + 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(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(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) + `)
|
||
;`)
|
||
failOnError(err, "initDB : populate table code_obj_sub_type")
|
||
log.Println("initDB : code_obj_sub_type populated ...")
|
||
|
||
_, err = db.Exec(`
|
||
INSERT INTO obj (id, obj_type_id, obj_sub_type_id) VALUES
|
||
(1, 7, 701),
|
||
(2, 7, 701),
|
||
(3, 7, 701),
|
||
(4, 7, 701),
|
||
(5, 7, 701),
|
||
(6, 7, 701),
|
||
(7, 7, 701),
|
||
(8, 7, 701),
|
||
(9, 7, 701),
|
||
(10, 7, 701),
|
||
(11, 7, 706),
|
||
(12, 7, 701),
|
||
(13, 7, 701),
|
||
(14, 7, 701),
|
||
(15, 7, 701),
|
||
(16, 7, 701),
|
||
(17, 7, 701),
|
||
(18, 7, 701),
|
||
(19, 7, 701),
|
||
(20, 7, 701),
|
||
(21, 7, 701),
|
||
(22, 7, 701),
|
||
(23, 7, 701),
|
||
(24, 7, 701),
|
||
(25, 7, 701),
|
||
(26, 7, 701),
|
||
(27, 7, 701),
|
||
(28, 7, 701),
|
||
(29, 7, 701),
|
||
(30, 7, 701),
|
||
(31, 7, 701),
|
||
(32, 7, 701),
|
||
(33, 7, 701),
|
||
(34, 7, 701),
|
||
(35, 7, 701),
|
||
(36, 7, 701),
|
||
(37, 7, 701),
|
||
(38, 7, 701),
|
||
(39, 7, 702),
|
||
(40, 7, 702),
|
||
(41, 7, 702),
|
||
(42, 7, 702),
|
||
(43, 7, 702),
|
||
(44, 7, 702),
|
||
(45, 7, 702),
|
||
(46, 7, 702),
|
||
(47, 7, 702),
|
||
(48, 7, 702),
|
||
(49, 7, 702),
|
||
(50, 7, 702),
|
||
(51, 7, 702),
|
||
(52, 7, 702),
|
||
(53, 7, 702),
|
||
(54, 7, 702),
|
||
(55, 7, 702),
|
||
(56, 7, 702),
|
||
(57, 7, 702),
|
||
(58, 7, 702),
|
||
(59, 7, 702),
|
||
(60, 7, 702),
|
||
(61, 7, 702),
|
||
(62, 7, 702),
|
||
(63, 7, 702),
|
||
(64, 7, 702),
|
||
(65, 7, 702),
|
||
(66, 7, 702),
|
||
(67, 7, 702),
|
||
(68, 7, 702),
|
||
(69, 7, 702),
|
||
(70, 7, 703),
|
||
(71, 7, 703),
|
||
(72, 7, 703),
|
||
(73, 7, 703),
|
||
(74, 7, 703),
|
||
(75, 7, 703),
|
||
(76, 7, 703),
|
||
(77, 7, 703),
|
||
(78, 7, 703),
|
||
(79, 7, 703),
|
||
(80, 7, 703),
|
||
(81, 7, 703),
|
||
(82, 7, 703),
|
||
(83, 7, 703),
|
||
(84, 7, 703),
|
||
(85, 7, 703),
|
||
(86, 7, 703),
|
||
(87, 7, 703),
|
||
(88, 7, 703),
|
||
(89, 7, 703),
|
||
(90, 7, 703),
|
||
(91, 7, 706),
|
||
(92, 7, 706),
|
||
(93, 7, 706),
|
||
(94, 7, 706),
|
||
(95, 7, 706),
|
||
(96, 7, 706),
|
||
(97, 7, 706),
|
||
(98, 7, 706),
|
||
(99, 7, 706),
|
||
(100, 7, 706),
|
||
(101, 7, 706),
|
||
(102, 7, 706),
|
||
(103, 7, 706),
|
||
(104, 7, 706),
|
||
(105, 7, 706),
|
||
(106, 7, 706),
|
||
(107, 7, 706),
|
||
(108, 7, 706),
|
||
(109, 7, 706),
|
||
(110, 7, 706),
|
||
(111, 7, 706),
|
||
(112, 7, 706),
|
||
(113, 7, 706),
|
||
(114, 7, 706),
|
||
(115, 7, 706),
|
||
(116, 7, 706),
|
||
(117, 7, 706),
|
||
(118, 7, 706),
|
||
(119, 7, 706),
|
||
(120, 7, 706),
|
||
(121, 7, 706),
|
||
(122, 7, 706),
|
||
(123, 7, 706),
|
||
(124, 7, 706),
|
||
(125, 7, 706),
|
||
(126, 7, 706),
|
||
(127, 7, 706),
|
||
(128, 7, 706),
|
||
(129, 7, 706),
|
||
(130, 7, 706),
|
||
(131, 7, 706),
|
||
(132, 7, 706),
|
||
(133, 7, 706),
|
||
(134, 7, 706),
|
||
(135, 7, 706),
|
||
(136, 7, 706),
|
||
(137, 7, 706),
|
||
(138, 7, 706),
|
||
(139, 7, 706),
|
||
(140, 7, 706),
|
||
(141, 7, 706),
|
||
(142, 7, 706),
|
||
(143, 7, 706),
|
||
(144, 7, 706),
|
||
(145, 7, 706),
|
||
(146, 7, 706),
|
||
(147, 7, 706),
|
||
(148, 7, 706),
|
||
(149, 7, 706),
|
||
(150, 7, 706),
|
||
(151, 7, 706),
|
||
(152, 7, 706),
|
||
(153, 7, 706),
|
||
(154, 7, 706),
|
||
(155, 7, 706),
|
||
(156, 7, 706),
|
||
(157, 7, 706),
|
||
(158, 7, 706),
|
||
(159, 7, 706),
|
||
(160, 7, 706),
|
||
(161, 7, 706),
|
||
(162, 7, 706),
|
||
(163, 7, 706),
|
||
(164, 7, 706),
|
||
(165, 7, 706),
|
||
(166, 7, 706),
|
||
(167, 7, 706),
|
||
(168, 7, 706),
|
||
(169, 7, 706),
|
||
(170, 7, 706),
|
||
(171, 7, 706),
|
||
(172, 7, 706),
|
||
(173, 7, 706),
|
||
(174, 7, 706),
|
||
(175, 7, 706),
|
||
(176, 7, 706),
|
||
(177, 7, 706),
|
||
(178, 7, 706),
|
||
(179, 7, 706),
|
||
(180, 7, 703),
|
||
(181, 7, 703),
|
||
(182, 7, 706),
|
||
(183, 7, 706),
|
||
(184, 7, 706),
|
||
(185, 7, 706),
|
||
(186, 7, 706),
|
||
(187, 7, 706),
|
||
(188, 7, 706),
|
||
(189, 7, 706),
|
||
(190, 7, 706),
|
||
(191, 7, 706),
|
||
(192, 7, 706),
|
||
(193, 7, 706),
|
||
(194, 7, 706),
|
||
(195, 7, 706),
|
||
(196, 7, 706),
|
||
(197, 7, 706),
|
||
(198, 7, 706),
|
||
(199, 7, 706),
|
||
(200, 7, 706),
|
||
(201, 7, 703),
|
||
(202, 7, 703),
|
||
(203, 7, 703),
|
||
(204, 7, 703),
|
||
(205, 7, 703),
|
||
(206, 7, 703),
|
||
(207, 7, 703),
|
||
(208, 7, 703),
|
||
(209, 7, 705),
|
||
(210, 7, 705),
|
||
(211, 7, 705),
|
||
(212, 7, 705),
|
||
(213, 7, 705),
|
||
(214, 7, 705),
|
||
(215, 7, 705),
|
||
(216, 7, 705),
|
||
(217, 7, 705),
|
||
(218, 7, 705),
|
||
(219, 7, 705),
|
||
(220, 7, 705),
|
||
(221, 7, 705),
|
||
(222, 7, 705),
|
||
(223, 7, 705),
|
||
(224, 7, 705),
|
||
(225, 7, 705),
|
||
(226, 7, 705),
|
||
(227, 7, 705),
|
||
(228, 7, 705),
|
||
(229, 7, 705),
|
||
(230, 7, 705),
|
||
(231, 7, 705),
|
||
(232, 7, 705),
|
||
(233, 7, 705),
|
||
(234, 7, 705),
|
||
(235, 7, 705),
|
||
(236, 7, 705),
|
||
(237, 7, 705),
|
||
(238, 7, 705),
|
||
(239, 7, 705),
|
||
(240, 7, 705),
|
||
(241, 7, 705),
|
||
(242, 7, 705),
|
||
(243, 7, 705),
|
||
(244, 7, 705),
|
||
(245, 7, 705),
|
||
(246, 7, 705),
|
||
(247, 7, 705),
|
||
(248, 7, 705),
|
||
(249, 7, 705),
|
||
(250, 7, 705),
|
||
(251, 7, 705),
|
||
(252, 7, 705),
|
||
(253, 7, 705),
|
||
(254, 7, 705),
|
||
(255, 7, 705),
|
||
(256, 7, 705),
|
||
(257, 7, 705),
|
||
(258, 7, 705),
|
||
(259, 7, 705),
|
||
(260, 7, 705),
|
||
(261, 7, 705),
|
||
(262, 7, 705),
|
||
(263, 7, 705),
|
||
(264, 7, 705),
|
||
(265, 7, 705),
|
||
(266, 7, 705),
|
||
(267, 7, 705),
|
||
(268, 7, 705),
|
||
(269, 7, 705),
|
||
(270, 7, 705),
|
||
(271, 7, 705),
|
||
(272, 7, 705),
|
||
(273, 7, 705),
|
||
(274, 7, 705),
|
||
(275, 7, 705),
|
||
(276, 7, 705),
|
||
(277, 7, 705),
|
||
(278, 7, 705),
|
||
(279, 7, 705),
|
||
(280, 7, 705),
|
||
(281, 7, 705),
|
||
(282, 7, 705),
|
||
(283, 7, 705),
|
||
(284, 7, 705),
|
||
(285, 7, 705),
|
||
(286, 7, 705),
|
||
(287, 7, 705),
|
||
(288, 7, 705),
|
||
(289, 7, 705),
|
||
(290, 7, 705),
|
||
(291, 7, 705),
|
||
(292, 7, 705),
|
||
(293, 7, 705),
|
||
(294, 7, 705),
|
||
(295, 7, 703),
|
||
(296, 7, 703),
|
||
(297, 7, 703),
|
||
(298, 7, 703),
|
||
(299, 7, 703),
|
||
(300, 7, 703),
|
||
(301, 7, 703),
|
||
(302, 7, 703),
|
||
(303, 7, 703),
|
||
(304, 7, 703),
|
||
(305, 7, 703),
|
||
(306, 7, 703),
|
||
(307, 7, 703),
|
||
(308, 7, 703),
|
||
(309, 7, 703),
|
||
(310, 7, 703),
|
||
(311, 7, 703),
|
||
(312, 7, 703),
|
||
(313, 7, 703),
|
||
(314, 7, 703),
|
||
(315, 7, 703),
|
||
(316, 7, 703),
|
||
(317, 7, 704),
|
||
(318, 7, 704),
|
||
(319, 7, 704),
|
||
(320, 7, 704),
|
||
(321, 7, 704),
|
||
(322, 7, 704),
|
||
(323, 7, 704),
|
||
(324, 7, 704),
|
||
(325, 7, 704),
|
||
(326, 7, 704),
|
||
(327, 7, 704),
|
||
(328, 7, 704),
|
||
(329, 7, 704),
|
||
(330, 7, 704),
|
||
(331, 7, 704),
|
||
(332, 7, 704),
|
||
(333, 7, 704),
|
||
(334, 7, 704),
|
||
(335, 7, 704),
|
||
(336, 7, 704),
|
||
(337, 7, 704),
|
||
(338, 7, 704),
|
||
(339, 7, 704),
|
||
(340, 7, 704),
|
||
(341, 7, 704),
|
||
(342, 7, 704),
|
||
(343, 7, 704),
|
||
(344, 7, 704),
|
||
(345, 7, 704),
|
||
(346, 7, 704),
|
||
(347, 7, 704),
|
||
(348, 7, 704),
|
||
(349, 7, 704),
|
||
(350, 7, 704),
|
||
(351, 7, 704),
|
||
(352, 7, 704),
|
||
(353, 7, 704),
|
||
(354, 7, 704),
|
||
(355, 7, 704),
|
||
(356, 7, 704),
|
||
(357, 7, 704),
|
||
(358, 7, 704),
|
||
(359, 7, 704),
|
||
(360, 7, 704),
|
||
(361, 7, 704),
|
||
(362, 7, 704),
|
||
(363, 7, 704),
|
||
(364, 7, 704),
|
||
(365, 7, 704),
|
||
(366, 7, 704),
|
||
(367, 7, 704),
|
||
(368, 7, 704),
|
||
(369, 7, 704),
|
||
(370, 7, 704),
|
||
(371, 7, 704),
|
||
(372, 7, 704),
|
||
(373, 7, 704),
|
||
(374, 7, 704),
|
||
(375, 7, 704),
|
||
(376, 7, 704),
|
||
(377, 7, 704),
|
||
(378, 7, 704),
|
||
(379, 7, 704),
|
||
(380, 7, 704),
|
||
(381, 7, 704),
|
||
(382, 7, 704),
|
||
(383, 7, 704),
|
||
(384, 7, 704),
|
||
(385, 7, 704),
|
||
(386, 7, 704),
|
||
(387, 7, 704),
|
||
(388, 7, 704),
|
||
(389, 7, 704),
|
||
(390, 7, 704),
|
||
(391, 7, 704),
|
||
(392, 7, 704),
|
||
(393, 7, 704),
|
||
(394, 7, 704),
|
||
(395, 7, 704),
|
||
(396, 7, 704),
|
||
(397, 7, 704),
|
||
(398, 7, 704),
|
||
(399, 7, 704),
|
||
(400, 7, 704),
|
||
(401, 7, 704),
|
||
(402, 7, 704),
|
||
(403, 7, 703),
|
||
(404, 7, 703),
|
||
(405, 7, 703),
|
||
(406, 7, 703),
|
||
(407, 7, 703),
|
||
(408, 7, 703),
|
||
(409, 7, 703),
|
||
(410, 7, 703),
|
||
(411, 7, 703),
|
||
(412, 7, 703),
|
||
(413, 7, 703),
|
||
(414, 7, 703),
|
||
(415, 7, 703),
|
||
(416, 7, 703),
|
||
(417, 7, 706),
|
||
(418, 7, 706),
|
||
(419, 7, 706),
|
||
(420, 7, 706),
|
||
(421, 7, 706),
|
||
(422, 7, 706),
|
||
(423, 7, 706),
|
||
(424, 7, 706),
|
||
(425, 7, 706),
|
||
(426, 7, 706),
|
||
(427, 7, 706),
|
||
(428, 7, 706),
|
||
(429, 7, 706),
|
||
(430, 7, 706),
|
||
(431, 7, 706),
|
||
(432, 7, 706),
|
||
(433, 7, 706),
|
||
(434, 7, 706),
|
||
(435, 7, 706),
|
||
(436, 7, 706),
|
||
(437, 7, 706),
|
||
(438, 7, 706),
|
||
(439, 7, 706),
|
||
(440, 7, 706),
|
||
(441, 7, 706),
|
||
(442, 7, 706),
|
||
(443, 7, 706),
|
||
(444, 7, 706),
|
||
(445, 7, 706),
|
||
(446, 7, 706),
|
||
(447, 7, 706),
|
||
(448, 7, 706),
|
||
(449, 7, 706),
|
||
(450, 7, 706),
|
||
(451, 7, 706),
|
||
(452, 7, 706),
|
||
(453, 7, 706),
|
||
(454, 7, 706),
|
||
(455, 7, 706),
|
||
(456, 7, 706),
|
||
(457, 7, 706),
|
||
(458, 7, 706),
|
||
(459, 7, 706),
|
||
(460, 7, 706),
|
||
(461, 7, 706),
|
||
(462, 7, 706),
|
||
(463, 7, 706),
|
||
(464, 7, 706),
|
||
(465, 7, 706),
|
||
(466, 7, 706),
|
||
(467, 7, 706),
|
||
(468, 7, 706),
|
||
(469, 7, 706),
|
||
(470, 7, 706),
|
||
(471, 7, 706),
|
||
(472, 7, 706);
|
||
`)
|
||
failOnError(err, "initDB : populate table obj_item #1")
|
||
|
||
_, err = db.Exec(`
|
||
INSERT INTO obj_item (obj_id, intl_id, name, weight) VALUES
|
||
(1, '01', 'Thread', 1),
|
||
(2, '02', 'Stick', 1),
|
||
(3, '03', 'Pelt', 1),
|
||
(4, '04', 'Bone', 1),
|
||
(5, '05', 'Coal', 1),
|
||
(6, '06', 'Charcoal', 1),
|
||
(7, '07', 'Powder', 1),
|
||
(8, '08', 'Iron Ore', 2),
|
||
(9, '09', 'Cloth', 1),
|
||
(10, '10', 'Silver Ore', 2),
|
||
(11, '100', 'Pouch of Gold', 0),
|
||
(12, '11', 'Bauxite', 2),
|
||
(13, '12', 'Cord', 2),
|
||
(14, '13', 'Magic Stone', 1),
|
||
(15, '14', 'Wooden Shaft', 2),
|
||
(16, '15', 'Sapphire', 2),
|
||
(17, '16', 'Solvent', 2),
|
||
(18, '17', 'Ruby', 2),
|
||
(19, '18', 'Hardener', 2),
|
||
(20, '19', 'Steel', 2),
|
||
(21, '20', 'Leather', 1),
|
||
(22, '21', 'Bone Powder', 1),
|
||
(23, '22', 'String', 1),
|
||
(24, '23', 'Coke', 1),
|
||
(25, '24', 'Purified Powder', 1),
|
||
(26, '25', 'Silver Alloy', 3),
|
||
(27, '27', 'Steel Mold', 2),
|
||
(28, '28', 'Silver Mold', 2),
|
||
(29, '29', 'Blacksmith Frame', 3),
|
||
(30, '30', 'Artisan Frame', 3),
|
||
(31, '31', 'Rope', 1),
|
||
(32, '32', 'Silver Frame', 2),
|
||
(33, '33', 'Metal Plate', 2),
|
||
(34, '34', 'Metallic Fiber', 2),
|
||
(35, '35', 'Crafted Leather', 1),
|
||
(36, '36', 'Quality Cloth', 2),
|
||
(37, '37', 'Blacksmith Mold', 3),
|
||
(38, '38', 'Artisan Mold', 3),
|
||
(39, '39', 'Stinky Sumac', 1),
|
||
(40, '40', 'Mercy Sassafras', 1),
|
||
(41, '41', 'Cliff Rue', 1),
|
||
(42, '42', 'Love Creeper', 1),
|
||
(43, '43', 'Wolf Root', 1),
|
||
(44, '44', 'Swamp Lavender', 1),
|
||
(45, '45', 'White Blossom', 1),
|
||
(46, '46', 'Ilaves', 1),
|
||
(47, '47', 'Ephijora', 1),
|
||
(48, '48', 'Storm Hyssop', 1),
|
||
(49, '49', 'Cave Garlic', 1),
|
||
(50, '50', 'Yellow Seed', 1),
|
||
(51, '51', 'Tecceagrass', 1),
|
||
(52, '52', 'Spring Bay Leaf', 1),
|
||
(53, '53', 'Ash Rosemary', 1),
|
||
(54, '54', 'Sanguine Parsley', 1),
|
||
(55, '55', 'Sun Tarragon', 1),
|
||
(56, '56', 'Maccunut', 1),
|
||
(57, '57', 'Dragon Seed', 1),
|
||
(58, '58', 'Queen\'s Pepper', 1),
|
||
(59, '59', 'Plasma of Abyss', 1),
|
||
(60, '60', 'Ultramarine Dust', 1),
|
||
(61, '61', 'Ethereal Bone', 1),
|
||
(62, '62', 'Itacory', 1),
|
||
(63, '63', 'Assassin Vine', 1),
|
||
(64, '64', 'Kloliarway', 1),
|
||
(65, '65', 'Astrulic', 1),
|
||
(66, '66', 'Flammia Nut', 1),
|
||
(67, '67', 'Plexisop', 1),
|
||
(68, '68', 'Mammoth Dill', 1),
|
||
(69, '69', 'Silver Dust', 1),
|
||
(70, '501', 'Wrapping', 2),
|
||
(71, '502', 'Leash', 2),
|
||
(72, '505', 'Wooden Arrow', 10),
|
||
(73, '507', 'Bottle of Remedy', -1),
|
||
(74, '509', 'Bottle of Poison', -1),
|
||
(75, '511', 'Steel Arrow', 10),
|
||
(76, '513', 'Silver Arrow', 10),
|
||
(77, '515', 'Broad Arrows Pack', -1),
|
||
(78, '517', 'Heavy Arrows Pack', -1),
|
||
(79, '519', 'Compound Arrows Pack', -1),
|
||
(80, '614', 'Gift Coupon: Pig', 1),
|
||
(81, '615', 'Gift Coupon: Horse', 1),
|
||
(82, '617', 'Gift Coupon: Mouse', 1),
|
||
(83, '618', 'Hay', 5),
|
||
(84, '619', 'Corn', 5),
|
||
(85, '620', 'Hamsters', 5),
|
||
(86, '621', 'Cheese', 5),
|
||
(87, '623', 'Gift Coupon: Ant', 1),
|
||
(88, '624', 'Gift Coupon: Spider', 1),
|
||
(89, '625', 'Gift Coupon: Haunted', 1),
|
||
(90, '626', 'Gift Coupon: Camel', 1),
|
||
(91, 'a01', 'Cloth Jacket', -1),
|
||
(92, 'a02', 'Leather Shirt', -1),
|
||
(93, 'a03', 'Chain Mail', -1),
|
||
(94, 'a04', 'Silver Cuirass', -1),
|
||
(95, 'a05', 'Mithril Armor', -1),
|
||
(96, 'a06', 'Hat', -1),
|
||
(97, 'a07', 'Leather Hood', -1),
|
||
(98, 'a08', 'Steel Helmet', -1),
|
||
(99, 'a09', 'Silver Helmet', -1),
|
||
(100, 'a10', 'Mithril Helmet', -1),
|
||
(101, 'a100', 'Assault Cape', -1),
|
||
(102, 'a101', 'Craftsman Apron', -1),
|
||
(103, 'a102', 'Stoneskin Cloak', -1),
|
||
(104, 'a11', 'Sandals', -1),
|
||
(105, 'a12', 'Leather Shoes', -1),
|
||
(106, 'a13', 'Steel Boots', -1),
|
||
(107, 'a14', 'Silver Boots', -1),
|
||
(108, 'a15', 'Mithril Boots', -1),
|
||
(109, 'a16', 'Gloves (Item)', -1),
|
||
(110, 'a17', 'Leather Gloves', -1),
|
||
(111, 'a18', 'Steel Gauntlets', -1),
|
||
(112, 'a19', 'Silver Gauntlets', -1),
|
||
(113, 'a20', 'Mithril Gauntlets', -1),
|
||
(114, 'a21', 'Wooden Shield', -1),
|
||
(115, 'a22', 'Skeleton Buckler', -1),
|
||
(116, 'a23', 'Bronze Shield', -1),
|
||
(117, 'a24', 'Silver Shield', -1),
|
||
(118, 'a25', 'Mithril Shield', -1),
|
||
(119, 'a26', 'Royal Guard Cape', -1),
|
||
(120, 'a27', 'Order Armor', -1),
|
||
(121, 'a28', 'Order Helmet', 190),
|
||
(122, 'a29', 'Order Boots', -1),
|
||
(123, 'a30', 'Order Gauntlets', -1),
|
||
(124, 'a31', 'Order Shield', -1),
|
||
(125, 'a32', 'Hunter Armor', 450),
|
||
(126, 'a33', 'Hunter Helmet', 190),
|
||
(127, 'a34', 'Hunter Boots', -1),
|
||
(128, 'a35', 'Hunter Gloves', 125),
|
||
(129, 'a36', 'Clarity Robe', 450),
|
||
(130, 'a37', 'Clarity Circlet', 190),
|
||
(131, 'a38', 'Clarity Shoes', 125),
|
||
(132, 'a39', 'Clarity Bracers', 125),
|
||
(133, 'a40', 'Pencil of Truth', 10),
|
||
(134, 'a41', 'Bard\'s Cape', -1),
|
||
(135, 'a45', 'Crusader Armor', -1),
|
||
(136, 'a46', 'Crusader Helmet', -1),
|
||
(137, 'a47', 'Crusader Boots', 200),
|
||
(138, 'a48', 'Crusader Gauntlets', -1),
|
||
(139, 'a49', 'Crusader Shield', 200),
|
||
(140, 'a50', 'Royal Armor', -1),
|
||
(141, 'a51', 'Royal Helmet', -1),
|
||
(142, 'a52', 'Royal Boots', 200),
|
||
(143, 'a53', 'Royal Gauntlets', -1),
|
||
(144, 'a54', 'Royal Shield', 200),
|
||
(145, 'a55', 'Ghost Armor', 480),
|
||
(146, 'a56', 'Ghost Helmet', 200),
|
||
(147, 'a57', 'Ghost Boots', 90),
|
||
(148, 'a58', 'Ghost Gloves', -1),
|
||
(149, 'a59', 'Lion Armor', -1),
|
||
(150, 'a60', 'Lion Helmet', 200),
|
||
(151, 'a61', 'Lion Boots', -1),
|
||
(152, 'a62', 'Lion Gloves', -1),
|
||
(153, 'a63', 'Demon Robe', 480),
|
||
(154, 'a64', 'Demon Circlet', 200),
|
||
(155, 'a65', 'Demon Shoes', 140),
|
||
(156, 'a66', 'Demon Bracers', 140),
|
||
(157, 'a67', 'Divine Robe', 480),
|
||
(158, 'a68', 'Divine Circlet', 200),
|
||
(159, 'a69', 'Divine Shoes', 140),
|
||
(160, 'a70', 'Divine Bracers', 140),
|
||
(161, 'a71', 'Storm Cloak', -1),
|
||
(162, 'a72', 'Durable Cloak', 30),
|
||
(163, 'a73', 'Blessed Cloak', 30),
|
||
(164, 'a74', 'Hiking Jar', -1),
|
||
(165, 'a75', 'Hiking Bag', -1),
|
||
(166, 'a76', 'Stick of Wisdom', 10),
|
||
(167, 'a78', 'Council Armor', 510),
|
||
(168, 'a79', 'Council Helmet', -1),
|
||
(169, 'a80', 'Council Boots', -1),
|
||
(170, 'a81', 'Council Gloves', 155),
|
||
(171, 'a82', 'Council Shield', -1),
|
||
(172, 'a83', 'Griffin Armor', -1),
|
||
(173, 'a84', 'Griffin Helmet', -1),
|
||
(174, 'a85', 'Griffin Boots', 155),
|
||
(175, 'a86', 'Griffin Gloves', 155),
|
||
(176, 'a87', 'Celestial Armor', 510),
|
||
(177, 'a88', 'Celestial Helmet', 210),
|
||
(178, 'a89', 'Celestial Boots', 155),
|
||
(179, 'a90', 'Celestial Gloves', 155),
|
||
(180, 'ch1', 'Zombie Chest', -1),
|
||
(181, 'e1', 'Cocoa Powder', 1),
|
||
(182, 'e109', 'Walker Armor (Event Gear)', -1),
|
||
(183, 'e110', 'Walker Helmet (Event Gear)', -1),
|
||
(184, 'e111', 'Walker Boots (Event Gear)', -1),
|
||
(185, 'e112', 'Walker Gauntlets (Event Gear)', -1),
|
||
(186, 'e113', 'Walker Shield (Event Gear)', -1),
|
||
(187, 'e114', 'Zombie Armor (Event Gear)', 480),
|
||
(188, 'e115', 'Zombie Helmet (Event Gear)', -1),
|
||
(189, 'e116', 'Zombie Boots (Event Gear)', 140),
|
||
(190, 'e117', 'Zombie Gauntlets (Event Gear)', 140),
|
||
(191, 'e118', 'Zombie Shield (Event Gear)', -1),
|
||
(192, 'e125', 'Demon Shoes (Event Item)', -1),
|
||
(193, 'e128', 'Manwolf Helmet (Event Gear)', -1),
|
||
(194, 'e130', 'Manwolf Gloves (Event Gear)', -1),
|
||
(195, 'e132', 'Werewolf Helmet (Event Gear)', 200),
|
||
(196, 'e139', 'Nosferatu Armor (Event Gear)', -1),
|
||
(197, 'e144', 'War Club', -1),
|
||
(198, 'e147', 'Manwolf Knife (Event Gear)', -1),
|
||
(199, 'e150', 'Walker Club (Event Gear)', -1),
|
||
(200, 'e153', 'Werewolf Knife (Event Gear)', -1),
|
||
(201, 'e2', 'Egg', 1),
|
||
(202, 'e3', 'Flour', 1),
|
||
(203, 'e4', 'Milk', -1),
|
||
(204, 'e5', 'Sugar', -1),
|
||
(205, 'est', 'Evil Spirits Totem', 50),
|
||
(206, 'hw102', 'Timeless Jade', -1),
|
||
(207, 'hw104', 'Shadow Bloodstone', -1),
|
||
(208, 'hw107', 'Void Emerald', -1),
|
||
(209, 'k01', 'Champion Blade', 10),
|
||
(210, 'k02', 'Trident Blade', 10),
|
||
(211, 'k03', 'Hunter Shaft', 10),
|
||
(212, 'k04', 'War Hammer Head', 10),
|
||
(213, 'k05', 'Hunter Blade', 10),
|
||
(214, 'k06', 'Order Armor Piece', 10),
|
||
(215, 'k07', 'Order Helmet Fragment', 10),
|
||
(216, 'k08', 'Order Boots Part', 10),
|
||
(217, 'k09', 'Order Gauntlets Part', 10),
|
||
(218, 'k10', 'Order Shield Part', 10),
|
||
(219, 'k11', 'Hunter Armor Part', 10),
|
||
(220, 'k12', 'Hunter Helmet Fragment', 10),
|
||
(221, 'k13', 'Hunter Boots Part', 10),
|
||
(222, 'k14', 'Hunter Gloves Part', 10),
|
||
(223, 'k15', 'Clarity Robe Piece', 10),
|
||
(224, 'k16', 'Clarity Circlet Fragment', 10),
|
||
(225, 'k17', 'Clarity Shoes Part', 10),
|
||
(226, 'k18', 'Clarity Bracers Part', 10),
|
||
(227, 'k19', 'Thundersoul Blade', 10),
|
||
(228, 'k20', 'Doomblade Blade', -1),
|
||
(229, 'k21', 'Eclipse Blade', 10),
|
||
(230, 'k22', 'Guard\'s Blade', 10),
|
||
(231, 'k23', 'King\'s Defender Blade', 10),
|
||
(232, 'k24', 'Raging Lance Blade', 10),
|
||
(233, 'k25', 'Composite Bow Shaft', 10),
|
||
(234, 'k26', 'Lightning Bow Shaft', -1),
|
||
(235, 'k27', 'Hailstorm Bow Shaft', 10),
|
||
(236, 'k28', 'Imperial Axe Head', 10),
|
||
(237, 'k29', 'Skull Crusher Head', 10),
|
||
(238, 'k30', 'Dragon Mace Head', 10),
|
||
(239, 'k31', 'Ghost Blade', 10),
|
||
(240, 'k32', 'Lion Blade', 10),
|
||
(241, 'k33', 'Crusader Armor Piece', -1),
|
||
(242, 'k34', 'Crusader Helmet Fragment', -1),
|
||
(243, 'k35', 'Crusader Boots Part', -1),
|
||
(244, 'k36', 'Crusader Gauntlets Part', -1),
|
||
(245, 'k37', 'Crusader Shield Part', 10),
|
||
(246, 'k38', 'Royal Armor Piece', -1),
|
||
(247, 'k39', 'Royal Helmet Fragment', -1),
|
||
(248, 'k40', 'Royal Boots Part', -1),
|
||
(249, 'k41', 'Royal Gauntlets Part', -1),
|
||
(250, 'k42', 'Royal Shield Part', -1),
|
||
(251, 'k43', 'Ghost Armor Part', 10),
|
||
(252, 'k44', 'Ghost Helmet Fragment', 10),
|
||
(253, 'k45', 'Ghost Boots Part', 10),
|
||
(254, 'k46', 'Ghost Gloves Part', 10),
|
||
(255, 'k47', 'Lion Armor Part', -1),
|
||
(256, 'k48', 'Lion Helmet Fragment', 10),
|
||
(257, 'k49', 'Lion Boots Part', 10),
|
||
(258, 'k50', 'Lion Gloves Part', 10),
|
||
(259, 'k51', 'Demon Robe Piece', 10),
|
||
(260, 'k52', 'Demon Circlet Fragment', 10),
|
||
(261, 'k53', 'Demon Shoes Part', 10),
|
||
(262, 'k54', 'Demon Bracers Part', 10),
|
||
(263, 'k55', 'Divine Robe Piece', 10),
|
||
(264, 'k56', 'Divine Circlet Fragment', -1),
|
||
(265, 'k57', 'Divine Shoes Part', 10),
|
||
(266, 'k58', 'Divine Bracers Part', 10),
|
||
(267, 'k59', 'Storm Cloak Part', 10),
|
||
(268, 'k60', 'Durable Cloak Part', -1),
|
||
(269, 'k61', 'Blessed Cloak Part', 10),
|
||
(270, 'k78', 'Council Armor Part', 10),
|
||
(271, 'k79', 'Council Helmet Part', -1),
|
||
(272, 'k80', 'Council Boots Part', -1),
|
||
(273, 'k81', 'Council Gloves Part', 10),
|
||
(274, 'k82', 'Council Shield Part', -1),
|
||
(275, 'k83', 'Griffin Armor Part', -1),
|
||
(276, 'k84', 'Griffin Helmet Part', -1),
|
||
(277, 'k85', 'Griffin Boots Part', -1),
|
||
(278, 'k86', 'Griffin Gloves Part', -1),
|
||
(279, 'k87', 'Celestial Armor Part', -1),
|
||
(280, 'k88', 'Celestial Helmet Part', -1),
|
||
(281, 'k89', 'Celestial Boots Part', -1),
|
||
(282, 'k90', 'Celestial Gloves Part', -1),
|
||
(283, 'k91', 'Griffin Knife Part', -1),
|
||
(284, 'k92', 'Minotaur Sword Part', -1),
|
||
(285, 'k93', 'Phoenix Sword Part', -1),
|
||
(286, 'k94', 'Heavy Fauchard Part', -1),
|
||
(287, 'k95', 'Guisarme Part', -1),
|
||
(288, 'k96', 'Meteor Bow Part', -1),
|
||
(289, 'k97', 'Nightfall Bow Part', -1),
|
||
(290, 'k98', 'Black Morningstar Part', -1),
|
||
(291, 'k99', 'Maiming Bulawa Part', -1),
|
||
(292, 'k100', 'Assault Cape Part', -1),
|
||
(293, 'k101', 'Craftsman Apron Part', -1),
|
||
(294, 'k102', 'Stoneskin Cloak Part', -1),
|
||
(295, 'p01', 'Vial of Rage', 1),
|
||
(296, 'p02', 'Potion of Rage', 1),
|
||
(297, 'p03', 'Bottle of Rage', 1),
|
||
(298, 'p04', 'Vial of Peace', 1),
|
||
(299, 'p05', 'Potion of Peace', 1),
|
||
(300, 'p06', 'Bottle of Peace', 1),
|
||
(301, 'p07', 'Vial of Greed', 1),
|
||
(302, 'p08', 'Potion of Greed', 1),
|
||
(303, 'p09', 'Bottle of Greed', 1),
|
||
(304, 'p10', 'Vial of Nature', 1),
|
||
(305, 'p11', 'Potion of Nature', 1),
|
||
(306, 'p12', 'Bottle of Nature', 1),
|
||
(307, 'p13', 'Vial of Mana', 1),
|
||
(308, 'p14', 'Potion of Mana', 1),
|
||
(309, 'p15', 'Bottle of Mana', 1),
|
||
(310, 'p16', 'Vial of Twilight', 1),
|
||
(311, 'p17', 'Potion of Twilight', 1),
|
||
(312, 'p18', 'Bottle of Twilight', 1),
|
||
(313, 'p19', 'Vial of Morph', 1),
|
||
(314, 'p20', 'Potion of Morph', 1),
|
||
(315, 'p21', 'Bottle of Morph', 1),
|
||
(316, 'pmp', 'Pumpkin', -1),
|
||
(317, 'r01', 'Champion Sword Recipe', 10),
|
||
(318, 'r02', 'Trident Recipe', 10),
|
||
(319, 'r03', 'Hunter Bow Recipe', 10),
|
||
(320, 'r04', 'War Hammer Recipe', 10),
|
||
(321, 'r05', 'Hunter Dagger Recipe', 10),
|
||
(322, 'r06', 'Order Armor Recipe', 10),
|
||
(323, 'r07', 'Order Helmet Recipe', 10),
|
||
(324, 'r08', 'Order Boots Recipe', 10),
|
||
(325, 'r09', 'Order Gauntlets Recipe', 10),
|
||
(326, 'r10', 'Order Shield Recipe', 10),
|
||
(327, 'r100', 'Assault Cape Recipe', -1),
|
||
(328, 'r101', 'Craftsman Apron Recipe', -1),
|
||
(329, 'r102', 'Stoneskin Cloak Recipe', -1),
|
||
(330, 'r11', 'Hunter Armor Recipe', 10),
|
||
(331, 'r12', 'Hunter Helmet Recipe', 10),
|
||
(332, 'r13', 'Hunter Boots Recipe', 10),
|
||
(333, 'r14', 'Hunter Gloves Recipe', 10),
|
||
(334, 'r15', 'Clarity Robe Recipe', 10),
|
||
(335, 'r16', 'Clarity Circlet Recipe', 10),
|
||
(336, 'r17', 'Clarity Shoes Recipe', 10),
|
||
(337, 'r18', 'Clarity Bracers Recipe', 10),
|
||
(338, 'r19', 'Thundersoul Sword Recipe', 10),
|
||
(339, 'r20', 'Doomblade Sword Recipe', 10),
|
||
(340, 'r21', 'Eclipse Recipe', 10),
|
||
(341, 'r22', 'Guard\'s Spear Recipe', 10),
|
||
(342, 'r23', 'King\'s Defender Recipe', 10),
|
||
(343, 'r24', 'Raging Lance Recipe', 10),
|
||
(344, 'r25', 'Composite Bow Recipe', 10),
|
||
(345, 'r26', 'Lightning Bow Recipe', 10),
|
||
(346, 'r27', 'Hailstorm Bow Recipe', 10),
|
||
(347, 'r28', 'Imperial Axe Recipe', 10),
|
||
(348, 'r29', 'Skull Crusher Recipe', 10),
|
||
(349, 'r30', 'Dragon Mace Recipe', 10),
|
||
(350, 'r31', 'Ghost Dagger Recipe', 10),
|
||
(351, 'r32', 'Lion Knife Recipe', 10),
|
||
(352, 'r33', 'Crusader Armor Recipe', 10),
|
||
(353, 'r34', 'Crusader Helmet Recipe', 10),
|
||
(354, 'r35', 'Crusader Boots Recipe', 10),
|
||
(355, 'r36', 'Crusader Gauntlets Recipe', 10),
|
||
(356, 'r37', 'Crusader Shield Recipe', 10),
|
||
(357, 'r38', 'Royal Armor Recipe', 10),
|
||
(358, 'r39', 'Royal Helmet Recipe', 10),
|
||
(359, 'r40', 'Royal Boots Recipe', 10),
|
||
(360, 'r41', 'Royal Gauntlets Recipe', 10),
|
||
(361, 'r42', 'Royal Shield Recipe', 10),
|
||
(362, 'r43', 'Ghost Armor Recipe', 10),
|
||
(363, 'r44', 'Ghost Helmet Recipe', 10),
|
||
(364, 'r45', 'Ghost Boots Recipe', 10),
|
||
(365, 'r46', 'Ghost Gloves Recipe', 10),
|
||
(366, 'r47', 'Lion Armor Recipe', 10),
|
||
(367, 'r48', 'Lion Helmet Recipe', 10),
|
||
(368, 'r49', 'Lion Boots Recipe', 10),
|
||
(369, 'r50', 'Lion Gloves Recipe', 10),
|
||
(370, 'r51', 'Demon Robe Recipe', 10),
|
||
(371, 'r52', 'Demon Circlet Recipe', 10),
|
||
(372, 'r53', 'Demon Shoes Recipe', 10),
|
||
(373, 'r54', 'Demon Bracers Recipe', 10),
|
||
(374, 'r55', 'Divine Robe Recipe', 10),
|
||
(375, 'r56', 'Divine Circlet Recipe', 10),
|
||
(376, 'r57', 'Divine Shoes Recipe', 10),
|
||
(377, 'r58', 'Divine Bracers Recipe', 10),
|
||
(378, 'r59', 'Storm Cloak Recipe', 10),
|
||
(379, 'r60', 'Durable Cloak Recipe', 10),
|
||
(380, 'r61', 'Blessed Cloak Recipe', 10),
|
||
(381, 'r78', 'Council Armor Recipe', -1),
|
||
(382, 'r79', 'Council Helmet Recipe', -1),
|
||
(383, 'r80', 'Council Boots Recipe', -1),
|
||
(384, 'r81', 'Council Gloves Recipe', -1),
|
||
(385, 'r82', 'Council Shield Recipe', -1),
|
||
(386, 'r83', 'Griffin Armor Recipe', -1),
|
||
(387, 'r84', 'Griffin Helmet Recipe', -1),
|
||
(388, 'r85', 'Griffin Boots Recipe', -1),
|
||
(389, 'r86', 'Griffin Gloves Recipe', -1),
|
||
(390, 'r87', 'Celestial Armor Recipe', -1),
|
||
(391, 'r88', 'Celestial Helmet Recipe', -1),
|
||
(392, 'r89', 'Celestial Boots Recipe', -1),
|
||
(393, 'r90', 'Celestial Gloves Recipe', -1),
|
||
(394, 'r91', 'Griffin Knife Recipe', -1),
|
||
(395, 'r92', 'Minotaur Sword Recipe', -1),
|
||
(396, 'r93', 'Phoenix Sword Recipe', -1),
|
||
(397, 'r94', 'Heavy Fauchard Recipe', -1),
|
||
(398, 'r95', 'Guisarme Recipe', -1),
|
||
(399, 'r96', 'Meteor Bow Recipe', -1),
|
||
(400, 'r97', 'Nightfall Bow Recipe', -1),
|
||
(401, 'r98', 'Black Morningstar Recipe', -1),
|
||
(402, 'r99', 'Maiming Bulawa Recipe', -1),
|
||
(403, 's01', 'ğScroll of Rage', 1),
|
||
(404, 's02', 'ğScroll of Peace', 1),
|
||
(405, 's03', 'ğScroll of Rage', 1),
|
||
(406, 's04', 'ğScroll of Peace', 1),
|
||
(407, 's05', 'ğScroll of Rage', 1),
|
||
(408, 's06', 'ğScroll of Peace', 1),
|
||
(409, 's11', 'ğRare scroll of Rage', 1),
|
||
(410, 's12', 'ğRare scroll of Peace', 1),
|
||
(411, 's13', 'ğRare scroll of Rage', 1),
|
||
(412, 's14', 'ğRare scroll of Peace', 1),
|
||
(413, 's15', 'ğRare scroll of Rage', 1),
|
||
(414, 's16', 'ğRare scroll of Peace', 1),
|
||
(415, 's51', 'âï¸Sof Engraving', 1),
|
||
(416, 'tch', 'Torch', -1),
|
||
(417, 'td1', 'Colorless shard', 50),
|
||
(418, 'w01', 'Wooden Sword', -1),
|
||
(419, 'w02', 'Short Sword', -1),
|
||
(420, 'w03', 'Long Sword', 180),
|
||
(421, 'w04', 'Widow Sword', -1),
|
||
(422, 'w05', 'Knight\'s Sword', -1),
|
||
(423, 'w06', 'Elven Sword', -1),
|
||
(424, 'w07', 'Rapier', 180),
|
||
(425, 'w08', 'Short Spear', -1),
|
||
(426, 'w09', 'Long Spear', -1),
|
||
(427, 'w10', 'Lance', -1),
|
||
(428, 'w11', 'Elven Spear', -1),
|
||
(429, 'w12', 'Halberd', -1),
|
||
(430, 'w13', 'Kitchen Knife', -1),
|
||
(431, 'w14', 'Battle Knife', -1),
|
||
(432, 'w15', 'Steel Dagger', -1),
|
||
(433, 'w16', 'Silver Dagger', -1),
|
||
(434, 'w17', 'Mithril Dagger', 180),
|
||
(435, 'w18', 'Short Bow', -1),
|
||
(436, 'w19', 'Wooden Bow', -1),
|
||
(437, 'w20', 'Long Bow', -1),
|
||
(438, 'w21', 'Elven Bow', -1),
|
||
(439, 'w22', 'Forest Bow', -1),
|
||
(440, 'w23', 'Club', -1),
|
||
(441, 'w24', 'Bone Club', -1),
|
||
(442, 'w25', 'Heavy Club', -1),
|
||
(443, 'w26', 'Steel Axe', -1),
|
||
(444, 'w27', 'Mithril Axe', -1),
|
||
(445, 'w28', 'Champion Sword', 180),
|
||
(446, 'w29', 'Trident', -1),
|
||
(447, 'w30', 'Hunter Bow', -1),
|
||
(448, 'w31', 'War Hammer', 180),
|
||
(449, 'w32', 'Hunter Dagger', 180),
|
||
(450, 'w33', 'Thundersoul Sword', 200),
|
||
(451, 'w34', 'Doomblade Sword', -1),
|
||
(452, 'w35', 'Eclipse', 200),
|
||
(453, 'w36', 'Guard\'s Spear', -1),
|
||
(454, 'w37', 'King\'s Defender', -1),
|
||
(455, 'w38', 'Raging Lance', 200),
|
||
(456, 'w39', 'Composite Bow', 200),
|
||
(457, 'w40', 'Lightning Bow', 200),
|
||
(458, 'w41', 'Hailstorm Bow', 200),
|
||
(459, 'w42', 'Imperial Axe', -1),
|
||
(460, 'w43', 'Skull Crusher', -1),
|
||
(461, 'w44', 'Dragon Mace', 200),
|
||
(462, 'w45', 'Ghost Dagger', -1),
|
||
(463, 'w46', 'Lion Knife', -1),
|
||
(464, 'w91', 'Griffin Knife', -1),
|
||
(465, 'w92', 'Minotaur Sword', -1),
|
||
(466, 'w93', 'Phoenix Sword', -1),
|
||
(467, 'w94', 'Heavy Fauchard', -1),
|
||
(468, 'w95', 'Guisarme', -1),
|
||
(469, 'w96', 'Meteor Bow', -1),
|
||
(470, 'w97', 'Nightfall Bow', -1),
|
||
(471, 'w98', 'Black Morningstar', -1),
|
||
(472, 'w99', 'Maiming Bulawa', 0);
|
||
`)
|
||
failOnError(err, "initDB : populate table obj_item #2")
|
||
log.Println("initDB : obj_item populated ...")
|
||
|
||
log.Println("initDB : Database set up")
|
||
}
|
||
|
||
func resetMsgParsingRules() {
|
||
_, err := db.Exec(`TRUNCATE TABLE msg_rules;`)
|
||
failOnError(err, "resetMsgParsingRules : truncate table msg_rules")
|
||
|
||
_, err = db.Exec(`INSERT INTO msg_rules (prio, msg_type_id, descn, rule)
|
||
VALUES (5000, ` + strconv.Itoa(objSubTypeMessageReport) + `, "Player war report", "^(?P<Castle>[🐉🦅🐺🦈🦌🥔🌑])(\\[(?P<Guild>[A-Z]{3})\\]){0,1}(?P<User>([A-Za-z0-9 ]*)) ⚔:(?P<Attack>[0-9]+)(?P<AttackMod>\\((-|\\+)[0-9]+\\)){0,1} 🛡:(?P<Defense>[0-9]+) Lvl: (?P<Level>[0-9]+)\\nYour result on the battlefield:\\n(🔥Exp: (?P<Exp>[0-9]+)\\n){0,1}(💰Gold: (?P<Gold>\\-{0,1}[0-9]+)\\n){0,1}(📦Stock: (?P<Stock>\\-{0,1}[0-9]+)){0,1}(\\n(?P<Stamina>(🔋Stamina restored))){0,1}(\\n(?P<Crit>(⚡Critical strike))){0,1}$")
|
||
,(5000, ` + strconv.Itoa(objSubTypeMessageAuctionAnnounce) + `, "Auction annouce", "^Lot #(?P<Lot>[0-9]+) : (?P<Item>.*)\\n(Quality: (?P<Quality>.*)\\n){0,1}(Condition: (?P<Cond>.*)\\n){0,1}Seller: (?P<Seller>.*)\\nCurrent price: (?P<Price>[0-9]+) pouch\\(es\\)\\nBuyer: (?P<Buyer>.*)\\nEnd At: (?P<End>.*)\\nStatus: (?P<Status>.*)(\\n)*(?s:.*)")
|
||
,(5000, ` + strconv.Itoa(objSubTypeMessageTimeAck) + `, "Time", "^In Chat Wars world now\\n(?P<Time>.*)\\n(?P<Hour>[0-9]{2}):(?P<Minute>[0-9]{2})\\n(?P<Day>[0-9]{2}) (?P<Month>.+) (?P<Year>[0-9]{4})\\n(?s:.*)$")` +
|
||
`,(5000, ` + strconv.Itoa(objSubTypeMessageMiniWar) + `, "Mini War", "^⛳️Battle results:\\n` +
|
||
`(?P<Gardian1>🔱){0,1}.*(?P<Loot1>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result1>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold1>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock1>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian2>🔱){0,1}.*(?P<Loot2>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result2>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold2>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock2>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian3>🔱){0,1}.*(?P<Loot3>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result3>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold3>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock3>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian4>🔱){0,1}.*(?P<Loot4>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result4>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold4>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock4>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian5>🔱){0,1}.*(?P<Loot5>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result5>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold5>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock5>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian6>🔱){0,1}.*(?P<Loot6>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result6>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold6>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock6>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`(?P<Gardian7>🔱){0,1}.*(?P<Loot7>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)):(?P<Result7>[^\\x{1F4B0}\\x{1F4E6}]*)((?P<Gold7>(\\-|\\+)[0-9]+)\\x{1F4B0}){0,1}[ ]*((?P<Stock7>(\\-|\\+)[0-9]+)\\x{1F4E6}){0,1}\\n` +
|
||
`\\n🏆Scores:\\n` +
|
||
`.*(?P<Score1>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points1>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score2>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points2>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score3>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points3>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score4>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points4>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score5>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points5>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score6>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points6>\\+([0-9]+|NaN))\\n` +
|
||
`.*(?P<Score7>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)): (?P<Points7>\\+([0-9]+|NaN))\\n` +
|
||
`(?s:.*)` +
|
||
`Battle (?P<Time>[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2})$")
|
||
,(5000, ` + strconv.Itoa(objSubTypeMessagePillageInc) + `, "Pillage Inc", "^You were strolling around on your horse when you noticed (\\[(?P<Guild>[A-Z]{3})\\]){0,1}(?P<Attacker>.*) of .{1}(?P<Castle>(Moonlight|Wolfpack|Deerhorn|Dragonscale|Sharkteeth|Potato|Highnest)) Castle trying to pillage a local village. To stop him click /go$")` +
|
||
`;`)
|
||
failOnError(err, "resetMsgParsingRules : populate table msg_rules")
|
||
}
|
||
|
||
func putUnprocessedMsg(m ChatWarsMessage) (int64, error) {
|
||
tx, err := db.Begin()
|
||
logOnError(err, "putUnprocessedMsg : 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(objTypeMessage) + `,` + strconv.Itoa(objSubTypeMessageUnknown) + `);`)
|
||
logOnError(err, "putUnprocessedMsg : exec insert obj")
|
||
if err != nil {
|
||
err2 := tx.Rollback()
|
||
logOnError(err2, "putUnprocessedMsg : rollback insert obj")
|
||
return 0, err
|
||
}
|
||
|
||
objId, err := res.LastInsertId()
|
||
if err != nil {
|
||
err2 := tx.Rollback()
|
||
logOnError(err2, "putUnprocessedMsg : rollback get lastInsertId")
|
||
return 0, err
|
||
}
|
||
|
||
stmt, err := tx.Prepare(`INSERT INTO obj_msg (obj_id, msg_id, chat_id, user_id, sender_user_id, date, text)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?);`)
|
||
logOnError(err, "putUnprocessedMsg : prepare insert obj_msg")
|
||
if err != nil {
|
||
err2 := tx.Rollback()
|
||
logOnError(err2, "putUnprocessedMsg : rollback prepare insert obj_msg")
|
||
return 0, err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(objId, m.ID64, m.ChatID64, m.UserID64, m.SenderUserID64, m.Date, m.Text)
|
||
logOnError(err, "putUnprocessedMsg : exec insert obj_msg")
|
||
if err != nil {
|
||
err2 := tx.Rollback()
|
||
logOnError(err2, "putUnprocessedMsg : rollback exec insert obj")
|
||
return 0, err
|
||
}
|
||
|
||
err = tx.Commit()
|
||
logOnError(err, "putUnprocessedMsg : commit")
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return objId, nil
|
||
}
|
||
|
||
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 getObjSubTypeId(objId int64) (int64, error) {
|
||
var objSubTypeId int64
|
||
|
||
stmt, err := db.Prepare(`SELECT o.obj_sub_type_id FROM obj o WHERE o.id = ?`)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
err = stmt.QueryRow(objId).Scan(&objSubTypeId)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
|
||
return objSubTypeId, nil
|
||
}
|
||
|
||
func setObjSubTypeId(objId int64, objSubTypeID64 int64) error {
|
||
stmt, err := db.Prepare(`UPDATE obj o SET o.obj_sub_type_id = ? WHERE o.id = ?;`)
|
||
logOnError(err, "setObjSubTypeId : prepare update")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(objSubTypeID64, objId)
|
||
logOnError(err, "setObjSubTypeId : exec update")
|
||
return err
|
||
}
|
||
|
||
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 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, cond, quality, seller, buyer, price, status, end)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(m.ObjID64, m.LotID, m.Item, m.Cond, m.Quality, m.Seller, m.Buyer, 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 {
|
||
switch c {
|
||
case "Deerhorn":
|
||
_, err = stmt2.Exec(m.ObjID64, castleDeer, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Dragonscale":
|
||
_, err = stmt2.Exec(m.ObjID64, castleDragon, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Highnest":
|
||
_, err = stmt2.Exec(m.ObjID64, castleHighnest, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Moonlight":
|
||
_, err = stmt2.Exec(m.ObjID64, castleMoon, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Potato":
|
||
_, err = stmt2.Exec(m.ObjID64, castlePotato, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Sharkteeth":
|
||
_, err = stmt2.Exec(m.ObjID64, castleShark, r.Gardian, r.Result, r.Gold, r.Stock, r.Points)
|
||
case "Wolfpack":
|
||
_, err = stmt2.Exec(m.ObjID64, castleWolf, 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()
|
||
|
||
switch m.Castle {
|
||
case "Deerhorn":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleDeer)
|
||
case "Dragonscale":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleDragon)
|
||
case "Highnest":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleHighnest)
|
||
case "Moonlight":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleMoon)
|
||
case "Potato":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castlePotato)
|
||
case "Sharkteeth":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleShark)
|
||
case "Wolfpack":
|
||
_, err = stmt.Exec(m.ObjID64, m.Attacker, castleWolf)
|
||
}
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func createJob(jobTypeID int32, priority int32, userID64 int64, schedule time.Time, payload []byte) error {
|
||
stmt, err := db.Prepare(`INSERT INTO obj (obj_type_id, obj_sub_type_id)
|
||
VALUES (? , ?);`)
|
||
logOnError(err, "createJob : prepare insert obj")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
res, err := stmt.Exec(objTypeJob, jobTypeID)
|
||
s := fmt.Sprintf("createJob, insert obj(%d, %d)", objTypeJob, jobTypeID)
|
||
logOnError(err, s)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
objId, err := res.LastInsertId()
|
||
logOnError(err, "createJob : get last insert Id")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
stmt, err = db.Prepare(`INSERT INTO obj_job (obj_id, priority, user_id, status, schedule, is_done, in_work, inserted, pulled, started, ended, payload)
|
||
VALUES (?, ?, ?, ?, ?, 0, 0, ?, NULL, NULL, NULL, ?);`)
|
||
logOnError(err, "createJob : prepare insert obj_job")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(objId, priority, userID64, objJobStatusNew, schedule, time.Now(), payload)
|
||
logOnError(err, "createJob : insert obj_job")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func setJobDone(jobId int64) error {
|
||
stmt, err := db.Prepare(`UPDATE obj_job j SET j.is_done = 1, j.in_work = 0, j.ended = ? WHERE j.obj_id = ?;`)
|
||
logOnError(err, "setJobDone : prepare update obj_job")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(time.Now(), jobId)
|
||
s := fmt.Sprintf("setJobDone, update obj_job(%d)", jobId)
|
||
logOnError(err, s)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func setJobStart(jobId int64) error {
|
||
stmt, err := db.Prepare(`UPDATE obj_job j SET j.started = ? WHERE j.obj_id = ?;`)
|
||
logOnError(err, "setJobStart : prepare update obj_job")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer stmt.Close()
|
||
|
||
_, err = stmt.Exec(time.Now(), jobId)
|
||
s := fmt.Sprintf("setJobStart, update obj_job(%d)", jobId)
|
||
logOnError(err, s)
|
||
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 int32
|
||
)
|
||
|
||
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 loadCurrentJobs() ([]Job, error) {
|
||
var (
|
||
objId int64
|
||
jobTypeId int32
|
||
status int32
|
||
payload []byte
|
||
jobs []Job
|
||
)
|
||
|
||
tx, err := db.Begin()
|
||
logOnError(err, "loadCurrentJobs : begin transaction")
|
||
if err != nil {
|
||
return jobs, err
|
||
}
|
||
defer tx.Rollback()
|
||
|
||
stmt, err := tx.Prepare("SELECT o.id, o.obj_sub_type_id, j.status, j.payload FROM obj_job j, obj o WHERE j.obj_id = o.id AND j.is_done = 0 and j.in_work = 0 AND j.schedule <= ? ORDER BY j.priority ASC, j.obj_id ASC LIMIT ? FOR UPDATE;")
|
||
logOnError(err, "loadCurrentJobs : prepare select statement")
|
||
|
||
rows, err := stmt.Query(time.Now(), SQLJobSliceSize)
|
||
logOnError(err, "loadCurrentJobs : query select statement")
|
||
|
||
for rows.Next() {
|
||
err = rows.Scan(&objId, &jobTypeId, &status, &payload)
|
||
logOnError(err, "loadCurrentJobs : scan query rows")
|
||
job := Job{
|
||
ID64: objId,
|
||
JobTypeID: jobTypeId,
|
||
Status: status,
|
||
Payload: payload,
|
||
}
|
||
jobs = append(jobs, job)
|
||
}
|
||
err = rows.Err()
|
||
logOnError(err, "loadCurrentJobs : scan end rows")
|
||
rows.Close()
|
||
|
||
err = stmt.Close()
|
||
logOnError(err, "loadCurrentJobs : close select statement")
|
||
|
||
stmt, err = tx.Prepare("UPDATE obj_job j SET j.in_work = 1, j.pulled = ? WHERE j.obj_id = ?;")
|
||
logOnError(err, "loadCurrentJobs : prepare update statement")
|
||
|
||
for _, job := range jobs {
|
||
_, err = stmt.Exec(time.Now(), job.ID64)
|
||
logOnError(err, "loadCurrentJobs : updating row")
|
||
}
|
||
|
||
err = stmt.Close()
|
||
logOnError(err, "loadCurrentJobs : close update statement")
|
||
|
||
err = tx.Commit()
|
||
logOnError(err, "loadCurrentJobs : commit")
|
||
|
||
return jobs, 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
|
||
}
|