xim

package
v0.2.12 Latest Latest
Warning

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

Go to latest
Published: Nov 21, 2023 License: BSD-3-Clause-Clear Imports: 9 Imported by: 0

README

IM通讯依赖的模型为websocket,具体示例如下:

服务端:

package main

import (
	"log"

	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}

func main() {
	// 使用gin框架,和普通的http协议的服务器没什么不一样
	s := gin.Default()
	s.GET("/echo", echo)
	_ = s.Run("127.0.0.1:8090")
}

func echo(c *gin.Context) {
	//服务升级,对于来到的http连接进行服务升级,升级到ws
	cn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	defer cn.Close()
	if err != nil {
		panic(err)
	}
	for {
		mt, message, err := cn.ReadMessage()
		if err != nil {
			log.Println("server read:", err)
			break
		}
		log.Printf("server recv msg: %s", message)
		msg := string(message)
		if msg == "woshi client1" {
			message = []byte("client1 去服务端了一趟")

		} else if msg == "woshi client2" {
			message = []byte("client2 去服务端了一趟")
		}

		err = cn.WriteMessage(mt, message)
		if err != nil {
			log.Println(" server write err:", err)
			break
		}
	}
}

客户端:

package main

import (
	"log"
	"net/url"
	"os"
	"os/signal"
	"time"

	"github.com/gorilla/websocket"
)

func main() {

	interrupt := make(chan os.Signal, 1)
	signal.Notify(interrupt, os.Interrupt)

	u := url.URL{Scheme: "ws", Host: "127.0.0.1:8090", Path: "/echo"}
	log.Printf("client1 connecting to %s", u.String())

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("dial server:", err)
	}
	defer c.Close()

	done := make(chan struct{})

	go func() {
		defer close(done)
		for {
			_, message, err := c.ReadMessage()
			if err != nil {
				log.Println("client read err:", err)
				return
			}
			log.Printf("client recv msg: %s", message)
		}
	}()

	//ticker := time.NewTicker(time.Second)
	//defer ticker.Stop()
	for {
		select {
		// if the goroutine is done , all are out
		case <-done:
			return
		case <-time.Tick(time.Second * 5):
			err := c.WriteMessage(websocket.TextMessage, []byte("woshi client2"))
			if err != nil {
				log.Println("client write:", err)
				return
			}
		case <-interrupt:
			log.Println("client interrupt")

			// Cleanly close the connection by sending a close message and then
			// waiting (with timeout) for the server to close the connection.
			err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
			if err != nil {
				log.Println("client1 write close:", err)
				return
			}
			select {
			case <-done:
			case <-time.After(time.Second):
			}
			return
		}
	}
}

Documentation

Overview

GoIM服务相关支持组件

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CheckUserChat added in v0.1.36

func CheckUserChat(uid uint, cid uint64) error

检测用户是否在群中

func CreateDervice

func CreateDervice(der *ImUserDervice, mac map[string]string) error

创建用户的设备ID

der	设备信息,如果该信息中存在ID则表示为修改设备信息,而不再是创建设备
mac	设备MAC地址,只有在设备ID=0时,才会创建设备并连同创建设备关联MAC

func CreateJoins added in v0.2.0

func CreateJoins(c *ChatsJoin) error

创建申请关联

c	关联信息

func CreateMessage added in v0.1.36

func CreateMessage(m *Message) error

发送消息

m	要发送的消息信息

func Heartbeat added in v0.1.35

func Heartbeat(der_id uint) error

IM设备心跳记录

der_id	设备ID

func InitUserChat

func InitUserChat(uid uint) error

初始化用户通讯群 此方法会自动根据设备列表初始化群信息

uid	用户ID

func Regedit

func Regedit(c *Config)

配置注入函数,用于将配置信息注入到程序组件中

Types

type Chat

type Chat struct {
	Id     uint64 `gorm:"column:id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" json:"id" form:"id"`
	UserId uint   `gorm:"column:user_id;type:INT UNSIGNED;comment:创建人" json:"user_id" form:"user_id"` //创建人【群主ID】
	TypeId uint8  ``                                                                                  //类型 1-设备间通信 2-用户间通信 3-群聊天
	/* 136-byte string literal not displayed */
	Thumb     uint   `gorm:"column:thumb;type:INT UNSIGNED;comment:缩略图" json:"thumb" form:"thumb"`                               //缩略图
	Name      string `gorm:"column:name;type:VARCHAR(200);comment:名称" json:"name" form:"name"`                                   //名称
	Desc      string `gorm:"column:desc;type:VARCHAR(200);comment:简介/公告" json:"desc" form:"desc"`                                //简介/公告
	IsDeleted uint8  `gorm:"column:is_deleted;type:TINYINT UNSIGNED;comment:是否删除 0-正常 1-删除" json:"is_deleted" form:"is_deleted"` //是否删除 0-正常 1-删除
	IsSilence uint8  ``                                                                                                          //是否禁言 开启禁言后将只允许群主、群管理发言
	/* 155-byte string literal not displayed */
	CreatedAt string `gorm:"column:created_at;type:DATETIME;comment:创建时间" json:"created_at" form:"created_at"` // 创建时间
}

Chat聊天窗/群/组结构体

func CreateUserChat added in v0.1.36

func CreateUserChat(uid, tid uint) (*Chat, error)

创建人与人之间的聊天窗

uid	用户ID
tid	对象ID

func GetChat

func GetChat(id uint64) (*Chat, error)

获取聊天/群详情

id	聊天/群ID

func GetUserChat added in v0.1.36

func GetUserChat(uid uint, tid uint) (*Chat, error)

获取我和其他人的聊天窗详情

uid	用户ID
tid	目标用户ID

func (*Chat) TableName

func (c *Chat) TableName() string

表名称

type ChatFrom

type ChatFrom struct {
	Id         uint64 `gorm:"column:id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" json:"id" form:"id"`
	ChatId     uint64 `gorm:"column:chat_id;type:BIGINT UNSIGNED;not null;comment:群ID" json:"chat_id" form:"chat_id"`                // 所属群ID
	UserId     uint   `gorm:"column:user_id;type:INT UNSIGNED;comment:用户ID" json:"user_id" form:"user_id"`                           //用户ID
	MessageId  uint64 `gorm:"column:message_id;type:BIGINT UNSIGNED;not null;comment:已读的最大消息ID" json:"message_id" form:"message_id"` // 已读消息ID【超过该ID的消息为未读状态】
	IsRecently uint8  ``                                                                                                             //是否显示在最近聊天列表[删除时即将此值修改为0]
	/* 127-byte string literal not displayed */
	IsTop     uint8  `gorm:"column:is_top;type:TINYINT UNSIGNED;comment:是否置顶" json:"is_top" form:"is_top"`             //是否置顶[置顶后列表根据置顶群的消息聊天时间进行排序]
	CreatedAt string `gorm:"column:created_at;type:DATETIME;comment:最近聊天时间" json:"created_at" form:"created_at"`       // 最近聊天时间
	IsDeleted uint8  `gorm:"column:is_deleted;type:tinyint unsigned;comment:是否删除" form:"is_deleted" json:"is_deleted"` //是否删除
}

群和用户的关联

func (*ChatFrom) TableName

func (c *ChatFrom) TableName() string

表名称

type ChatUser

type ChatUser struct {
	Id        uint64 `gorm:"column:id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" json:"id" form:"id"`
	ChatId    uint64 `gorm:"column:chat_id;type:BIGINT UNSIGNED;not null" json:"chat_id" form:"chat_id"`  // 所属群ID
	UserId    uint   `gorm:"column:user_id;type:INT UNSIGNED;comment:用户ID" json:"user_id" form:"user_id"` //用户ID
	DerviceId uint   ``                                                                                   //所属设备ID,仅限设备间通讯使用
	/* 131-byte string literal not displayed */
	Desc              string `gorm:"column:desc;type:VARCHAR(200);comment:群备注,仅自己可见" json:"desc" form:"desc"`                             //群备注
	Nickname          string `gorm:"column:nickname;type:VARCHAR(200);comment:群昵称,我在本群的昵称" json:"nickname" form:"nickname"`               //群昵称
	Thumb             uint   `gorm:"column:thumb;type:INT UNSIGNED;comment:缩略图" json:"thumb" form:"thumb"`                                //缩略图
	IsManagement      uint8  `gorm:"column:is_management;type:TINYINT UNSIGNED;comment:是否是群管理" json:"is_management" form:"is_management"` //是否是群管理
	IsUnInterruptions uint8  ``                                                                                                           //是否开启免打扰
	/* 139-byte string literal not displayed */
	IsPack    uint8  `gorm:"column:is_pack;type:TINYINT UNSIGNED;comment:是否折叠收起" json:"is_pack" form:"is_pack"`        //是否折叠收起
	IsBook    uint8  `gorm:"column:is_book;type:TINYINT UNSIGNED;comment:是否显示在通讯录" json:"is_book" form:"is_book"`      //是否显示在通讯录
	IsSilence uint8  `gorm:"column:is_silence;type:TINYINT UNSIGNED;comment:是否禁言" json:"is_silence" form:"is_silence"` //是否禁言
	IsDeleted uint8  `gorm:"column:is_deleted;type:tinyint unsigned;comment:是否删除" form:"is_deleted" json:"is_deleted"` //是否删除
	CreatedAt string `gorm:"column:created_at;type:DATETIME;comment:创建时间" json:"created_at" form:"created_at"`         // 加入时间
}

群成员表

func GetChatUser

func GetChatUser(id uint64, offset, limit int) (int64, []ChatUser, error)

获取群成员列表

id		群ID
offset	跳过条数
limit	查询条数(-1表示查询全部)

func (*ChatUser) TableName

func (c *ChatUser) TableName() string

表名称

type ChatsJoin added in v0.2.0

type ChatsJoin struct {
	Id     uint  `gorm:"column:id;type:int unsigned;primaryKey;autoIncrement;not null" form:"id" json:"id"`
	UserId uint  `gorm:"column:user_id;type:int unsigned;comment:用户ID" form:"user_id" json:"user_id"`                     //用户ID
	JoinId uint  `gorm:"column:join_id;type:int unsigned;comment:加入对象ID" form:"join_id" json:"join_id"`                   //加入对象ID
	TypeId uint8 `gorm:"column:type_id;type:tinyint unsigned;comment:加入类型 1-好友 2-群 3-邀请进群" form:"type_id" json:"type_id"` //加入类型 1-好友 2-群 3-邀请进群
	Status uint8 ``                                                                                                       //状态 1-待审核 2-审核忽略 3-审核拒绝 4-审核同意
	/* 142-byte string literal not displayed */
	CreatedAt string `gorm:"column:created_at;type:datetime;comment:申请时间" form:"created_at" json:"created_at"` //申请时间
	AutoAt    string `gorm:"column:auto_at;type:datetime;comment:审核时间" form:"auto_at" json:"auto_at"`          //审核时间
}

申请加好友、加群

func GetJoins added in v0.2.0

func GetJoins(uid uint) ([]ChatsJoin, error)

获取我的申请关联

uid	用户ID

func (*ChatsJoin) TableName added in v0.2.0

func (c *ChatsJoin) TableName() string

返回所属表名信息

type Config

type Config struct {
	DB                  *gorm.DB              // 数据库连接
	MessageTable        string                // 用户消息记录表
	ChatTable           string                // 聊天窗表【无论和谁聊天,都需要预先创建Chat聊天窗】
	ChatUserTable       string                // 聊天窗所属成员列表
	ChatFromTable       string                // 聊天窗和用户的关联表,此表定义了每个人的聊天窗中展示的记录
	UserDerviceTable    string                // 用户设备表
	UserDerviceMacTable string                // 用户设备网卡关联表
	UsersFrindsTable    string                // 用户好友关系表
	ChatsJoinTable      string                // 用户好友申请表
	DefaultDerviceThumb uint                  // 默认设备间通讯的默认图ID
	DefaultDerviceName  string                // 默认设备间通讯的群名称
	NsqMessageSend      string                // 消息发送队列通知
	GetUserNickname     func(uid uint) string // 获取用户昵称
	GetUserAvatar       func(uid uint) uint   // 获取用户头像
}

WebSocket组件,依赖于"github.com/gorilla/websocket"服务库 此处取名为XIM意为直接支持到IM通信 支持:

  1. 同一用户的多设备通信
  2. 用户与用户之间的通信
  3. 多用户的群之间的通信

功能点:

  1. 设备间通讯
  2. 用户间通讯
  3. 群通讯
  4. 群公告
  5. 群昵称
  6. 群备注
  7. 群免打扰
  8. 群折叠
  9. 群管理
  10. 群禁言
  11. 群成员禁言(单独禁言某个人)
  12. 通讯录
  13. 最近聊天

模块定义

type ImUserDervice

type ImUserDervice struct {
	Id           uint   `gorm:"column:id;type:int unsigned;primaryKey;autoIncrement;not null" form:"id" json:"id"`
	UserId       uint   `gorm:"column:user_id;type:int unsigned;comment:用户ID" form:"user_id" json:"user_id"`                       //用户ID
	Hostname     string `gorm:"column:hostname;type:varchar(100);comment:系统主机名(用户名)" form:"hostname" json:"hostname"`              //系统主机名(用户名)
	Goos         string `gorm:"column:goos;type:varchar(100);comment:系统名称 linux、drawin等" form:"goos" json:"goos"`                  //系统名称 linux、drawin等
	Arch         string `gorm:"column:arch;type:varchar(100);comment:操作系统架构" form:"arch" json:"arch"`                              //操作系统架构
	IsDeleted    uint8  `gorm:"column:is_deleted;type:tinyint unsigned;comment:是否删除" form:"is_deleted" json:"is_deleted"`          //是否删除
	IsLogin      uint8  `gorm:"column:is_login;type:tinyint unsigned;comment:是否已登陆" form:"is_login" json:"is_login"`               //是否已登录
	LastSendTime string `gorm:"column:last_send_time;type:datetime;comment:最后发言/心跳时间" form:"last_send_time" json:"last_send_time"` //最后发言/心跳时间
	CreatedAt    string `gorm:"column:created_at;type:datetime;comment:添加时间" form:"created_at" json:"created_at"`                  //添加时间
}

用户设备表

func GetDervice

func GetDervice(uid uint, mac map[string]string) (*ImUserDervice, error)

获取用户的设备ID

uid	用户ID
mac	用户设备MAC【H5端获取不到MAC,建议使用{"h5mac":"android/ios/win/linux...:safari/firefox....:720...<屏幕宽度>"}】

func (*ImUserDervice) TableName

func (c *ImUserDervice) TableName() string

返回所属表名信息

type ImUserDerviceMac

type ImUserDerviceMac struct {
	Id        uint   `gorm:"column:id;type:int unsigned;primaryKey;autoIncrement;not null" form:"id" json:"id"`
	UserId    uint   `gorm:"column:user_id;type:int unsigned;comment:所属用户ID" form:"user_id" json:"user_id"`            //所属用户ID
	DerviceId uint   `gorm:"column:dervice_id;type:int unsigned;comment:所属设备ID" form:"dervice_id" json:"dervice_id"`   //所属设备ID
	MacName   string `gorm:"column:mac_name;type:varchar(100);comment:设备MAC地址所属名称" form:"mac_name" json:"mac_name"`    //设备MAC地址所属设备名称,如:eth0
	Mac       string `gorm:"column:mac;type:varchar(100);comment:设备MAC地址" form:"mac" json:"mac"`                       //设备MAC地址
	IsDeleted uint8  `gorm:"column:is_deleted;type:tinyint unsigned;comment:是否删除" form:"is_deleted" json:"is_deleted"` //是否删除
	CreatedAt string `gorm:"column:created_at;type:datetime;comment:添加时间" form:"created_at" json:"created_at"`         //添加时间
}

设备网卡MAC地址

func (*ImUserDerviceMac) TableName

func (c *ImUserDerviceMac) TableName() string

返回所属表名信息

type Message

type Message struct {
	Id          uint64  `gorm:"column:id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" json:"id" form:"id"`
	ChatId      uint64  `gorm:"column:chat_id;type:BIGINT UNSIGNED;not null;comment:群ID" json:"chat_id" form:"chat_id"`      // 所属群ID
	DerviceId   uint    `gorm:"column:dervice_id;type:int unsigned;comment:所属设备ID" form:"dervice_id" json:"dervice_id"`      //所属设备ID
	UserId      uint    `gorm:"column:user_id;type:INT UNSIGNED;comment:发信人ID" json:"user_id" form:"user_id"`                //发信人ID
	Type        uint8   `gorm:"column:type;type:TINYINT UNSIGNED;comment:消息类型" json:"type" form:"type"`                      //消息类型 1-普通消息 2-图片消息 3-语音消息 4-视频消息 5-地址消息
	Message     string  `gorm:"column:message;type:VARCHAR(500);comment:消息内容" json:"message" form:"message"`                 //消息内容,最大限制500字节
	Fid         uint    `gorm:"column:fid;type:INT UNSIGNED;comment:附件ID" json:"fid" form:"fid"`                             //附件ID 图片/音频/视频文件所属的xfile.ID
	AddressCity uint    `gorm:"column:address_city;type:INT UNSIGNED;comment:省市区ID" json:"address_city" form:"address_city"` //省市区Code
	Address     string  `gorm:"column:address;type:VARCHAR(200);comment:地址信息" json:"address" form:"address"`                 //地址信息
	Latitude    float64 `json:"latitude" form:"latitude" gorm:"column:latitude;type:double;comment:纬度"`                      // 纬度  国内数值较小的数字4~53.5
	Longitude   float64 `json:"longitude" form:"longitude" gorm:"column:longitude;type:double;comment:经度"`                   // 经度  国内数值较大的数字73.5~135
	IsDeleted   uint8   `gorm:"column:is_deleted;type:tinyint unsigned;comment:是否删除" form:"is_deleted" json:"is_deleted"`    //是否删除
	CreatedAt   string  `gorm:"column:created_at;type:DATETIME;comment:发信时间" json:"created_at" form:"created_at"`            // 发信时间
}

消息记录

func GetChatMessage added in v0.1.36

func GetChatMessage(chat_id uint64, offset, limit int) (int64, []Message, error)

获取群的历史消息记录

chat_id	聊天窗ID
offset	跳过条数
limit	查询条数

func (*Message) TableName

func (c *Message) TableName() string

表名称

type MyChatStruct added in v0.1.35

type MyChatStruct struct {
	ChatId            uint64 `json:"chat_id" form:"chat_id"`                         // 聊天窗ID
	Goos              string `json:"goos" form:"goos"`                               // 设备系统【仅限设备间通讯】
	Thumb             uint   `json:"thumb" form:"thumb"`                             // 群图标ID
	Desc              string `json:"desc" form:"desc"`                               // 群简介/公告
	IsManagement      uint8  `json:"is_management" form:"is_management"`             // 是否是群管理
	IsSilence         uint8  `json:"is_silence" form:"is_silence"`                   // 群是否禁言/我是否被禁言
	IsTop             uint8  `json:"is_top" form:"is_top"`                           // 是否置顶
	IsUnInterruptions uint8  `json:"is_un_interruptions" form:"is_un_interruptions"` // 是否开启免打扰
	Nickname          string `json:"nickname" form:"nickname"`                       // 我在群中的昵称
	TypeId            uint8  `json:"type_id" form:"type_id"`                         // 类型 1-设备间通信 2-用户间通信 3-群聊天
	Arch              string `json:"arch" form:"arch"`                               // 设备CPU架构【仅限设备间通讯】
	DerviceId         uint   `json:"dervice_id" form:"dervice_id"`                   // 设备ID【仅限设备间通讯】
	Hostname          string `json:"hostname" form:"hostname"`                       // 设备名称【仅限设备间通讯】
	MessageId         uint64 `json:"message_id" form:"message_id"`                   // 当前已读消息ID
	Name              string `json:"name" form:"name"`                               // 群名称/群备注名称
	NoRead            int64  `json:"no_read" form:"no_read"`                         // 未读消息数量
}

聊天窗查询的数据结构体信息

func MyChat

func MyChat(uid uint) ([]MyChatStruct, error)

获取我的最近聊天列表

uid	用户ID

type UserFrinds added in v0.2.0

type UserFrinds struct {
	Id        uint   `gorm:"column:id;type:int unsigned;primaryKey;autoIncrement;not null" form:"id" json:"id"`
	UserId    uint   `gorm:"column:user_id;type:int unsigned;comment:所属用户ID" form:"user_id" json:"user_id"`             //所属用户ID
	FrindsId  uint   `gorm:"column:frinds_id;type:int unsigned;comment:好友ID" form:"frinds_id" json:"frinds_id"`         //好友ID
	Desc      string `gorm:"column:desc;type:varchar(200);comment:好友备注" form:"desc" json:"desc"`                        //好友备注
	TypeId    uint8  `gorm:"column:type_id;type:tinyint unsigned;comment:好友类型 1-好友 2-粉丝" form:"type_id" json:"type_id"` //好友类型 1-好友 2-粉丝
	CreatedAt string `gorm:"column:created_at;type:datetime;comment:创建时间" form:"created_at" json:"created_at"`          //创建时间
}

IM好友表,IM好友需要建立两条关系,即A的好友B和B的好友A这两条关系;而粉丝不需要

func GetMyFrinds added in v0.2.0

func GetMyFrinds(uid uint) ([]UserFrinds, error)

获取我的好友

uid	用户ID

func (*UserFrinds) TableName added in v0.2.0

func (c *UserFrinds) TableName() string

返回所属表名信息

Jump to

Keyboard shortcuts

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