discord.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package channel
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "message-pusher/model"
  7. "net/http"
  8. "strings"
  9. )
  10. type discordMessageRequest struct {
  11. Content string `json:"content"`
  12. }
  13. type discordMessageResponse struct {
  14. Code int `json:"code"`
  15. Message string `json:"message"`
  16. }
  17. func SendDiscordMessage(message *model.Message, user *model.User, channel_ *model.Channel) error {
  18. if message.Content == "" {
  19. message.Content = message.Description
  20. }
  21. messageRequest := discordMessageRequest{
  22. Content: message.Content,
  23. }
  24. // https://discord.com/developers/docs/reference#message-formatting
  25. if message.To != "" {
  26. messageRequest.Content = ""
  27. ids := strings.Split(message.To, "|")
  28. for _, id := range ids {
  29. messageRequest.Content = "<@" + id + "> " + messageRequest.Content
  30. }
  31. messageRequest.Content = messageRequest.Content + message.Content
  32. }
  33. jsonData, err := json.Marshal(messageRequest)
  34. if err != nil {
  35. return err
  36. }
  37. resp, err := http.Post(channel_.URL, "application/json", bytes.NewBuffer(jsonData))
  38. if err != nil {
  39. return err
  40. }
  41. if resp.StatusCode == http.StatusNoContent {
  42. return nil
  43. }
  44. var res discordMessageResponse
  45. err = json.NewDecoder(resp.Body).Decode(&res)
  46. if err != nil {
  47. return err
  48. }
  49. if res.Code != 0 {
  50. return errors.New(res.Message)
  51. }
  52. if resp.StatusCode == http.StatusBadRequest {
  53. return errors.New(resp.Status)
  54. }
  55. return nil
  56. }