github.com/starshine-sys/bcr@v0.21.0/ctx_message.go (about)

     1  package bcr
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/diamondburned/arikawa/v3/discord"
     8  	"github.com/diamondburned/arikawa/v3/gateway"
     9  )
    10  
    11  // AddMessageHandler adds a message handler for the given user/channel
    12  func (ctx *Context) AddMessageHandler(
    13  	c discord.ChannelID,
    14  	user discord.UserID,
    15  	fn func(*Context, discord.Message),
    16  ) {
    17  	ctx.Router.messageMu.Lock()
    18  	defer ctx.Router.messageMu.Unlock()
    19  	ctx.Router.messages[messageKey{
    20  		channelID: c,
    21  		userID:    user,
    22  	}] = messageInfo{
    23  		ctx: ctx,
    24  		fn:  fn,
    25  	}
    26  }
    27  
    28  // WaitForMessage waits for a message that matches the given channel ID, user ID, and filter function.
    29  // If filter is nil, only checks for the channel and user matching.
    30  func (ctx *Context) WaitForMessage(ch discord.ChannelID, user discord.UserID, timeout time.Duration, filter func(*gateway.MessageCreateEvent) bool) (msg *gateway.MessageCreateEvent, timedOut bool) {
    31  	c, cancel := context.WithTimeout(context.Background(), timeout)
    32  
    33  	defer cancel()
    34  
    35  	ev := ctx.State.WaitFor(c, func(ev interface{}) bool {
    36  		v, ok := ev.(*gateway.MessageCreateEvent)
    37  		if !ok {
    38  			return false
    39  		}
    40  
    41  		if filter != nil {
    42  			if !filter(v) {
    43  				return false
    44  			}
    45  		}
    46  
    47  		return v.ChannelID == ch && v.Author.ID == user
    48  	})
    49  
    50  	if ev == nil {
    51  		return nil, true
    52  	}
    53  
    54  	return ev.(*gateway.MessageCreateEvent), false
    55  }