diff --git a/job.go b/job.go
index 914ebec..e2208df 100644
--- a/job.go
+++ b/job.go
@@ -1935,12 +1935,16 @@ func jobCraftItem(j Job) {
func jobCraftAll(j Job) {
var (
- p JobPayloadCraftAll
- p2 JobPayloadGetVault
- b []byte
- partsItems map[int64]string
- recipesItems map[int64]string
- ratioItems map[string]int64
+ p JobPayloadCraftAll
+ p2 JobPayloadGetVault
+ b []byte
+ itemParts map[int64]string
+ itemRecipes map[int64]string
+ ratioItems map[string]int64
+ totalParts map[string]int64
+ totalRecipes map[string]int64
+ completeItems map[string]float64
+ maxItems int64
)
err := setJobStart(j.ID64)
@@ -1977,9 +1981,12 @@ func jobCraftAll(j Job) {
err = json.Unmarshal(b, &p2)
logOnError(err, "jobCraftAll : Unmarshal(p2)")
- partsItems = make(map[string]int64)
- recipesItems = make(map[string]int64)
+ itemParts = make(map[int64]string)
+ itemRecipes = make(map[int64]string)
ratioItems = make(map[string]int64)
+ totalParts = make(map[string]int64)
+ totalRecipes = make(map[string]int64)
+ completeItems = make(map[string]float64)
muxObjItem.RLock()
for _, o := range objItems {
@@ -1989,9 +1996,9 @@ func jobCraftAll(j Job) {
p, _ := getObjItem(i.ItemID64)
if p.ItemTypeID == cacheObjSubType[`item_part`] {
ratioItems[o.Code] = i.Quantity
- partsItems[p.ObjID64] = o.Code
+ itemParts[p.ObjID64] = o.Code
} else if p.ItemTypeID == cacheObjSubType[`item_recipe`] {
- recipesItems[p.ObjID64] = o.Code
+ itemRecipes[p.ObjID64] = o.Code
}
}
}
@@ -2000,46 +2007,71 @@ func jobCraftAll(j Job) {
muxObjItem.RUnlock()
for _, i := range p2.Vault {
+ if item, ok := itemsParts[i.ItemID64]; ok {
+ totalParts[item] = i.Quantity
+ } else if item, ok := itemsRecipes[i.ItemID64]; ok {
+ totalRecipes[item] = i.Quantity
+ }
+ }
+ for k, i := range ratioItems {
+ recipes, _ := totalRecipes[k]
+ parts, _ := totalParts[k]
+ if (recipes > 0 && parts > (i-1)) || (parts >= i) {
+ completeItems[k] = MinInt64(recipes*i, parts) / i
+ maxItems = MaxInt64(maxItems, int64(completeItems[k]))
+ }
}
/* we can finish the job */
- /*
- out := fmt.Sprintf("Summary for %d %s\n", p.Quantity, item.Names[0])
- out = fmt.Sprintf("%s Mana : %d\n", out, totalMana)
- out = fmt.Sprintf("%s Items :\n", out)
- for k, v := range requiredItems {
- obj, _ := getObjItem(getObjItemID(k, ``))
- ava, _ := availableItems[k]
- out = fmt.Sprintf("%s [%s] %s : %d (%d)\n", out, obj.Code, obj.Names[0], v, ava)
- }
- out = fmt.Sprintf("%s Missing :\n", out)
- for k, v := range missingItems {
- if v > 0 {
- obj, _ := getObjItem(getObjItemID(k, ``))
- out = fmt.Sprintf("%s [%s] %s : %d\n", out, obj.Code, obj.Names[0], v)
- }
- }
- out = fmt.Sprintf("%s To craft :\n", out)
- for k, v := range craftItems {
- if v > 0 {
- obj, _ := getObjItem(getObjItemID(k, ``))
- out = fmt.Sprintf("%s [%s] %s : %d\n", out, obj.Code, obj.Names[0], v)
- }
- }
- out = fmt.Sprintf("%s
", out)
+ out := fmt.Sprintf("Vault crafting summary\n")
- c := TGCommand{
- Type: commandReplyMsg,
- Text: out,
- FromMsgID64: p.MsgID64,
- FromChatID64: p.ChatID64,
- ParseMode: cmdParseModeHTML,
+ for maxItems > 0 {
+ out = fmt.Sprintf("%s%d Items :\n", out, maxItems)
+ for k, v := range completeItems {
+ if maxItems == int64(v) {
+ o, _ := getObjItem(getSilentObjItemID(k, ``))
+ out = fmt.Sprintf("%s %s - %s\n", out, k, o.Names[0])
+ }
}
- TGCmdQueue <- c
- */
+ maxItems -= 1
+ }
+
+ out = fmt.Sprintf("%s1 Part missing :\n", out)
+ for k, v := range completeItems {
+ if int64(v) == 0 {
+ parts, _ := totalParts[k]
+ if parts == ratioItems[k]-1 {
+ o, _ := getObjItem(getSilentObjItemID(k, ``))
+ out = fmt.Sprintf("%s %s - %s\n", out, k, o.Names[0])
+ }
+ }
+ }
+
+ out = fmt.Sprintf("%sRecipe missing :\n", out)
+ for k, v := range completeItems {
+ if int64(v) == 0 {
+ recipe, _ := totalRecipes[k]
+ if recipe == 0 {
+ o, _ := getObjItem(getSilentObjItemID(k, ``))
+ out = fmt.Sprintf("%s %s - %s\n", out, k, o.Names[0])
+ }
+ }
+ }
+
+ out = fmt.Sprintf("%s
", out)
+
+ c := TGCommand{
+ Type: commandReplyMsg,
+ Text: out,
+ FromMsgID64: p.MsgID64,
+ FromChatID64: p.ChatID64,
+ ParseMode: cmdParseModeHTML,
+ }
+ TGCmdQueue <- c
+
err = setJobDone(j.ID64)
- logOnError(err, "jobCraftItem : setJobDone")
+ logOnError(err, "jobCraftAll : setJobDone")
return
diff --git a/utils.go b/utils.go
index 7c610d7..ee78588 100644
--- a/utils.go
+++ b/utils.go
@@ -22,7 +22,7 @@ func logOnError(err error, msg string) {
}
}
-func MinInt(a int, b int) int {
+func MinInt64(a int64, b int64) int64 {
if a < b {
return a
} else {
@@ -30,7 +30,7 @@ func MinInt(a int, b int) int {
}
}
-func MaxInt(a int, b int) int {
+func MaxInt(a int64, b int64) int64 {
if a > b {
return a
} else {