Files
servicebase/pkg/client/netease/IMService.go
2025-11-19 14:24:13 +08:00

134 lines
5.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package Netease
import (
"encoding/json"
"net/url"
"time"
"gitea.ddegame.cn/open/servicebase/pkg/common/HyTools"
Netease "gitea.ddegame.cn/open/servicebase/pkg/common/netease"
"github.com/anxpp/beego"
"github.com/anxpp/beego/logs"
)
const (
// ChatRoomManagerUserId 聊天室消息管理员ID
ChatRoomManagerUserId = "34cc7185d0b60eacf38f616b8aad8c51"
SystemNoticeUserId = "x94b992dbb4e4dfca9c971200d797a02"
P2pMessagesTypeSystemNotice = "104"
TimeDefaultFormat = "Y-m-d H:i:s"
)
type ImService struct {
}
// ImMsgBodyAttach IM消息 body对象
type ImMsgBodyAttach struct {
TypeCode string `json:"TypeCode"`
BizData any `json:"BizData"`
Msg string `json:"msg,omitempty"`
}
// ChatRoomMsgAttach 聊天室自定义消息
type ChatRoomMsgAttach struct {
TypeCode string `json:"TypeCode"`
BizData any `json:"BizData"`
}
// SendCustomMsgToChatroomByChatroomManager 向聊天室发消息
func (s *ImService) SendCustomMsgToChatroomByChatroomManager(messageRoomId string, attachData ChatRoomMsgAttach) error {
msgParameter := make(map[string]string)
msgParameter["roomid"] = messageRoomId
msgParameter["msgId"] = HyTools.GetUUID()
msgParameter["fromAccid"] = ChatRoomManagerUserId
msgParameter["msgType"] = "100" //自定义消息
msgParameter["resendFlag"] = "0"
bodyBytes, _ := json.Marshal(attachData)
msgParameter["ext"] = ""
msgParameter["attach"] = string(bodyBytes)
imClient := Netease.NewImClient()
return imClient.SendChatroomMsg(msgParameter)
}
// SendCustomerMsgFromAToB 发IM点对点自定义消息 系统通知 用户关系变化
func (s *ImService) SendCustomerMsgFromAToB(fromAccid, toAccid, pushContent, payloadJson string, bodyModel ImMsgBodyAttach, optionMap map[string]string) error {
msgParameter := make(map[string]string)
msgParameter["from"] = fromAccid
msgParameter["ope"] = "0" //0=p2p 1=群消息
msgParameter["to"] = toAccid
msgParameter["type"] = "100" //0 表示文本消息, 1 表示图片, 2 表示语音, 3 表示视频, 4 表示地理位置信息, 6 表示文件, 100 自定义消息类型
bodyBytes, _ := json.Marshal(bodyModel)
msgParameter["body"] = string(bodyBytes) //最大长度5000字符为一个JSON串
msgParameter["antispam"] = "false" //对于对接了易盾反垃圾功能的应用,本消息是否需要指定经由易盾检测的内容 只对消息类型为100 自定义消息类型 的消息生效。
optionBytes, _ := json.Marshal(optionMap)
msgParameter["option"] = string(optionBytes) //发消息时特殊指定的行为选项,JSON格式可用于指定消息的漫游存云端历史发送方多端同步推送消息抄送等特殊行为
//需要推送
if optionMap["push"] == "true" {
if len(pushContent) > 0 {
msgParameter["pushcontent"] = pushContent // ios推送内容不超过150字符option选项中允许推送push=true此字段可以指定推送内容
}
if len(payloadJson) > 0 {
msgParameter["payload"] = payloadJson // ios 推送对应的payload,必须是JSON,不能超过2k字符
}
}
imClient := Netease.NewImClient()
return imClient.SendMsg(msgParameter)
}
// SendSystemNoticeToUser 给用户发系统消息
// _ = messageService.SendSystemNoticeToUser(userId, "厅补贴到账通知", msgContent, "", "")
func (s *ImService) SendSystemNoticeToUser(toAccid, msgTitle, msgText, schemeUrl, imageUrl string) {
option := GetDefaultMsgOption()
fromUserId := SystemNoticeUserId
logs.Info("SendSystemNoticeToUser from " + fromUserId + "to " + toAccid)
pushContent := ""
payloadJson := ""
bizData := make(map[string]string, 0)
bizData["Title"] = url.QueryEscape(msgTitle)
bizData["Content"] = url.QueryEscape(msgText)
bizData["Scheme"] = schemeUrl
bizData["ImageUrl"] = imageUrl
bizData["CreateTime"] = beego.Date(time.Now(), TimeDefaultFormat)
//body的业务数据
var bodyAttach ImMsgBodyAttach
bodyAttach.TypeCode = P2pMessagesTypeSystemNotice
bodyAttach.BizData = bizData
bodyAttach.Msg = msgTitle
err := s.SendCustomerMsgFromAToB(fromUserId, toAccid, pushContent, payloadJson, bodyAttach, option)
if nil != err {
logs.Error("通知发送失败!!!!")
logs.Info(err.Error())
}
}
// GetDefaultMsgOption 发送消息默认的配置
func GetDefaultMsgOption() map[string]string {
/*
1. roam: 该消息是否需要漫游默认true需要app开通漫游消息功能
2. history: 该消息是否存云端历史默认true
3. sendersync: 该消息是否需要发送方多端同步默认true
4. push: 该消息是否需要APNS推送或安卓系统通知栏推送默认true
5. route: 该消息是否需要抄送第三方默认true (需要app开通消息抄送功能);
6. badge:该消息是否需要计入到未读计数中默认true;
7. needPushNick: 推送文案是否需要带上昵称不设置该参数时默认true;
8. persistent: 是否需要存离线消息不设置该参数时默认true。
*/
result := make(map[string]string)
result["roam"] = "true"
result["history"] = "true"
result["sendersync"] = "false"
result["push"] = "true"
result["route"] = "true"
result["badge"] = "true"
result["needPushNick"] = "false"
result["persistent"] = "true"
return result
}