diff --git a/job.go b/job.go index 36dd317..1b9cef9 100644 --- a/job.go +++ b/job.go @@ -329,29 +329,29 @@ func jobPillage(j Job) { logOnError(err, "jobPillage : Unmarshal payload") // check if we have a acknoledgment of go or a timeout within 3m30 of the PillageInc from the Job - ids := getSQLListID64(` select ox.id - from obj ox - ,obj_msg omx - ,obj op - ,obj_msg omp - ,obj_job oj - where oj.obj_id = ` + strconv.FormatInt(j.ID64, 10) + ` - and omx.user_id = oj.user_id - and omx.sender_user_id = ` + strconv.Itoa(userID64ChtWrsBot) + ` - and omx.obj_id = ox.id - and ox.obj_sub_type_id in (` + strconv.Itoa(objSubTypeMessagePillageGo) + + ids := getSQLListID64(`SELECT ox.id + FROM obj ox + ,obj_msg omx + ,obj op + ,obj_msg omp + ,obj_job oj + WHERE oj.obj_id = ` + strconv.FormatInt(j.ID64, 10) + ` + AND omx.user_id = oj.user_id + AND omx.sender_user_id = ` + strconv.Itoa(userID64ChtWrsBot) + ` + AND omx.obj_id = ox.id + AND ox.obj_sub_type_id in (` + strconv.Itoa(objSubTypeMessagePillageGo) + `, ` + strconv.Itoa(objSubTypeMessagePillageTimeout) + `, ` + strconv.Itoa(objSubTypeMessagePillageLoss) + `, ` + strconv.Itoa(objSubTypeMessagePillageWin) + `) - and op.id = ` + strconv.FormatInt(r.ObjID64, 10) + ` - and omp.obj_id = op.id - and omx.date between omp.date and addtime(omp.date, '0 0:3:30.000000') - order by case ox.obj_sub_type_id when ` + strconv.Itoa(objSubTypeMessagePillageWin) + ` then 0 - when ` + strconv.Itoa(objSubTypeMessagePillageLoss) + ` then 1 - when ` + strconv.Itoa(objSubTypeMessagePillageTimeout) + ` then 2 - when ` + strconv.Itoa(objSubTypeMessagePillageGo) + ` then 3 - else 4 end asc - limit 1;`) + AND op.id = ` + strconv.FormatInt(r.ObjID64, 10) + ` + AND omp.obj_id = op.id + AND omx.date between omp.date AND ADDTIME(omp.date, '0 0:3:30.000000') + ORDER BY CASE ox.obj_sub_type_id WHEN ` + strconv.Itoa(objSubTypeMessagePillageWin) + ` THEN 0 + WHEN ` + strconv.Itoa(objSubTypeMessagePillageLoss) + ` THEN 1 + WHEN ` + strconv.Itoa(objSubTypeMessagePillageTimeout) + ` THEN 2 + WHEN ` + strconv.Itoa(objSubTypeMessagePillageGo) + ` THEN 3 + ELSE 4 END ASC + LIMIT 1;`) if len(ids) > 1 { // issue there ? s := TGCommand{ @@ -893,12 +893,76 @@ func jobGDeposit(j Job) { } func jobVaultStatus(j Job) { - var p JobPayloadVaultStatus + var ( + p JobPayloadVaultStatus + userID64, currentUserID64 int64 + itemID64, deposit, withdraw int64 + itemList, depositList, withdrawList []int64 + ) + err := setJobStart(j.ID64) logOnError(err, "jobVaultStatus : setJobStart") err = json.Unmarshal(j.Payload, &p) logOnError(err, "jobVaultStatus : Unmarshal payload") + + stmt := `SELECT x.user_id + ,x.item_id + ,(SELECT COALESCE(SUM(omv.quantity), 0) + FROM obj_msg_vault_v omv + WHERE omv.user_id = x.user_id + AND omv.item_id = x.item_id + AND omv.msg_type_id = ` + strconv.Itoa(objSubTypeMessageGDepositAck) + ` + AND omv.chat_id = x.chat_id) deposit + ,(SELECT COALESCE(SUM(omv.quantity), 0) + FROM obj_msg_vault_v omv + WHERE omv.user_id = x.user_id + AND omv.item_id = x.item_id + AND omv.msg_type_id = ` + strconv.Itoa(objSubTypeMessageWithdrawRcv) + ` + AND omv.chat_id = x.chat_id) withdraw + FROM (SELECT DISTINCT + omv.user_id + ,omv.chat_id + ,omv.item_id + FROM obj_msg_vault_v omv + WHERE omv.chat_id = ? + AND omv.user_id in (?` + strings.Repeat(",?", len(p.UserListID64)-1) + `) + AND omv.item_type_id in (?` + strings.Repeat(",?", len(p.ItemTypeListID64)-1) + `)) x + ORDER BY x.user_id ASC;` + + rows, err := db.Query(stmt, p.DepositChatID64, p.UserListID64..., p.ItemTypeListID64...) + logOnError(err, "jobVaultStatus : Get rows") + + if err != nil { + err = setJobDone(j.ID64) + logOnError(err, "jobVaultStatus : setJobDone") + return + } + + currentUserID64 = 0 + for rows.Next() { + err = rows.Scan(&userID64, &itemID64, &deposit, &withdraw) + logOnError(err, "jobVaultStatus : scan next val") + if userID64 != currentUserID64 { + if currentUserID64 != 0 { + // display info + } + itemList = nil + depositList = nil + withdrawList = nil + } + + itemList = append(itemList, itemID64) + depositList = append(depositList, deposit) + withdrawList = append(withdrawList, withdraw) + } + if currentUserID64 != 0 { + //display info + } + err = rows.Err() + logOnError(err, "jobVaultStatus : query end") + rows.Close() + err = setJobDone(j.ID64) logOnError(err, "jobVaultStatus : setJobDone") diff --git a/sql.go b/sql.go index 6e760c4..b0cd5a4 100644 --- a/sql.go +++ b/sql.go @@ -585,16 +585,17 @@ func initDB() { _, err = db.Exec(`CREATE VIEW obj_msg_vault_v AS SELECT om.sender_user_id user_id ,om.chat_id - ,o.obj_sub_type_id msg_type_id + ,om.obj_sub_type_id msg_type_id ,omi.item_id + ,oi.obj_sub_type_id item_type_id ,omi.quantity - FROM obj o - ,obj_msg om + FROM obj om + ,obj oi ,obj_msg_item omi - WHERE o.id = om.obj_id - AND o.obj_type_id = ` + strconv.Itoa(objTypeMessage) + ` - AND o.obj_sub_type_id in (` + strconv.Itoa(objSubTypeMessageWithdrawRcv) + `, ` + strconv.Itoa(objSubTypeMessageGDepositAck) + `) + WHERE om.obj_type_id = ` + strconv.Itoa(objTypeMessage) + ` + AND om.obj_sub_type_id in (` + strconv.Itoa(objSubTypeMessageWithdrawRcv) + `, ` + strconv.Itoa(objSubTypeMessageGDepositAck) + `) AND omi.obj_id = o.id + AND oi.id = omi.item_id ORDER BY om.sender_user_id ASC ,omi.item_id ASC;`) failOnError(err, "initDB : create view obj_msg_vault_v") @@ -604,8 +605,6 @@ func initDB() { } func insertMsgItem(objId int64, itemId int64, quantity int64) error { - log.Printf("insertMsgItem inserting (%d, %d, %d)\n", objId, itemId, quantity) - stmt, err := db.Prepare(`INSERT INTO obj_msg_item (obj_id, item_id, quantity) VALUES (?, ?, ?);`) if err != nil {