mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-16 00:52:40 +00:00
Coop: stack same-type gifts on the same day into a single vote post
Multiple baskets (or multiple mimics) sent during the same day now share one game-room post, one vote, one resolution. First-in becomes the stack "lead"; subsequent same-type sends become followers that inherit the lead's deadline and votes. Behavior: - Send a basket → new lead, new post, 6h timer starts - Send another basket within the window → silently joins the stack, edits lead's post to bump count - At stack size 2, TwinBee adds a "this gift looks REALLY special" line (one of 5 variants picked deterministically by lead id). No further escalation as the stack grows - One !coop giftvote on the lead's id covers the whole stack - Resolution applies the same outcome to every gift in the stack; modifier is N × ±6 - End-of-run gift log groups by stack with all senders attributed Schema: coop_dungeon_gifts.stack_lead_id INTEGER (NULL for lead/standalone, otherwise points at lead's id). Migration entry included. Why first-in deadline (vs extending on each follower): exploitability. Saboteurs could spam-extend a stack to delay resolution. Locked deadline keeps senders honest about timing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -402,25 +402,30 @@ func (p *AdventurePlugin) handleCoopAdmGift(ctx MessageContext, args string) err
|
||||
return p.SendDM(ctx.Sender, fmt.Sprintf("Run #%d is %s — gifts only land during active runs.", runID, run.Status))
|
||||
}
|
||||
|
||||
giftID, err := createCoopGift(runID, sender, run.CurrentDay, giftType)
|
||||
giftID, leadID, isNewLead, err := createCoopGift(runID, sender, run.CurrentDay, giftType)
|
||||
if err != nil {
|
||||
return p.SendDM(ctx.Sender, "Couldn't create gift.")
|
||||
}
|
||||
|
||||
gr := gamesRoom()
|
||||
if gr != "" {
|
||||
gift, _ := loadCoopGift(giftID)
|
||||
members, _ := loadCoopMembers(runID)
|
||||
if gift != nil {
|
||||
if isNewLead {
|
||||
gift, _ := loadCoopGift(giftID)
|
||||
postID, perr := p.SendMessageID(gr, renderCoopGiftPost(p, run, gift, members))
|
||||
if perr == nil {
|
||||
_ = saveCoopGiftPostID(giftID, postID)
|
||||
}
|
||||
} else {
|
||||
lead, _ := loadCoopGift(leadID)
|
||||
if lead != nil && lead.PostEventID != "" {
|
||||
_ = p.EditMessage(gr, lead.PostEventID, renderCoopGiftPost(p, run, lead, members))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return p.SendDM(ctx.Sender, fmt.Sprintf("📦 Admin gift dispatched: %s from %s to run #%d (day %d). Gift id #%d. No harvest action consumed.",
|
||||
giftType, sender, runID, run.CurrentDay, giftID))
|
||||
return p.SendDM(ctx.Sender, fmt.Sprintf("📦 Admin gift dispatched: %s from %s to run #%d (day %d). Gift id #%d (stack lead %d). No harvest action consumed.",
|
||||
giftType, sender, runID, run.CurrentDay, giftID, leadID))
|
||||
}
|
||||
|
||||
func (p *AdventurePlugin) handleCoopVote(ctx MessageContext, voteArg string) error {
|
||||
|
||||
Reference in New Issue
Block a user