diff --git a/bot.go b/bot.go index 46fd9ae..c31385e 100644 --- a/bot.go +++ b/bot.go @@ -739,7 +739,7 @@ func botVaultItem(m *tb.Message) { } r := regexp.MustCompile("([a-z][0-9]{2}[a-e]{0,1})") - for _, l := range re.FindAllStringSubmatch(m.Payload, -1) { + for _, l := range r.FindAllStringSubmatch(m.Payload, -1) { item := getObjItemID(l[1], ``) if item != 0 { p.ItemListID64 = append(p.ItemListID64, item) diff --git a/job.go b/job.go index 47e88ee..d9bcc9d 100644 --- a/job.go +++ b/job.go @@ -894,9 +894,10 @@ func jobGDeposit(j Job) { func jobVaultItemStatus(j Job) { var ( - p JobPayloadVaultItemStatus - //user, deposit, withdraw int64 - //userList, depositList, withdrawList []int64 + p JobPayloadVaultItemStatus + itemID64, currentItemID64 int64 + user, deposit, withdraw int64 + userList, depositList, withdrawList []int64 ) err := setJobStart(j.ID64) @@ -905,6 +906,98 @@ func jobVaultItemStatus(j Job) { err = json.Unmarshal(j.Payload, &p) logOnError(err, "jobVaultItemStatus : Unmarshal payload") + stmt := `SELECT x.item_id + ,x.user_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.item_id in (?` + strings.Repeat(",?", len(p.ItemListID64)-1) + `)) x + ORDER BY x.user_id ASC;` + + args := make([]interface{}, len(p.ItemListID64)+1) + args[0] = p.DepositChatID64 + for i, id := range p.ItemListID64 { + args[i+1] = id + } + + rows, err := db.Query(stmt, args...) + logOnError(err, "jobVaultItemStatus : Get rows") + + if err != nil { + err = setJobDone(j.ID64) + logOnError(err, "jobVaultItemStatus : setJobDone") + return + } + + currentItemID64 = 0 + for rows.Next() { + err = rows.Scan(&itemID64, &userID64, &deposit, &withdraw) + logOnError(err, "jobVaultItemStatus : scan next val") + if itemID64 != currentItemID64 { + if currentUserID64 != 0 { + // display info + out := fmt.Sprintf("%-32s | Depo. | Recv. | Total\n────────────────────────────┼──────┼──────┼──────\n", `User`) + for i, userId := range userList { + logOnError(err, "jobVaultItemStatus : getObjItem") + out = fmt.Sprintf("%s%-32d |%6d |%6d |%6d\n", out, userID, depositList[i], withdrawList[i], depositList[i]-withdrawList[i]) + } + out = fmt.Sprintf("%s", out) + + c := TGCommand{ + Type: commandSendMsg, + Text: out, + ToChatID64: p.UserID64, + ParseMode: cmdParseModeHTML, + } + TGCmdQueue <- c + } + currentUserID64 = userID64 + itemList = nil + depositList = nil + withdrawList = nil + } + + userList = append(userList, userID64) + depositList = append(depositList, deposit) + withdrawList = append(withdrawList, withdraw) + } + if currentUserID64 != 0 { + // display info + out := fmt.Sprintf("%-32s | Depo. | Recv. | Total\n────────────────────────────┼──────┼──────┼──────\n", `User`) + for i, userId := range userList { + logOnError(err, "jobVaultItemStatus : getObjItem") + out = fmt.Sprintf("%s%-32d |%6d |%6d |%6d\n", out, userID, depositList[i], withdrawList[i], depositList[i]-withdrawList[i]) + } + out = fmt.Sprintf("%s", out) + + c := TGCommand{ + Type: commandSendMsg, + Text: out, + ToChatID64: p.UserID64, + ParseMode: cmdParseModeHTML, + } + TGCmdQueue <- c + } + + err = rows.Err() + logOnError(err, "jobVaultItemStatus : query end") + rows.Close() + err = setJobDone(j.ID64) logOnError(err, "jobVaultItemStatus : setJobDone") @@ -927,26 +1020,26 @@ func jobVaultUserStatus(j Job) { 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 + ,(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 + 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;` args := make([]interface{}, len(p.UserListID64)+len(p.ItemTypeListID64)+1) @@ -974,6 +1067,21 @@ func jobVaultUserStatus(j Job) { if userID64 != currentUserID64 { if currentUserID64 != 0 { // display info + out := fmt.Sprintf("%-32s | Depo. | Recv. | Total\n────────────────────────────┼──────┼──────┼──────\n", `Item`) + for i, itemId := range itemList { + item, err := getObjItem(itemId) + logOnError(err, "jobVaultUserStatus : getObjItem") + out = fmt.Sprintf("%s%-32s |%6d |%6d |%6d\n", out, item.Name, depositList[i], withdrawList[i], depositList[i]-withdrawList[i]) + } + out = fmt.Sprintf("%s", out) + + c := TGCommand{ + Type: commandSendMsg, + Text: out, + ToChatID64: p.UserID64, + ParseMode: cmdParseModeHTML, + } + TGCmdQueue <- c } currentUserID64 = userID64 itemList = nil @@ -990,7 +1098,7 @@ func jobVaultUserStatus(j Job) { out := fmt.Sprintf("%-32s | Depo. | Recv. | Total\n────────────────────────────┼──────┼──────┼──────\n", `Item`) for i, itemId := range itemList { item, err := getObjItem(itemId) - logOnError(err, "jobVaultStatus : getObjItem") + logOnError(err, "jobVaultUserStatus : getObjItem") out = fmt.Sprintf("%s%-32s |%6d |%6d |%6d\n", out, item.Name, depositList[i], withdrawList[i], depositList[i]-withdrawList[i]) } out = fmt.Sprintf("%s", out)