@@ -342,137 +342,112 @@ func init() {
342342 }
343343 ctx .SendChain (message .Text ("附魔成功," , book , "等级提高至" , enchantLevel [number ]))
344344 })
345- engine .OnRegex (`^合成(.+竿|三叉戟)$` , getdb ).SetBlock (true ).Limit (ctxext .LimitByUser ).Handle (func (ctx * zero.Ctx ) {
346- uid := ctx .Event .UserID
347- thingList := []string {"木竿" , "铁竿" , "金竿" , "钻石竿" , "下界合金竿" , "三叉戟" }
348- thingName := ctx .State ["regex_matched" ].([]string )[1 ]
349- indexOfMaterial := - 1
350- for i , name := range thingList {
351- if thingName == name {
352- indexOfMaterial = (i - 1 )
353- break
354- }
355- }
356- if indexOfMaterial < 0 {
357- return
358- }
359- articles , err := dbdata .getUserThingInfo (uid , thingList [indexOfMaterial ])
360- if err != nil {
361- ctx .SendChain (message .Text ("[ERROR at pole.go.10]:" , err ))
362- return
363- }
364- maxCount := len (articles )
365- if maxCount < 3 {
366- ctx .SendChain (message .Reply (ctx .Event .MessageID ), message .Text ("你的合成材料不足" ))
367- return
368- }
369- poles := make ([]equip , 0 , maxCount )
370- for _ , info := range articles {
371- poleInfo := strings .Split (info .Other , "/" )
372- durable , _ := strconv .Atoi (poleInfo [0 ])
373- maintenance , _ := strconv .Atoi (poleInfo [1 ])
374- induceLevel , _ := strconv .Atoi (poleInfo [2 ])
375- favorLevel , _ := strconv .Atoi (poleInfo [3 ])
376- poles = append (poles , equip {
377- ID : uid ,
378- Equip : info .Name ,
379- Durable : durable ,
380- Maintenance : maintenance ,
381- Induce : induceLevel ,
382- Favor : favorLevel ,
383- })
384- }
385- list := []int {0 , 1 , 2 }
386- check := false
387- if len (articles ) > 3 {
388- msg := make (message.Message , 0 , 3 + len (articles ))
389- msg = append (msg , message .Text ("找到以下鱼竿:\n " ))
390- for i , info := range poles {
391- msg = append (msg , message .Text ("[" , i , "] " , info .Equip , " : 耐" , info .Durable , "/修" , info .Maintenance ,
392- "/诱" , enchantLevel [info .Induce ], "/眷顾" , enchantLevel [info .Favor ], "\n " ))
393- }
394- msg = append (msg , message .Text ("————————\n " ))
395- msg = append (msg , message .Text ("- 输入3个序号进行合成(用空格分割)\n " ))
396- msg = append (msg , message .Text ("- 输入“取消”,终止本次合成\n " ))
397- msg = append (msg , message .Text ("- 输入“梭哈“,合成所有鱼竿" ))
398- ctx .Send (message .ReplyWithMessage (ctx .Event .MessageID , msg ... ))
399- // 等待用户下一步选择
400- recv , cancel := zero .NewFutureEvent ("message" , 999 , false , zero .RegexRule (`^(梭哈|取消|\d+ \d+ \d+)$` ), zero .CheckUser (ctx .Event .UserID )).Repeat ()
401- defer cancel ()
402- for {
403- select {
404- case <- time .After (time .Second * 120 ):
405- ctx .Send (
406- message .ReplyWithMessage (ctx .Event .MessageID ,
407- message .Text ("等待超时,取消合成" ),
408- ),
409- )
410- return
411- case e := <- recv :
412- nextcmd := e .Event .Message .String ()
413- if nextcmd == "取消" {
414- ctx .Send (
415- message .ReplyWithMessage (ctx .Event .MessageID ,
416- message .Text ("已取消合成" ),
417- ),
418- )
419- return
420- }
421- if nextcmd == "梭哈" {
422- // len(list)取3的倍数,表示能够用于合成鱼竿的最大数量,note:此处未对article.Number>1的情况做处理
423- for i := 3 ; i < (len (articles )/ 3 )* 3 ; i ++ {
424- list = append (list , i )
425- }
426- check = true
427- break
428- }
429- chooseList := strings .Split (nextcmd , " " )
430- first , err := strconv .Atoi (chooseList [0 ])
431- if err != nil {
432- ctx .SendChain (message .Text ("[ERROR at pole.go.11.1]:" , err ))
433- return
434- }
435- second , err := strconv .Atoi (chooseList [1 ])
436- if err != nil {
437- ctx .SendChain (message .Text ("[ERROR at pole.go.11.2]:" , err ))
438- return
439- }
440- third , err := strconv .Atoi (chooseList [2 ])
441- if err != nil {
442- ctx .SendChain (message .Text ("[ERROR at pole.go.11.3]:" , err ))
443- return
444- }
445- list = []int {first , second , third }
446- if first == second || first == third || second == third {
447- ctx .SendChain (message .At (ctx .Event .UserID ), message .Text ("[0]请输入正确的序号\n " , list ))
448- continue
449- }
450- if first >= maxCount || second >= maxCount || third >= maxCount {
451- ctx .SendChain (message .At (ctx .Event .UserID ), message .Text ("[" , maxCount , "]请输入正确的序号\n " , list ))
452- continue
453- }
454- check = true
455- }
456- if check {
457- break
458- }
459- }
460- }
461- upgradeNum := len (list )
462- if upgradeNum == 0 || upgradeNum % 3 != 0 {
463- ctx .SendChain (message .At (uid ), message .Text ("❌ 合成失败:材料数量必须是 3 的倍数(当前选择了 " , upgradeNum , " 个)" ))
464- return
465- }
345+ engine .OnRegex (`^合成(.+竿|三叉戟)$` , getdb ).SetBlock (true ).Limit (ctxext .LimitByUser ).Handle (func (ctx * zero.Ctx ) {
346+ uid := ctx .Event .UserID
347+ thingList := []string {"木竿" , "铁竿" , "金竿" , "钻石竿" , "下界合金竿" , "三叉戟" }
348+ thingName := ctx .State ["regex_matched" ].([]string )[1 ]
349+ indexOfMaterial := - 1
350+ for i , name := range thingList {
351+ if thingName == name {
352+ indexOfMaterial = (i - 1 )
353+ break
354+ }
355+ }
356+ if indexOfMaterial < 0 {
357+ return
358+ }
359+ articles , err := dbdata .getUserThingInfo (uid , thingList [indexOfMaterial ])
360+ if err != nil {
361+ ctx .SendChain (message .Text ("[ERROR at pole.go.10]:" , err ))
362+ return
363+ }
364+ maxCount := len (articles )
365+ if maxCount < 3 {
366+ ctx .SendChain (message .Reply (ctx .Event .MessageID ), message .Text ("你的合成材料不足" ))
367+ return
368+ }
466369
370+ poles := make ([]equip , 0 , maxCount )
371+ for _ , info := range articles {
372+ poleInfo := strings .Split (info .Other , "/" )
373+ durable , _ := strconv .Atoi (poleInfo [0 ])
374+ maintenance , _ := strconv .Atoi (poleInfo [1 ])
375+ induceLevel , _ := strconv .Atoi (poleInfo [2 ])
376+ favorLevel , _ := strconv .Atoi (poleInfo [3 ])
377+ poles = append (poles , equip {
378+ ID : uid ,
379+ Equip : info .Name ,
380+ Durable : durable ,
381+ Maintenance : maintenance ,
382+ Induce : induceLevel ,
383+ Favor : favorLevel ,
384+ })
385+ }
386+ var list []int
387+ check := false
388+ msg := make (message.Message , 0 , 3 + len (articles ))
389+ msg = append (msg , message .Text ("找到以下材料 (" + thingList [indexOfMaterial ]+ "):\n " ))
390+ for i , info := range poles {
391+ msg = append (msg , message .Text ("[" , i , "] " , info .Equip , " : 耐" , info .Durable , "/修" , info .Maintenance ,
392+ "/诱" , enchantLevel [info .Induce ], "/眷顾" , enchantLevel [info .Favor ], "\n " ))
393+ }
394+ msg = append (msg , message .Text ("————————\n " ))
395+ msg = append (msg , message .Text ("- 输入3个序号进行合成(用空格分割)\n " ))
396+ msg = append (msg , message .Text ("- 输入“取消”,终止本次合成\n " ))
397+ msg = append (msg , message .Text ("- 输入“梭哈“,合成所有鱼竿" ))
398+ ctx .Send (message .ReplyWithMessage (ctx .Event .MessageID , msg ... ))
399+ recv , cancel := zero .NewFutureEvent ("message" , 999 , false , zero .RegexRule (`^(梭哈|取消|(?:\d+\s*)+)$` ), zero .CheckUser (ctx .Event .UserID )).Repeat ()
400+ defer cancel ()
401+ for {
402+ select {
403+ case <- time .After (time .Second * 120 ):
404+ ctx .Send (message .ReplyWithMessage (ctx .Event .MessageID , message .Text ("等待超时,取消合成" )))
405+ return
406+ case e := <- recv :
407+ nextcmd := strings .TrimSpace (e .Event .Message .String ())
408+ if nextcmd == "取消" {
409+ ctx .Send (message .ReplyWithMessage (ctx .Event .MessageID , message .Text ("已取消合成" )))
410+ return
411+ }
412+ if nextcmd == "梭哈" {
413+ for i := 0 ; i < (len (articles )/ 3 )* 3 ; i ++ {
414+ list = append (list , i )
415+ }
416+ check = true
417+ } else {
418+ parts := strings .Fields (nextcmd )
419+ if len (parts )% 3 != 0 {
420+ ctx .SendChain (message .At (ctx .Event .UserID ), message .Text ("\n 合成失败:材料数量必须是 3 的倍数(当前输入了 " , len (parts ), " 个)" ))
421+ continue
422+ }
423+ tempList := []int {}
424+ valid := true
425+ for _ , p := range parts {
426+ idx , err := strconv .Atoi (p )
427+ if err != nil || idx < 0 || idx >= maxCount {
428+ ctx .SendChain (message .At (ctx .Event .UserID ), message .Text ("\n 序号 [" , p , "] 超出范围,请重新输入" ))
429+ valid = false
430+ break
431+ }
432+ tempList = append (tempList , idx )
433+ }
434+ if valid {
435+ list = tempList
436+ check = true
437+ }
438+ }
439+ }
440+ if check {
441+ break
442+ }
443+ }
444+ upgradeNum := len (list )
467445 groupCount := upgradeNum / 3
468446 var successCount , failCount int
469447 var reportDetails []string
470-
471448 baseTime := time .Now ().Unix ()
472-
473449 for g := 0 ; g < groupCount ; g ++ {
474450 var groupInduce , groupFavor int
475-
476451 for i := 0 ; i < 3 ; i ++ {
477452 idx := list [g * 3 + i ]
478453 thingInfo := articles [idx ]
@@ -482,47 +457,39 @@ func init() {
482457 groupInduce += poles [idx ].Induce
483458 groupFavor += poles [idx ].Favor
484459 }
485-
486460 if rand .Intn (100 ) >= 90 {
487461 failCount ++
488462 continue
489463 }
490-
491464 successCount ++
492465 avgInduce := groupInduce / 3
493466 avgFavor := groupFavor / 3
494467 attribute := strconv .Itoa (durationList [thingName ]) + "/0/" + strconv .Itoa (avgInduce ) + "/" + strconv .Itoa (avgFavor )
495-
496468 newthing := article {
497469 Duration : baseTime + int64 (g * 10 ) + int64 (rand .Intn (100 )),
498470 Type : "pole" ,
499471 Name : thingName ,
500472 Number : 1 ,
501473 Other : attribute ,
502474 }
503-
504475 err = dbdata .updateUserThingInfo (uid , newthing )
505476 if err != nil {
506477 failCount ++
507478 continue
508479 }
509-
510480 if successCount <= 5 {
511- reportDetails = append (reportDetails , "✨ 第 " + strconv .Itoa (successCount )+ " 支: [诱钓" + strconv .Itoa (avgInduce )+ " 海眷" + strconv .Itoa (avgFavor )+ "]" )
481+ reportDetails = append (reportDetails , "第 " + strconv .Itoa (successCount )+ " 支: [诱钓" + strconv .Itoa (avgInduce )+ " 海眷" + strconv .Itoa (avgFavor )+ "]" )
512482 }
513483 }
514-
515- finalReport := " 合成报告 \n "
484+ finalReport := "合成报告\n "
516485 finalReport += "消耗材料: " + strconv .Itoa (upgradeNum ) + " 个\n "
517486 finalReport += "成功产出: " + strconv .Itoa (successCount ) + " 支 | 失败: " + strconv .Itoa (failCount ) + " 组\n "
518-
519487 if successCount > 0 {
520488 finalReport += "----\n " + strings .Join (reportDetails , "\n " )
521489 if successCount > 5 {
522490 finalReport += "\n ...以及其余 " + strconv .Itoa (successCount - 5 ) + " 支属性已略过"
523491 }
524492 }
525-
526493 ctx .Send (message .ReplyWithMessage (ctx .Event .MessageID , message .Text (strings .TrimSpace (finalReport ))))
527494 })
528495}
0 commit comments