diff --git a/README.md b/README.md index 14cea14..e18cd20 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ _✨ 搭建专属于你的消息推送服务,支持多种消息推送方式, + Bark App, + WebSocket 客户端([官方客户端](https://github.com/songquanpeng/personal-assistant),[接入文档](./docs/API.md#websocket-客户端)), + Telegram 机器人, - + Discord 群机器人(WIP), + + Discord 群机器人, 2. 多种用户登录注册方式: + 邮箱登录注册以及通过邮箱进行密码重置。 + [GitHub 开放授权](https://github.com/settings/applications/new)。 diff --git a/channel/discord.go b/channel/discord.go new file mode 100644 index 0000000..6aecafa --- /dev/null +++ b/channel/discord.go @@ -0,0 +1,54 @@ +package channel + +import ( + "bytes" + "encoding/json" + "errors" + "message-pusher/model" + "net/http" +) + +type discordMessageRequest struct { + Content string `json:"content"` +} + +type discordMessageResponse struct { + Code int `json:"code"` + Message string `json:"message"` +} + +func SendDiscordMessage(message *model.Message, user *model.User) error { + if user.DiscordWebhookURL == "" { + return errors.New("未配置 Discord 群机器人消息推送方式") + } + if message.Content == "" { + message.Content = message.Description + } + messageRequest := discordMessageRequest{ + Content: message.Content, + } + + jsonData, err := json.Marshal(messageRequest) + if err != nil { + return err + } + resp, err := http.Post(user.DiscordWebhookURL, "application/json", bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + if resp.StatusCode == http.StatusNoContent { + return nil + } + var res discordMessageResponse + err = json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + return err + } + if res.Code != 0 { + return errors.New(res.Message) + } + if resp.StatusCode == http.StatusBadRequest { + return errors.New(resp.Status) + } + return nil +} diff --git a/channel/main.go b/channel/main.go index bab9673..c5f3327 100644 --- a/channel/main.go +++ b/channel/main.go @@ -13,6 +13,7 @@ const ( TypeLark = "lark" TypeDing = "ding" TypeTelegram = "telegram" + TypeDiscord = "discord" TypeBark = "bark" TypeClient = "client" TypeNone = "none" @@ -38,6 +39,8 @@ func SendMessage(message *model.Message, user *model.User) error { return SendClientMessage(message, user) case TypeTelegram: return SendTelegramMessage(message, user) + case TypeDiscord: + return SendDiscordMessage(message, user) case TypeNone: return nil default: diff --git a/controller/user.go b/controller/user.go index 59f120b..fb00c7c 100644 --- a/controller/user.go +++ b/controller/user.go @@ -425,6 +425,7 @@ func UpdateSelf(c *gin.Context) { ClientSecret: user.ClientSecret, TelegramBotToken: user.TelegramBotToken, TelegramChatId: user.TelegramChatId, + DiscordWebhookURL: user.DiscordWebhookURL, } channel.TokenStoreUpdateUser(&cleanUser, originUser) diff --git a/model/user.go b/model/user.go index 238777e..43ef96b 100644 --- a/model/user.go +++ b/model/user.go @@ -41,6 +41,7 @@ type User struct { ClientSecret string `json:"client_secret"` TelegramBotToken string `json:"telegram_bot_token"` TelegramChatId string `json:"telegram_chat_id"` + DiscordWebhookURL string `json:"discord_webhook_url"` } func GetMaxUserId() int { @@ -77,7 +78,7 @@ func GetUserById(id int, selectAll bool) (*User, error) { "channel", "token", "wechat_test_account_id", "wechat_test_account_template_id", "wechat_test_account_open_id", "wechat_corp_account_id", "wechat_corp_account_agent_id", "wechat_corp_account_user_id", "wechat_corp_account_client_type", - "corp_webhook_url", "lark_webhook_url", "ding_webhook_url", "bark_server", "telegram_chat_id", + "corp_webhook_url", "lark_webhook_url", "ding_webhook_url", "bark_server", "telegram_chat_id", "discord_webhook_url", }).First(&user, "id = ?", id).Error } return &user, err diff --git a/web/src/components/PushSetting.js b/web/src/components/PushSetting.js index 555b225..3b6477b 100644 --- a/web/src/components/PushSetting.js +++ b/web/src/components/PushSetting.js @@ -35,6 +35,7 @@ const PushSetting = () => { client_secret: '', telegram_bot_token: '', telegram_chat_id: '', + discord_webhook_url: '', }); let [loading, setLoading] = useState(false); @@ -117,6 +118,9 @@ const PushSetting = () => { data.telegram_bot_token = inputs.telegram_bot_token; data.telegram_chat_id = inputs.telegram_chat_id; break; + case 'discord': + data.discord_webhook_url = inputs.discord_webhook_url; + break; default: showError(`无效的参数:${which}`); return; @@ -188,6 +192,7 @@ const PushSetting = () => { { key: 'bark', text: 'Bark App', value: 'bark' }, { key: 'client', text: 'WebSocket 客户端', value: 'client' }, { key: 'telegram', text: 'Telegram 机器人', value: 'telegram' }, + { key: 'discord', text: 'Discord 群机器人', value: 'discord' }, ]} value={inputs.channel} onChange={handleInputChange} @@ -551,6 +556,28 @@ const PushSetting = () => { 保存 + +
+ Discord 群机器人设置(discord) + + 通过 Discord 群机器人进行推送,配置流程:选择一个 channel -> 设置 + -> 整合 -> 创建 Webhook -> 点击复制 Webhook URL + +
+ + + + +