diff options
Diffstat (limited to 'pkg/discord/discord.go')
| -rw-r--r-- | pkg/discord/discord.go | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/pkg/discord/discord.go b/pkg/discord/discord.go index 1fefe6c..c5e7d67 100644 --- a/pkg/discord/discord.go +++ b/pkg/discord/discord.go @@ -60,6 +60,8 @@ func (d *Discord) Connect(ctx context.Context) error { return err } + go d.listen(ctx) + return nil } @@ -141,11 +143,38 @@ func (d *Discord) startHeartbeat(ctx context.Context, interval uint64) { } } +func (d *Discord) listen(ctx context.Context) { + for { + var msg GatewayPayload[any] + if err := d.Conn.ReadJSON(&msg); err != nil { + log.Fatalf("error reading message: %s\n", err) + } + + select { + case <-ctx.Done(): + return + default: + fmt.Printf("received message: %+v\n", msg) + + if msg.EventName == "MESSAGE_CREATE" { + event := msg.Data.(map[string]interface{}) + if event["content"] == "ping" { + fmt.Println("got ping, sending pong...") + if err := d.sendMessage(Snowflake(event["channel_id"].(string)), "pong"); err != nil { + log.Fatalf("error sending message: %s\n", err) + } + } + } + } + } +} + func (d *Discord) identify() error { msg := GatewayPayload[GatewayIdentifyMsg]{ Op: GATEWAY_OP_IDENTIFY, Data: GatewayIdentifyMsg{ - Token: d.Token, + Token: d.Token, + Intents: 13991, Properties: GatewayIdentifyProperties{ OS: "linux", Browser: "jinx", @@ -176,3 +205,40 @@ func (d *Discord) identify() error { return nil } + +func (d *Discord) sendMessage(channelID Snowflake, content string) error { + url := DISCORD_URl + "channels/" + string(channelID) + "/messages" + + msg := struct { + Content string `json:"content"` + }{ + Content: content, + } + + raw, err := json.Marshal(msg) + if err != nil { + return err + } + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(raw)) + if err != nil { + return err + } + + req.Header.Set("Authorization", "Bot "+d.Token) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("User-Agent", USER_AGENT) + + res, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + + switch res.StatusCode { + case 200: + default: + return errors.New("unexpected status code after sending message: " + res.Status) + } + + return nil +} |
