|
@@ -0,0 +1,85 @@
|
|
|
+package channel
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "message-pusher/model"
|
|
|
+ "net/http"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+type oneBotMessageRequest struct {
|
|
|
+ MessageType string `json:"message_type"`
|
|
|
+ UserId int64 `json:"user_id"`
|
|
|
+ GroupId int64 `json:"group_id"`
|
|
|
+ Message string `json:"message"`
|
|
|
+ AutoEscape bool `json:"auto_escape"`
|
|
|
+}
|
|
|
+
|
|
|
+type oneBotMessageResponse struct {
|
|
|
+ Message string `json:"message"`
|
|
|
+ Status string `json:"status"`
|
|
|
+ RetCode int `json:"retcode"`
|
|
|
+}
|
|
|
+
|
|
|
+func SendOneBotMessage(message *model.Message, user *model.User, channel_ *model.Channel) error {
|
|
|
+ url := fmt.Sprintf("%s/send_msg", channel_.URL)
|
|
|
+ req := oneBotMessageRequest{
|
|
|
+ Message: message.Content,
|
|
|
+ }
|
|
|
+ if message.Content == "" {
|
|
|
+ req.Message = message.Description
|
|
|
+ }
|
|
|
+ target := channel_.AccountId
|
|
|
+ if message.To != "" {
|
|
|
+ target = message.To
|
|
|
+ }
|
|
|
+ parts := strings.Split(target, "_")
|
|
|
+ var idStr string
|
|
|
+ var type_ string
|
|
|
+ if len(parts) == 1 {
|
|
|
+ type_ = "user"
|
|
|
+ idStr = parts[0]
|
|
|
+ } else if len(parts) == 2 {
|
|
|
+ type_ = parts[0]
|
|
|
+ idStr = parts[1]
|
|
|
+ } else {
|
|
|
+ return errors.New("无效的 OneBot 配置")
|
|
|
+ }
|
|
|
+ id, _ := strconv.ParseInt(idStr, 10, 64)
|
|
|
+ if type_ == "user" {
|
|
|
+ req.UserId = id
|
|
|
+ req.MessageType = "private"
|
|
|
+ } else if type_ == "group" {
|
|
|
+ req.GroupId = id
|
|
|
+ req.MessageType = "group"
|
|
|
+ } else {
|
|
|
+ return errors.New("无效的 OneBot 配置")
|
|
|
+ }
|
|
|
+ reqBody, err := json.Marshal(req)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ request, _ := http.NewRequest("POST", url, bytes.NewReader(reqBody))
|
|
|
+ request.Header.Set("Authorization", "Bearer "+channel_.Secret)
|
|
|
+ request.Header.Set("Content-Type", "application/json")
|
|
|
+ resp, err := http.DefaultClient.Do(request)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if resp.StatusCode != 200 {
|
|
|
+ return errors.New(resp.Status)
|
|
|
+ }
|
|
|
+ var res oneBotMessageResponse
|
|
|
+ err = json.NewDecoder(resp.Body).Decode(&res)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if res.RetCode != 0 {
|
|
|
+ return errors.New(res.Message)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|