giveaways.
running a fair draw without counting reactions by hand.
starting a giveaway
giveaway posts use a button for entry and a numbered id for every later command. hosts need Discord’s manage server permission. choose the duration, winner count, and complete prize text before posting, then keep the id from havoc’s confirmation.
,giveaway start 2h 1 game key
/giveaway start duration: 1d12h winners: 3 prize: supporter bundle| command | what it does | needs |
|---|---|---|
| /giveaway start <duration> <winners> <prize> | post a button-entry giveaway and start its countdown | manage server |
durations combine whole numbers with s, m, h, d, orw: 30m, 2h, and 1d12h are valid. spaces, decimals, and bare numbers are not. a giveaway must run for at least 10 seconds and no more than 60 days.
who can enter
anyone who can see the post and use its entry button can try to enter. requirements are checked by havoc, so seeing the button does not guarantee eligibility. add requirements when starting through the slash command’s requirements value, or set them immediately afterward with the dedicated command.
- ::role
- requires the entrant to hold the named Discord role.
- ::account
- requires the Discord account to be at least the supplied duration old.
- ::server
- requires the member to have been in this server for at least the supplied duration.
,giveaway require 12 role @supporter
,giveaway require 12 account 30d
,giveaway require 12 server 7d
,giveaway require 12 role noneage values use the same duration grammar and may be up to 3650 days. use none to remove one requirement. changing a requirement affects who is eligible; it does not create a second giveaway.
the start command supports role, account-age, and server-time requirements so eligibility can exist from the first moment. if a host adds them later, members may already have pressed the button under the earlier rules.
finding and checking giveaways
listing is open to anyone and shows every active giveaway with prize, winner count, entry count, and time remaining. viewing one id shows its full card. these read-only commands do not require manage server.
| command | what it does | needs |
|---|---|---|
| /giveaway list | list running or paused giveaways | anyone |
| /giveaway view <id> | show one giveaway and its entry count | anyone |
,giveaway list
,giveaway view 12
/giveaway view id: 12use the numeric id shown on the giveaway post and in the list. a message link is not the id. the list is the quickest recovery path when a host has lost the original confirmation.
editing a live giveaway
a host can change exactly three fields: prize, winner count, or remaining time. the new time is parsed as a duration from the edit, rather than as a clock date. requirements have their own command and cannot be passed as an edit field.
| command | what it does | needs |
|---|---|---|
| /giveaway edit <id> prize <value> | replace the displayed prize text | manage server |
| /giveaway edit <id> winners <value> | change how many winners will be drawn | manage server |
| /giveaway edit <id> time <value> | replace the time remaining with a duration | manage server |
| /giveaway require <id> <role|account|server> <value or none> | set or clear one eligibility rule | manage server |
havoc attempts to refresh the original post after each update. if that message was deleted or the channel is no longer writable, the command can update its stored record while warning that the post could not be updated.
pausing and resuming
pausing freezes the countdown and preserves entries. resuming starts a new deadline using the amount of time that was left; it does not reset the giveaway to its original full duration.
- 01
pause by id
run
,giveaway pause 12; havoc reports the time left. - 02
check the state
,giveaway listlabels it paused and keeps its entry count. - 03
resume it
run
,giveaway resume 12to restart that remaining countdown.
| command | what it does | needs |
|---|---|---|
| /giveaway pause <id> | stop the countdown without losing entries | manage server |
| /giveaway resume <id> | restart a paused giveaway’s countdown | manage server |
ending, cancelling, and deleting
these operations are deliberately different. ending settles immediately and draws eligible winners. cancelling settles with no winner. deleting removes the stored record and stops its countdown. choose based on whether the giveaway should produce an outcome and retain a record.
| command | what it does | needs |
|---|---|---|
| /giveaway end <id> | end now and draw winners | manage server |
| /giveaway cancel <id> | finish with no winners | manage server |
| /giveaway delete <id> | delete the record and stop its countdown | manage server |
| /giveaway reroll <id> [count] | draw replacement winners from a finished giveaway | manage server |
use ,giveaway cancel 12 when members need a clear no-winner outcome. use delete only when the record itself should disappear. reroll works on a finished giveaway, so deleting first removes the record it would need.
reroll defaults to the giveaway’s winner count unless a replacement count is supplied. if there are no eligible entries at settlement, havoc announces that the prize goes to nobody rather than selecting an ineligible member.
what happens after a restart
giveaway records, entries, deadlines, and button handling survive a havoc restart. on startup, havoc resyncs active records and settles anything whose deadline passed while it was offline. a paused giveaway remains paused because its remaining time is stored rather than allowed to count down.
settlement and announcement are tracked separately. if havoc saved the draw and stopped before posting the result, startup reclaims that unfinished announcement instead of drawing a second set of winners. transient delivery failures are retried; a deleted channel or one havoc cannot write to cannot receive the result.
persistence cannot overcome Discord permissions. havoc needs to be able to see the giveaway channel, update the original post, and send the outcome. removing that access can leave members with an old-looking post even though the stored giveaway has settled.
