qcloud_im_callback

package module
v0.0.0-...-69be045 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2017 License: BSD-2-Clause Imports: 7 Imported by: 0

README

qcloud_im_callback Build Status Coverage Status

腾讯IM回调处理服务

处理流程

Alt text

快速开始

package main

import (
	"fmt"
	"github.com/Bping/qcloud-im-callback"
)

func main(){
	CallbackBeforeSendMsgHandle:=func(event *qcloud_im_callback.CallbackEvent)interface{}{
		var sendMsgBody qcloud_im_callback.SendMsgBody
		event.ToJSON(&sendMsgBody)
		fmt.Println("CallbackBeforeSendMsgHandle",sendMsgBody.MsgBody)
		return &qcloud_im_callback.BaseResponse{ActionStatus:qcloud_im_callback.OkStatus,ErrorCode:0}
	}

	// 注册
	qcloud_im_callback.RegisterRouterInfo(qcloud_im_callback.CallbackBeforeSendMsgCommand,qcloud_im_callback.RouterInfo{
		Async:false,
		Handle:qcloud_im_callback.CallbackHandle(CallbackBeforeSendMsgHandle),

	})

	// http请求中url后面参数,
	// 实际应用中自行获取参数构成此结构体
	up:=&qcloud_im_callback.URLParams{
		CallbackCommand:qcloud_im_callback.CallbackBeforeSendMsgCommand,
		SdkAppid:"888888",
		ContentType:"json",
	}

	// http请求中的body内容
	// json格式
	str:=`{"CallbackCommand": "C2C.CallbackBeforeSendMsg", "From_Account": "jared", "To_Account": "Jonh", "MsgBody": [ {"MsgType": "TIMTextElem","MsgContent": {"Text": "red packet"}}]}`

	resp:=qcloud_im_callback.HandleEvents(qcloud_im_callback.CreateEvents(up.CallbackCommand,up,[]byte(str)))

	// 自行处理返回内容
	fmt.Println(*resp.(*qcloud_im_callback.BaseResponse))
}
	

详细

Note: 使用前,记得初始化类库和注册各种事件处理程序

  • 更改默认CallbackHandler
    // @masterNum 主消费线程数目,必须大于等于1
    // @chanLen   消费信息(事件)队列长度
    qcloud_im_callback.RegisterDefaultCallbackHandler(masterNum,msgEventLen int,defaultHandle func(*CallbackEvent) interface{})
  • 注册事件处理路由信息(处理程序)。具体事件类型查看文件type.go
   CallbackBeforeSendMsgHandle:=func(event *qcloud_im_callback.CallbackEvent)interface{}{
   		var sendMsgBody qcloud_im_callback.SendMsgBody
   		event.ToJSON(&sendMsgBody)
   		fmt.Println("CallbackBeforeSendMsgHandle",sendMsgBody.MsgBody)
   		return &qcloud_im_callback.BaseResponse{ActionStatus:qcloud_im_callback.OkStatus,ErrorCode:0}
   	}
   
   	// 注册
   	qcloud_im_callback.RegisterRouterInfo(qcloud_im_callback.CallbackBeforeSendMsgCommand,qcloud_im_callback.RouterInfo{
   		Async:false,
   		Handle:qcloud_im_callback.CallbackHandle(CallbackBeforeSendMsgHandle),
   
   	})
http

已提供了标准http调用处理函数了,可以直接调用,如下:

    http.HandleFunc("/im/callback",qcloud_im_callback.HandleEventsHttp)
beego

因为不想耦合beego,所以就不提供beego定制化接口了。可以参考下面例子:

    func (u *Controller) HandleEventsBeego() {
    	up:=&qcloud_im_callback.URLParams{
    		SdkAppid:u.GetString("SdkAppid"),
    		CallbackCommand:qcloud_im_callback.CallbackCommand(u.GetString("CallbackCommand")),
    		ContentType:u.GetString("contenttype"),
    		ClientIP:u.GetString("ClientIP"),
    		OptPlatform:qcloud_im_callback.OptPlatform(u.GetString("OptPlatform")),
    	}
    	resp:=qcloud_im_callback.HandleEvents(qcloud_im_callback.CreateEvents(up.CallbackCommand,up,u.Ctx.Input.RequestBody))
    	u.Data["json"] = resp
    	u.ServeJSON()
    }
cache队列(如:reids)

如果你想用redis第三方缓存工具来传递信息,你可以通过以下方法初始化。如果没有指定cache队列类型,则统一默认为channel缓冲队列类型

  • 更改默认
    qcloud_im_callback.RegisterDefaultNewCallbackHandlerWithCache(masterNum, msgEventLen int, defaultHandle func(*CallbackEvent) interface{},cache qcloud_im_callback.ICache) (err error)   
  • 新建
    qcloud_im_callback.NewCallbackHandlerWithCache(masterNum, msgEventLen int, defaultHandle CallbackHandle,cache qcloud_im_callback.ICache) (*qcloud_im_callback.CallbackHandler, error)  

请注意,必须实现qcloud_im_callback.ICache接口,具体如下:

    // 缓存Cache接口
   	type ICache interface {
   		// BLPOP key1 timeout(秒)
   		// 移出并获取列表的第一个元素,
   		// 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
   		BLPop(key string,timeout int64)(map[string]string, error)
   		// 在列表尾部中添加一个或多个值
   		RPush(key string,values ... interface{}) (int64, error)
   		// 获取列表长度
   		LLen(key string) (int64, error)
   	}

文档

https://godoc.org/github.com/BPing/qcloud-im-callback GoDoc

依赖包

github.com/BPing/go-toolkit/producer_consumer

Documentation

Index

Constants

View Source
const (
	//-- 单发消息 --
	CallbackBeforeSendMsgCommand = CallbackCommand("C2C.CallbackBeforeSendMsg") // 发消息之前回调
	CallbackAfterSendMsgCommand  = CallbackCommand("C2C.CallbackAfterSendMsg")  // 发消息之后回调

	//-- 群组系统 --
	CallbackBeforeCreateGroupCommand     = CallbackCommand("Group.CallbackBeforeCreateGroup")     // 创建群组之前回调
	CallbackAfterCreateGroupCommand      = CallbackCommand("Group.CallbackAfterCreateGroup")      // 创建群组之后回调
	CallbackBeforeApplyJoinGroupCommand  = CallbackCommand("Group.CallbackBeforeApplyJoinGroup")  // 申请入群之前回调
	CallbackBeforeInviteJoinGroupCommand = CallbackCommand("Group.CallbackBeforeInviteJoinGroup") // 拉人入群之后回调
	CallbackAfterNewMemberJoinCommand    = CallbackCommand("Group.CallbackAfterNewMemberJoin")    // 新成员入群之后回调
	CallbackAfterMemberExitCommand       = CallbackCommand("Group.CallbackAfterMemberExit")       // 群成员离开之后回调
	GroupCallbackBeforeSendMsgCommand    = CallbackCommand("Group.CallbackBeforeSendMsg")         // 群内发言之前回调
	GroupCallbackAfterSendMsgCommand     = CallbackCommand("Group.CallbackAfterSendMsg")          // 群内发言之后回调
	CallbackAfterGroupFullCommand        = CallbackCommand("Group.CallbackAfterGroupFull")        // 群组满员之后回调
	CallbackAfterGroupDestroyedCommand   = CallbackCommand("Group.CallbackAfterGroupDestroyed")   // 群组解散之后回调
	CallbackAfterGroupInfoChangedCommand = CallbackCommand("Group.CallbackAfterGroupInfoChanged") // 群组资料修改之后回调

	//-- 关系链系统 --
	CallbackFriendAddCommand       = CallbackCommand("Sns.CallbackFriendAdd")       // 添加好友之后回调
	CallbackFriendDeleteCommand    = CallbackCommand("Sns.CallbackFriendDelete")    // 删除好友之后回调
	CallbackBlackListAddCommand    = CallbackCommand("Sns.CallbackBlackListAdd")    // 添加黑名单之后回调
	CallbackBlackListDeleteCommand = CallbackCommand("Sns.CallbackBlackListDelete") // 删除黑名单之后回调

	//-- 在线状态 --
	StateChangeCommand = CallbackCommand("State.StateChange") // 状态变更回调

	// 客户端平台
	RestAPIPlatform = OptPlatform("RESTAPI")
	WebPlatform     = OptPlatform("Web")
	AndroidPlatform = OptPlatform("Android")
	IOSPlatform     = OptPlatform("iOS")
	WindowsPlatform = OptPlatform("Windows")
	MacPlatform     = OptPlatform("Mac")
	UnkownPlatform  = OptPlatform("Unkown")

	// 请求处理结果
	OkStatus   = ActionStatus("OK")
	FAILStatus = ActionStatus("FAIL")

	// 群组系统当前提供四种默认群组形态
	PrivateGroupType    = GroupType("Private")
	PublicGroupType     = GroupType("Public")
	ChatRoomGroupType   = GroupType("ChatRoom")
	AVChatRoomGroupType = GroupType("AVChatRoom")
)

Variables

View Source
var (
	BodyMaxLen int64 = 2048 //请求body实体内容限制长度值
)
View Source
var (
	Version = "0.1"
)

Functions

func ConsumerNumGoroutine

func ConsumerNumGoroutine() (int64, int64)

func Handle

func Handle(cc CallbackCommand, up *URLParams, body []byte) interface{}

func HandleEvents

func HandleEvents(event *CallbackEvent) interface{}

func HandleEventsHttp

func HandleEventsHttp(w http.ResponseWriter, r *http.Request)

原始http请求处理

对于body内容目前做长度限制,具体查看变量BodyMaxLen

func RegisterBeforeHook

func RegisterBeforeHook(defaultHandle func(*CallbackEvent) interface{})

func RegisterDefaultCallbackHandler

func RegisterDefaultCallbackHandler(masterNum, msgEventLen int, defaultHandle func(*CallbackEvent) interface{}) (err error)

func RegisterDefaultHandle

func RegisterDefaultHandle(defaultHandle func(*CallbackEvent) interface{})

func RegisterDefaultNewCallbackHandlerWithCache

func RegisterDefaultNewCallbackHandlerWithCache(masterNum, msgEventLen int, defaultHandle func(*CallbackEvent) interface{}, cache ICache) (err error)

func RegisterRouterInfo

func RegisterRouterInfo(cc CallbackCommand, ri RouterInfo)

Types

type ActionStatus

type ActionStatus string

请求处理的结果,OK表示处理成功,FAIL表示失败。

type BaseBody

type BaseBody struct {
	CallbackCommand CallbackCommand
}

基本请求body内容字段

type BaseResponse

type BaseResponse struct {
	// 请求处理的结果,
	// OK表示处理成功,FAIL表示失败。
	ActionStatus ActionStatus

	// 错误码
	ErrorCode int

	//错误信息。
	ErrorInfo string
}

基本应答包字段

type CallbackCommand

type CallbackCommand string

回调命令 @link https://www.qcloud.com/doc/product/269/1523

type CallbackEvent

type CallbackEvent struct {
	// 事件标识命令
	CallbackCommand CallbackCommand `json:"CallbackCommand"`

	// 参数
	URLParams *URLParams `json:"URLParams"`

	// 实体内容
	Body []byte `json:"Body"`

	// 句柄
	Handler *CallbackHandler
}

事件实体

func CreateEvents

func CreateEvents(cc CallbackCommand, up *URLParams, body []byte) *CallbackEvent

func NewCallbackEvent

func NewCallbackEvent(cc CallbackCommand, up *URLParams, body []byte) *CallbackEvent

新建

func (*CallbackEvent) Handle

func (ce *CallbackEvent) Handle() interface{}

@see CallbackHandler.Handle()

func (*CallbackEvent) Id

func (ce *CallbackEvent) Id() string

实现消息接口

func (*CallbackEvent) ToJSON

func (ce *CallbackEvent) ToJSON(v interface{}) error

将body字节内容以JSON格式转化

type CallbackHandle

type CallbackHandle func(*CallbackEvent) interface{}

具体事件处理程序

type CallbackHandler

type CallbackHandler struct {
	// contains filtered or unexported fields
}

回调事件处理句柄

为某个的事件注册相应的事件处理程序

func NewCallbackHandler

func NewCallbackHandler(masterNum, msgEventLen int, defaultHandle CallbackHandle) (*CallbackHandler, error)

新建回调事件处理句柄(底层消费队列为channel缓冲队列)

func NewCallbackHandlerWithCache

func NewCallbackHandlerWithCache(masterNum, msgEventLen int, defaultHandle CallbackHandle, cache ICache) (*CallbackHandler, error)

新建回调事件处理句柄(底层消费队列为自定义Cache队列) @cache ICache

// 缓存Cache接口
type ICache interface {
		// BLPOP key1 timeout(秒)
		// 移出并获取列表的第一个元素,
		// 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
		BLPop(key string,timeout int64)(map[string]string, error)
		// 在列表尾部中添加一个或多个值
		RPush(key string,values ... interface{}) (int64, error)
		// 获取列表长度
		LLen(key string) (int64, error)
	}

func (*CallbackHandler) ConsumerNumGoroutine

func (ch *CallbackHandler) ConsumerNumGoroutine() (master, assistActive int64)

事件队列处理协程数目情况

func (*CallbackHandler) Exist

func (ch *CallbackHandler) Exist(cc CallbackCommand) bool

是否已注册

func (*CallbackHandler) Get

获取事件处理路由信息

func (*CallbackHandler) Handle

func (ch *CallbackHandler) Handle(ce *CallbackEvent) interface{}

处理事件

func (*CallbackHandler) InitProducerConsumer

func (ch *CallbackHandler) InitProducerConsumer(masterNum, msgEventLen int, pcType string, cache producerConsumer.ICache) error

@masterNum 主消费线程数目,必须大于等于1 @chanLen 消费信息(事件)队列长度

func (*CallbackHandler) NewCallbackEvent

func (ch *CallbackHandler) NewCallbackEvent(cc CallbackCommand, up *URLParams, body []byte) *CallbackEvent

新建事件

func (*CallbackHandler) Register

注册

如果重复注册,新的将覆盖旧的

func (*CallbackHandler) RegisterBeforeHook

func (ch *CallbackHandler) RegisterBeforeHook(beforeHook CallbackHandle) *CallbackHandler

注册钩子

func (*CallbackHandler) RegisterDefaultHandle

func (ch *CallbackHandler) RegisterDefaultHandle(callbackHandle CallbackHandle) *CallbackHandler

注册默认处理程序

func (*CallbackHandler) UnRegister

func (ch *CallbackHandler) UnRegister(cc CallbackCommand) *CallbackHandler

注销事件处理路由信息

type GroupInfo

type GroupInfo struct {
	GroupId string
	Type    GroupType
}

群基础资料

type GroupSendMsgBody

type GroupSendMsgBody struct {
	SendMsgBody
	GroupInfo
	Operator_Account string //请求的发起者
	Random           string // 随机数
}

群聊消息

type GroupType

type GroupType string

私有群(Private):适用于较为私密的聊天场景,群组资料不公开,只能通过邀请的方式加入,类似于微信群。 公开群(Public):适用于公开群组,具有较为严格的管理机制、准入机制,类似于QQ群。 聊天室(ChatRoom):群成员可以随意进出,组织较为松散。 互动直播聊天室(AVChatRoom):适用于互动直播场景,管理上与聊天室相似,但群成员人数无上限;支持以游客身份(不登录)接收消息。

type ICache

type ICache interface {
	producerConsumer.ICache
}

缓存Cache接口

封装producerConsumer.ICache

type OptPlatform

type OptPlatform string

客户端平台

type RouterInfo

type RouterInfo struct {
	// 异步或者同步
	Async bool

	// 如果是异步处理,
	// 默认的返回的数据。
	// 一般为BaseResponse结构体即可
	AsyncResponse interface{}

	// 处理句柄
	//   事件具体处理的程序。
	//   如果同步处理,返回的数据将返回到客户端去,如果异步的话,将会忽略
	Handle CallbackHandle
}

事件处理信息和程序

type SendMsgBody

type SendMsgBody struct {
	BaseBody
	From_Account string
	To_Account   string
	MsgBody      []struct {
		MsgType    string
		MsgContent map[string]interface{}
	}
}

发单聊消息

type URLParams

type URLParams struct {

	// APP在云通讯申请的Appid。
	SdkAppid string `json:"SdkAppid"`

	// 回调命令字。
	CallbackCommand CallbackCommand `json:"CallbackCommand"`

	//固定为:json。对应:contenttype
	ContentType string `json:"ContentType"`

	// 客户端IP地址
	ClientIP string `json:"ClientIP"`

	// 客户端平台。对应不同的平台类型,
	// 可能的取值有: RESTAPI(使用REST API发送请求)、
	//              Web(使用Web SDK发送请求)、
	//              Android、
	//              iOS、
	//              Windows、
	//              Mac、
	//              Unkown(使用未知类型的设备发送请求)。
	OptPlatform OptPlatform `json:"OptPlatform"`
}

腾讯云在发起回调时,会在APP提供的URL之后增加如下几个参数: @link https://www.qcloud.com/doc/product/269/1522 回调协议

func (*URLParams) Clone

func (up *URLParams) Clone() *URLParams

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL