群组服务负责群组日常管理,申请进群,创建群,获取群成员,与用户服务类似。
基本代码如下:
func DealMsg(delivery *amqp.Delivery) {
var json = jsoniter.ConfigCompatibleWithStandardLibrary
var transfer1 transfer
err := json.Unmarshal(delivery.Body, &transfer1)
Type := transfer1.Data.Type
if err != nil {
fmt.Println(err)
return
}
switch Type {
case CreateGroup:
CreateGroupRequest(delivery, &transfer1)
case GetGroupList:
GetGroupListRequest(delivery, &transfer1)
case GetGroupMember:
GetGroupMemberRequest(delivery, &transfer1)
case JoinGroup:
JoinGroupDeal(delivery, &transfer1)
case OtherAddGroup:
DealAddGroupResult(delivery, &transfer1)
case ServerInviteUserAddGroup:
ServerInviteUserAddGroupS(delivery, &transfer1)
}
fmt.Println(string(delivery.Body))
}
// 服务邀请直接进群
func ServerInviteUserAddGroupS(delivery *amqp.Delivery, transfer1 *transfer) {
Ack := false
defer func() {
delivery.Ack(Ack)
fmt.Println("ACK", Ack)
}()
var add ServerAddGroupStruct
err := mapstructure.Decode(transfer1.Data.Data, &add)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS json err :", err)
return
}
// 判断群是否存在
group, err := GetGroupInfoSimply(add.GroupId)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS json err :", err)
return
}
// 群不存在
if group.Id != add.GroupId {
Ack = true
return
}
// 判断是否在群
r, err := IsGroupMember(add.Userid, add.GroupId)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS", err)
return
}
// 不在群直接拉进去
if r {
Ack = true
return
}
// 数据库存储
err = msql.MemberAddGroup(add.Userid, add.GroupId)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS err :", err)
return
}
// 更新redis
err = UpdateGroupMembers(add.GroupId)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS err :", err)
return
}
// 用户成功加入群 通知其他在线群员
members, err := GetGroupMemberList(add.GroupId)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS", err)
return
}
for _, member := range members {
u, err := redisconn.RedisGetUser(member.User.Userid)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS", err)
continue
}
if u.Status == OnLine {
var change GroupMemberChange
change.GroupId = add.GroupId
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(change)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS", err)
continue
}
err = RabbitMqPublish(mq, data2, u.Userid, GroupMemberchange, u.GateWay)
if err != nil {
fmt.Println("ServerInviteUserAddGroupS", err)
return
}
// fmt.Println("通知其他在线群员")
}
}
Ack = true
//fmt.Println("处理完毕")
}
// 管理员处理加群
func DealAddGroupResult(delivery *amqp.Delivery, transfer1 *transfer) {
Userid := transfer1.Id
var re OtherDealAddGroupResult
err := mapstructure.Decode(transfer1.Data.Data, &re)
Ack := false
defer func() {
delivery.Ack(Ack)
fmt.Println("ACK", Ack)
}()
if err != nil {
fmt.Println("DealAddGroupResult json err :", err)
return
}
// 判断数据库是否有此添加信息
request, err := msql.GetRequest(re.Id)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
if len(request.id) == 0 {
fmt.Println("DealAddGroupResult 没找到请求 :", err)
Ack = true
return
}
// 获取群信息
g, err := GetGroupInfoSimply(request.ReceiveID)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
// 判断是否是管理员
if Userid != g.GroupOwnerid {
fmt.Println("DealAddGroupResult 不是管理员", Userid, request)
Ack = true
return
}
// 数据库更新请求
var result int
if re.Result {
result = Agree
} else {
result = DisAgree
}
err = msql.UpdateRequest(re.Id, result)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
u, err := redisconn.RedisGetUser(request.SponsorID)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
// 同意进群
if re.Result {
//判断是否已经进群
result, err := IsGroupMember(request.SponsorID, request.ReceiveID)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
if result {
fmt.Println("DealAddGroupResult 已经进群", request.SponsorID)
Ack = true
return
}
// 数据库存储
err = msql.MemberAddGroup(request.SponsorID, request.ReceiveID)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
// 更新redis
err = UpdateGroupMembers(request.ReceiveID)
if err != nil {
fmt.Println("DealAddGroupResult err :", err)
return
}
if u.Status == OnLine {
var addresult AddGroupResult
addresult.Result = true
addresult.Error = "群号:" + g.Id + "群名:" + g.GroupName + "加入成功!"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
err = RabbitMqPublish(mq, data2, u.Userid, JoinGroup, u.GateWay)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
}
// fmt.Println("用户成功加入群 通知其他在线群员")
// 用户成功加入群 通知其他在线群员
members, err := GetGroupMemberList(g.Id)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
for _, member := range members {
u, err := redisconn.RedisGetUser(member.User.Userid)
if err != nil {
fmt.Println("JoinGroupDeal", err)
continue
}
if u.Status == OnLine {
var change GroupMemberChange
change.GroupId = g.Id
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(change)
if err != nil {
fmt.Println("JoinGroupDeal", err)
continue
}
err = RabbitMqPublish(mq, data2, u.Userid, GroupMemberchange, u.GateWay)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
// fmt.Println("通知其他在线群员")
}
}
} else {
// 通知用户进群失败
var addresult AddGroupResult
addresult.Result = false
addresult.Error = "群号:" + g.Id + "群名:" + g.GroupName + "拒绝加入!"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
err = RabbitMqPublish(mq, data2, u.Userid, JoinGroup, u.GateWay)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
return
}
Ack = true
fmt.Println("处理完毕")
}
// 加入群
func JoinGroupDeal(delivery *amqp.Delivery, transfer1 *transfer) {
Userid := transfer1.Id
var add AddGroupStruct
err := mapstructure.Decode(transfer1.Data.Data, &add)
if err != nil {
fmt.Println("JoinGroupDeal json err :", err)
return
}
// 判断群是否存在
group, err := GetGroupInfoSimply(add.GroupId)
if err != nil {
fmt.Println("JoinGroupDeal json err :", err)
return
}
// 群不存在
if group.Id != add.GroupId {
var addresult AddGroupResult
addresult.Result = false
addresult.Error = "群号不存在"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
err = RabbitMqPublish(mq, data2, Userid, JoinGroup, transfer1.From)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
delivery.Ack(true)
return
}
// 判断是否在群
r, err := IsGroupMember(Userid, add.GroupId)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
if r {
var addresult AddGroupResult
addresult.Result = false
addresult.Error = "已经加入群:" + add.GroupId
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
err = RabbitMqPublish(mq, data2, Userid, JoinGroup, transfer1.From)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
delivery.Ack(true)
return
}
// 判断是否有多个请求
num, err := msql.GetRepeatRequest(Userid, add.GroupId, AddGroup, 1)
if err != nil {
fmt.Println("AddUserDeal", err)
return
}
if num > 3 {
var addresult AdduserResult
addresult.Result = false
addresult.Error = "添加该好友请求过多"
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("AddUserDeal", err)
return
}
err = RabbitMqPublish(mq, data2, Userid, AddUser, transfer1.From)
if err != nil {
fmt.Println("AddUserDeal", err)
return
}
delivery.Ack(true)
return
}
// 将请求存储起来
sqlid, err := msql.SaveUserRequest(Userid, add.GroupId, AddGroup, "")
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
// 发送给申请者结果
var addresult AddGroupResult
addresult.Result = false
addresult.Error = "申请成功,等待群主处理 群号:" + add.GroupId
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data2, err := json.Marshal(addresult)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
err = RabbitMqPublish(mq, data2, Userid, JoinGroup, transfer1.From)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
// 判断群主是否在线
GroupOwnerid := group.GroupOwnerid
// 将其发送给被添加者
u, err := redisconn.RedisGetUser(GroupOwnerid)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
// 在线就将信息发送给用户
if u != nil && (u.Status == OnLine && u.GateWay != "") {
var o OtherDealAddUser
// 首先
user, err := GetUser(Userid)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
o.Sponsor = *user
o.Id = sqlid
var json = jsoniter.ConfigCompatibleWithStandardLibrary
data3, err := json.Marshal(o)
if err != nil {
fmt.Println("JoinGroupDeal", err)
return
}
RabbitMqPublish(mq, data3, u.Userid, OtherAddGroup, u.GateWay)
}
delivery.Ack(true)
}