discord.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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) error {
  18. if user.DiscordWebhookURL == "" {
  19. return errors.New("未配置 Discord 群机器人消息推送方式")
  20. }
  21. if message.Content == "" {
  22. message.Content = message.Description
  23. }
  24. messageRequest := discordMessageRequest{
  25. Content: message.Content,
  26. }
  27. // https://discord.com/developers/docs/reference#message-formatting
  28. if message.To != "" {
  29. messageRequest.Content = ""
  30. ids := strings.Split(message.To, "|")
  31. for _, id := range ids {
  32. messageRequest.Content = "<@" + id + "> " + messageRequest.Content
  33. }
  34. messageRequest.Content = messageRequest.Content + message.Content
  35. }
  36. jsonData, err := json.Marshal(messageRequest)
  37. if err != nil {
  38. return err
  39. }
  40. resp, err := http.Post(user.DiscordWebhookURL, "application/json", bytes.NewBuffer(jsonData))
  41. if err != nil {
  42. return err
  43. }
  44. if resp.StatusCode == http.StatusNoContent {
  45. return nil
  46. }
  47. var res discordMessageResponse
  48. err = json.NewDecoder(resp.Body).Decode(&res)
  49. if err != nil {
  50. return err
  51. }
  52. if res.Code != 0 {
  53. return errors.New(res.Message)
  54. }
  55. if resp.StatusCode == http.StatusBadRequest {
  56. return errors.New(resp.Status)
  57. }
  58. return nil
  59. }