189 lines
4.8 KiB
Go
189 lines
4.8 KiB
Go
package wechat_service
|
||
|
||
import (
|
||
"context"
|
||
"sync"
|
||
"time"
|
||
|
||
"github.com/chaitin/panda-wiki/log"
|
||
"github.com/chaitin/panda-wiki/repo/pg"
|
||
)
|
||
|
||
type WechatServiceConfig struct {
|
||
Ctx context.Context
|
||
CorpID string
|
||
Token string
|
||
EncodingAESKey string
|
||
kbID string
|
||
Secret string
|
||
logger *log.Logger
|
||
containKeywords []string
|
||
equalKeywords []string
|
||
logoUrl string
|
||
// db
|
||
WeRepo *pg.WechatRepository
|
||
}
|
||
|
||
// 存储ai知识库获取的cursor值以客服为标准,方便拉取用户的消息
|
||
var KfCursors = &sync.Map{}
|
||
|
||
// 微信客服发送的消息
|
||
type WeixinUserAskMsg struct {
|
||
ToUserName string `xml:"ToUserName"`
|
||
CreateTime int64 `xml:"CreateTime"`
|
||
MsgType string `xml:"MsgType"`
|
||
Event string `xml:"Event"`
|
||
Token string `xml:"Token"`
|
||
OpenKfId string `xml:"OpenKfId"`
|
||
}
|
||
|
||
type AccessToken struct {
|
||
Errcode int `json:"errcode"`
|
||
Errmsg string `json:"errmsg"`
|
||
AccessToken string `json:"access_token"`
|
||
ExpiresIn int `json:"expires_in"`
|
||
}
|
||
|
||
type MsgRequest struct {
|
||
Cursor string `json:"cursor"`
|
||
Token string `json:"token"`
|
||
Limit int `json:"limit"`
|
||
VoiceFormat int `json:"voice_format"`
|
||
OpenKfid string `json:"open_kfid"`
|
||
}
|
||
|
||
type MsgRet struct {
|
||
Errcode int `json:"errcode"`
|
||
Errmsg string `json:"errmsg"`
|
||
NextCursor string `json:"next_cursor"` // 游标
|
||
MsgList []Msg `json:"msg_list"`
|
||
HasMore int `json:"has_more"`
|
||
}
|
||
|
||
type Msg struct {
|
||
Msgid string `json:"msgid"`
|
||
SendTime int64 `json:"send_time"`
|
||
Origin int `json:"origin"`
|
||
Msgtype string `json:"msgtype"`
|
||
Event struct {
|
||
EventType string `json:"event_type"`
|
||
Scene string `json:"scene"`
|
||
OpenKfid string `json:"open_kfid"`
|
||
ExternalUserid string `json:"external_userid"`
|
||
WelcomeCode string `json:"welcome_code"`
|
||
} `json:"event"`
|
||
Text struct {
|
||
Content string `json:"content"`
|
||
} `json:"text"`
|
||
OpenKfid string `json:"open_kfid"`
|
||
ExternalUserid string `json:"external_userid"`
|
||
}
|
||
|
||
// send msg to user with message
|
||
type ReplyMsg struct {
|
||
Touser string `json:"touser,omitempty"`
|
||
OpenKfid string `json:"open_kfid,omitempty"`
|
||
Msgid string `json:"msgid,omitempty"`
|
||
Msgtype string `json:"msgtype,omitempty"`
|
||
Text struct {
|
||
Content string `json:"content,omitempty"`
|
||
} `json:"text,omitempty"`
|
||
}
|
||
|
||
// send msg to user with url
|
||
type ReplyMsgUrl struct {
|
||
Touser string `json:"touser,omitempty"`
|
||
OpenKfid string `json:"open_kfid,omitempty"`
|
||
Msgid string `json:"msgid,omitempty"`
|
||
Msgtype string `json:"msgtype,omitempty"`
|
||
Link Link `json:"link,omitempty"`
|
||
}
|
||
|
||
type Link struct {
|
||
Title string `json:"title,omitempty"`
|
||
Desc string `json:"desc,omitempty"`
|
||
Url string `json:"url,omitempty"`
|
||
ThumbMediaID string `json:"thumb_media_id,omitempty"`
|
||
}
|
||
|
||
// Upload file response
|
||
type MediaUploadResponse struct {
|
||
ErrCode int `json:"errcode"`
|
||
ErrMsg string `json:"errmsg"`
|
||
MediaType string `json:"type"`
|
||
MediaID string `json:"media_id"`
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// 获取用户消息应该得到的响应
|
||
type WechatCustomerResponse struct {
|
||
ErrCode int `json:"errcode"`
|
||
ErrMsg string `json:"errmsg"`
|
||
CustomerList []Customer `json:"customer_list"`
|
||
InvalidExternalUserIDs []string `json:"invalid_external_userid"`
|
||
}
|
||
|
||
type Customer struct {
|
||
ExternalUserID string `json:"external_userid"`
|
||
Nickname string `json:"nickname"`
|
||
Avatar string `json:"avatar"`
|
||
Gender int `json:"gender"`
|
||
UnionID string `json:"unionid"`
|
||
}
|
||
|
||
type UerInfoRequest struct {
|
||
UserID []string `json:"external_userid_list"`
|
||
SessionContext int `json:"need_enter_session_context"`
|
||
}
|
||
|
||
// chat status
|
||
type Status struct {
|
||
ErrCode int `json:"errcode"`
|
||
ErrMsg string `json:"errmsg"`
|
||
ServiceState int `json:"service_state"`
|
||
ServiceUserId string `json:"servicer_userid"`
|
||
}
|
||
|
||
type HumanList struct {
|
||
ErrCode int `json:"errcode"`
|
||
ErrMsg string `json:"errmsg"`
|
||
ServicerList []ServicerList `json:"servicer_list"`
|
||
}
|
||
|
||
type ServicerList struct {
|
||
UserID string `json:"userid"`
|
||
Status int `json:"status"`
|
||
}
|
||
|
||
type TokenCache struct {
|
||
AccessToken string
|
||
TokenExpire time.Time
|
||
Mutex sync.Mutex
|
||
}
|
||
|
||
// Map-based token cache keyed by app credentials
|
||
var tokenCacheMap = make(map[string]*TokenCache)
|
||
var tokenCacheMapMutex = sync.Mutex{}
|
||
|
||
// Generate a key for the token cache based on app credentials
|
||
func getTokenCacheKey(kbID, secret string) string {
|
||
return kbID + ":" + secret
|
||
}
|
||
|
||
type UserImageCache struct {
|
||
ImageID string
|
||
ImagePath string
|
||
ImageExpire time.Time
|
||
Mutex sync.Mutex
|
||
}
|
||
|
||
var UImageCache = &UserImageCache{}
|
||
|
||
type DefaultImageCache struct {
|
||
ImageID string
|
||
ImageExpire time.Time
|
||
Mutex sync.Mutex
|
||
}
|
||
|
||
var DImageCache = &DefaultImageCache{}
|