You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
4.9 KiB

// 腾讯云im即时通信
package tencent
import (
"encoding/json"
"errors"
"fmt"
"github.com/tencentyun/tls-sig-api-v2-golang/tencentyun"
"live/app/lib/client"
"live/app/lib/config"
"net/url"
"strconv"
)
const (
baseurl = "https://console.tim.qq.com/"
ErrCodeSuc = 0
ErrSignTimeOut = 70001
action_useradd = "v4/im_open_login_svc/account_import" // 会员添加
action_userprofile = "v4/profile/portrait_set" // 会员资料信息修改
action_groupadd = "v4/group_open_http_svc/create_group" // 群组添加
action_groupdel = "v4/group_open_http_svc/destroy_group" // 群组解散
action_groupmessage = "v4/group_open_http_svc/send_group_system_notification" // 群组系统消息
)
type im struct {
sdkAppId int
identifier string
expire int
userBuf string
key string
sign string
}
var Im *im
func init() {
Im = &im{
sdkAppId: config.Config.Section("tencent").Key("sdkAppId").MustInt(),
identifier: config.Config.Section("tencent").Key("identifier").String(),
expire: config.Config.Section("tencent").Key("expire").MustInt(),
userBuf: config.Config.Section("tencent").Key("userBuf").String(),
key: config.Config.Section("tencent").Key("key").String(),
}
// 获取管理员签名串
Im.sign = Im.GetSign(Im.identifier)
}
// @Title 获取im签名串
// @Param userId string true "im会员id"
func (i *im) GetSign(userId string) string {
sign, _ := tencentyun.GenSig(i.sdkAppId, i.key, userId, i.expire)
return sign
}
// @Title 添加会员到腾讯im
// @Param userId string true "im会员id"
// @Param nickName string true "会员昵称"
// @Param faceUrl string true "头像链接地址"
func (i *im) AddUser(userId, nickName, faceUrl string) error {
jsonData, err := json.Marshal(map[string]string{
"Identifier": userId,
"Nick": nickName,
"FaceUrl": faceUrl,
})
if err != nil {
return err
}
return i.Exec(action_useradd, string(jsonData))
}
type ProfileItem struct {
Tag string // 修改的字段名
Value string // 修改的字段值
}
// @Title 设置im会员资料
// @Param userId string true "im会员id"
// @Param profileItems []ProfileItem] true "需要修改的信息"
func (i *im) UserProfile(userId string, profileItems []ProfileItem) error {
if len(profileItems) == 0 {
return errors.New("修改的会员信息不能为空")
}
jsonData, err := json.Marshal(map[string]interface{}{
"From_Account": userId,
"ProfileItem": profileItems,
})
if err != nil {
return err
}
return i.Exec(action_userprofile, string(jsonData))
}
// @Title 创建直播群
// @Param userId string true "im会员id"
// @Param name string true "直播群名称"
// @Param groupId string true "直播群id"
func (i *im) AddLiveGroup(userId, name, groupId string) error {
jsonData, err := json.Marshal(map[string]string{
"Owner_Account": userId,
"Type": "AVChatRoom",
"Name": name,
"GroupId": groupId,
})
if err != nil {
return err
}
return i.Exec(action_groupadd, string(jsonData))
}
// @Title 解散直播群
// @Param userId string true "im会员id"
// @Param name string true "直播群名称"
// @Param groupId string true "直播群id"
func (i *im) DelLiveGroup(groupId string) error {
jsonData, err := json.Marshal(map[string]string{
"GroupId": groupId,
})
if err != nil {
return err
}
return i.Exec(action_groupdel, string(jsonData))
}
// @Title 直播群发送消息
// @Param groupId string true "直播群id"
// @Param message string true "消息内容"
func (i *im) SendLiveGroupMessage(groupId, message string) error {
jsonData, err := json.Marshal(map[string]interface{}{
"GroupId": groupId,
"Content": message,
})
if err != nil {
return err
}
return i.Exec(action_groupmessage, string(jsonData))
}
// @Title 获取公共参数
func (i *im) getPublicParam() string {
sign, err := tencentyun.GenSig(i.sdkAppId, i.key, i.identifier, i.expire)
if err != nil {
return ""
}
return url.Values{
"sdkappid": []string{strconv.Itoa(i.sdkAppId)},
"identifier": []string{i.identifier},
"usersig": []string{sign},
"contenttype": []string{"json"},
}.Encode()
}
type imResult struct {
ActionStatus string
ErrorCode int
ErrorInfo string
}
// @Title 执行请求
// @Param action string true "请求方法"
// @Param data string true "请求数据"
func (i *im) Exec(action string, data string) error {
getUrl := fmt.Sprintf("%v%v?%v", baseurl, action, i.getPublicParam())
result, err := client.Request(client.Post, getUrl, data)
if err != nil {
return err
}
res := imResult{}
err = json.Unmarshal(result, &res)
if err != nil {
return err
}
// 签名过期,重新签名
if res.ErrorCode == ErrSignTimeOut {
i.sign = i.GetSign(i.identifier)
return i.Exec(action, data)
}
// 调用失败
if res.ErrorCode != ErrCodeSuc {
return errors.New(res.ErrorInfo)
}
// 调用成功
return nil
}