package server;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import model.Chatting;
import model.Group;
import model.HibernateDataOperation;
import model.HibernateSessionFactory;
import model.ResultCode;
import model.User;
import com.google.protobuf.InvalidProtocolBufferException;
import protocol.ProtoHead;
import protocol.Data.ChatData.ChatItem;
import protocol.Data.ChatData.ChatItem.ChatType;
import protocol.Data.ChatData.ChatItem.TargetType;
import protocol.Data.GroupData.GroupItem;
import protocol.Data.UserData.UserItem;
import protocol.Msg.ChangeGroupMsg.ChangeGroupReq;
import protocol.Msg.ChangeGroupMsg.ChangeGroupReq.ChangeType;
import protocol.Msg.ChangeGroupMsg.ChangeGroupRsp;
import protocol.Msg.ChangeGroupMsg.ChangeGroupSync;
import protocol.Msg.CreateGroupChatMsg;
import protocol.Msg.CreateGroupChatMsg.CreateGroupChatReq;
import protocol.Msg.CreateGroupChatMsg.CreateGroupChatRsp;
import protocol.Msg.GetGroupInfoMsg.GetGroupInfoReq;
import protocol.Msg.GetGroupInfoMsg.GetGroupInfoRsp;
import protocol.Msg.ReceiveChatMsg.ReceiveChatSync;
import protocol.Msg.SendChatMsg.SendChatRsp;
import protocol.Msg.SendChatMsg;
import exception.MyException;
import exception.NoIpException;
/**
* 主服务器下的子服务器,负责处理发消息相关事件
*
* @author Feng
*/
public class Server_Chatting {
private Logger logger = Logger.getLogger(this.getClass());
private ServerModel serverModel;
private ServerModel_Chatting serverModel_Chatting;
private ServerNetwork serverNetwork;
private Server_User server_User;
public ServerModel getServerModel() {
return serverModel;
}
public void setServerModel(ServerModel serverModel) {
this.serverModel = serverModel;
}
public ServerModel_Chatting getServerModel_Chatting() {
return serverModel_Chatting;
}
public void setServerModel_Chatting(ServerModel_Chatting serverModel_Chatting) {
this.serverModel_Chatting = serverModel_Chatting;
}
public ServerNetwork getServerNetwork() {
return serverNetwork;
}
public void setServerNetwork(ServerNetwork serverNetwork) {
this.serverNetwork = serverNetwork;
}
public Server_User getServer_User() {
return server_User;
}
public void setServer_User(Server_User server_User) {
this.server_User = server_User;
}
/**
* 对 用户发送微信消息 的事件进行处理 对方在线就立刻发送,不在则存如内存
*
* @param networkPacket
* @throws NoIpException
* @author Feng
*/
public void clientSendChatting(NetworkPacket networkPacket) throws NoIpException {
logger.info("Server_Chatting : clientSendChatting : User sendChatting Event :Deal with user's "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " request");
// Debug.log(new String[] { "Server_Chatting", "clientSendChatting" },
// " User sendChatting Event :Deal with user's "
// + ServerModel.getIoSessionKey(networkPacket.ioSession) +
// " send chatting event");
// 构造回复对象
SendChatMsg.SendChatRsp.Builder sendChattingResponse = SendChatMsg.SendChatRsp.newBuilder();
sendChattingResponse.setResultCode(SendChatRsp.ResultCode.FAIL);
try {
SendChatMsg.SendChatReq sendChattingObject = SendChatMsg.SendChatReq.parseFrom(networkPacket.getMessageObjectBytes());
ChatItem chatItem = sendChattingObject.getChatData();
logger.info("Chat TargetType : " + chatItem.getTargetType().toString());
// 检查接受者是群还是个人
if (chatItem.getTargetType() == ChatItem.TargetType.INDIVIDUAL)
clientSendChatting_Individual(networkPacket, chatItem, sendChattingResponse);
else if (chatItem.getTargetType() == ChatItem.TargetType.GROUP)
clientSendChatting_Group(networkPacket, chatItem, sendChattingResponse);
sendChattingResponse.setResultCode(SendChatMsg.SendChatRsp.ResultCode.SUCCESS);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
logger.error(e.toString());
} catch (Exception e) {
logger.error(e.toString());
e.printStackTrace();
}
// // 回复客户端说发送成功(保存在服务器成功)
// serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
// .getMessageID(), ProtoHead.ENetworkMessage.SEND_CHAT_RSP_VALUE, sendChattingResponse.build().toByteArray())));
}
/**
* 对 用户发送(个人)微信消息 的事件进行处理 对方在线就立刻发送,不在则存如内存
*
* @param networkPacket
* @param chatItem
* @param chatting
* @throws NoIpException
* @author Feng
*/
private void clientSendChatting_Individual(NetworkPacket networkPacket, ChatItem chatItem,
SendChatMsg.SendChatRsp.Builder sendChattingResponse) throws NoIpException {
Chatting chatting = new Chatting(chatItem.getSendUserId(), chatItem.getReceiveUserId(), chatItem.getChatType(),
chatItem.getChatBody(), Calendar.getInstance().getTimeInMillis(), chatItem.getTargetType());
// 若是接收者在线,则发送,否则加入队列
ClientUser clientUser = serverModel.getClientUserByUserId(chatting.getReceiverUserId());
boolean sendSuccess = false;
try {
logger.info("Server_Chatting : clientSendChatting : Receiver online,send to receier("
+ ServerModel.getIoSessionKey(clientUser.ioSession) + ") now!");
// 发送给接收者
serverModel_Chatting.sendChatting(chatting);
sendSuccess = true;
} catch (Exception e) {
}
if (!sendSuccess) {
// 不在线,保存
logger.info("Server_Chatting : clientSendChatting : Receiver offline,save to memory!");
serverModel_Chatting.addChatting(chatting);
}
if (sendChattingResponse != null) {
logger.info("Server response Client's SEND_PERSONAL_CHAT : SUCCESS");
sendChattingResponse.setResultCode(SendChatRsp.ResultCode.SUCCESS);
serverNetwork.sendToClient(networkPacket.ioSession, new PacketFromServer(networkPacket.getMessageID(),
ProtoHead.ENetworkMessage.SEND_CHAT_RSP_VALUE, sendChattingResponse.build().toByteArray()));
}
}
/**
* 对 用户发送(群)微信消息 的事件进行处理, 立刻发送
*
* @param chatItem
* @param chatting
* @author Feng
* @throws Exception
*/
private void clientSendChatting_Group(NetworkPacket networkPacket, ChatItem chatItem,
SendChatMsg.SendChatRsp.Builder sendChattingResponse) throws Exception {
ResultCode resultCode = ResultCode.FAIL;
Session session = HibernateSessionFactory.getSession();
List<Group> groupList = HibernateDataOperation.query(Group.GROUP_ID, Integer.parseInt(chatItem.getReceiveUserId()),
Group.class, resultCode, session);
try {
if (groupList.size() <=0)
throw new MyException("Group not Exist!");
Group group = groupList.get(0);
List<User> receiverList = group.getMemberList();
// List<User> receiverList = ((List<User>)
// HibernateDataOperation.query(Group.GROUP_ID,
// Integer.parseInt(chatItem.getReceiveUserId()),
// Group.class, resultCode, session).get(0));
if (resultCode.getCode().equals(ResultCode.FAIL) || receiverList == null) {
logger.error("Server_Chatting : clientSendChatting_Group : Get Group Error!");
throw new Exception("Server_Chatting : clientSendChatting_Group : Get Group Error!");
}
Chatting chatting;
// 给每个组员发一份
for (User user : receiverList) {
if (user.getUserId().equals(chatItem.getSendUserId()))
continue;
chatting = new Chatting(chatItem.getSendUserId(), user.getUserId() + "", chatItem.getChatType(),
chatItem.getChatBody(), Calendar.getInstance().getTimeInMillis(), Integer.parseInt(chatItem
.getReceiveUserId()), chatItem.getTargetType());
serverModel_Chatting.sendChatting(chatting);
}
} catch (MyException e) {
logger.error(this.getClass().getSimpleName() + " : Server_CHatting : " + e.toString());
e.printStackTrace();
}
// 回复客户端
if (sendChattingResponse != null) {
sendChattingResponse.setResultCode(SendChatRsp.ResultCode.SUCCESS);
serverNetwork.sendToClient(networkPacket.ioSession, new PacketFromServer(networkPacket.getMessageID(),
ProtoHead.ENetworkMessage.SEND_CHAT_RSP_VALUE, sendChattingResponse.build().toByteArray()));
}
}
/**
* 用户创建群聊
*
* @param networkPacket
* @throws NoIpException
* @author Feng
*/
public void createGroupChatting(NetworkPacket networkPacket) throws NoIpException {
logger.debug("Server_Chatting : createGroupChatting : User CreateGroupChatting Event :Deal with user's "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " request");
// 构造回复对象
CreateGroupChatMsg.CreateGroupChatRsp.Builder createGroupChattingResponse = CreateGroupChatRsp.newBuilder();
createGroupChattingResponse.setResultCode(CreateGroupChatRsp.ResultCode.FAIL);
try {
// 判断本用户知否在线
ClientUser selfUser1 = serverModel.getClientUserFromTable(networkPacket.ioSession);
if (selfUser1 == null)
throw new MyException("Server_Chatting : createGroupChatting : creater is offLine!");
// 请求对象
CreateGroupChatReq createGroupChattingObj = CreateGroupChatReq.parseFrom(networkPacket.getMessageObjectBytes());
// 获取请求中的用户列表
List<String> requestUserIdList = createGroupChattingObj.getUserIdList();
if (requestUserIdList.size() <= 0)
throw new MyException("Server_Chatting : createGroupChatting : Member Size = 0");
// 创建要存储的用户列表
List<String> userIdList = new ArrayList<String>();
userIdList.addAll(requestUserIdList);
// 加入自己
if (!userIdList.contains(selfUser1.userId))
userIdList.add(selfUser1.userId);
// 创建Session
Session session = HibernateSessionFactory.getSession();
// 获取成员对象
List<User> userList = server_User.getUsers(userIdList, session);
// 创建群名
String groupName = "";
for (User user : userList) {
groupName += user.getUserName() + ",";
if (groupName.length() > 15) {
groupName = groupName.substring(0, (groupName.length() > 10 ? 10 : groupName.length())) + "...";
break;
}
}
// for (int i = 0; i < userIdList.size() && i < 3; i++)
// groupName += userIdList.get(i).toString() + ",";
// groupName = groupName.substring(0, (groupName.length() > 10 ? 10 : groupName.length())) + "...";
// 创建群对象
Group group = new Group(groupName);
group.setMemberList(userList);
// 设置创建者
group.setCreaterId(selfUser1.userId);
// 保存
ResultCode resultCode = ResultCode.NULL;
HibernateDataOperation.add(group, resultCode, session);
HibernateSessionFactory.commitSession(session);
if (!resultCode.getCode().equals(ResultCode.SUCCESS))
throw new MyException("Server_Chatting : createGroupChatting : save newGroup Objcet Error!");
// 设置回复的群号
createGroupChattingResponse.setGroupChatId(group.getGroupId());
// 如果成功,设置标志位
logger.debug("Server_Chatting : createGroupChatting : create group chatting Successful, response to client!");
if (resultCode.getCode().equals(ResultCode.SUCCESS))
createGroupChattingResponse.setResultCode(CreateGroupChatRsp.ResultCode.SUCCESS);
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.CREATE_GROUP_CHAT_RSP_VALUE, createGroupChattingResponse.build()
.toByteArray())));
// 通知每位群成员修改列表
sendChangeGroupSync(group);
// 消息通知成员
// String message = selfUser1.userId + " 创建了群聊";
// sendSystemMessage(message, group);
String message = selfUser1.userId + " 邀请 ";
for (User user : userList)
if (!user.getUserId().equals(selfUser1.userId))
message += user.getUserId() + "、";
message = message.substring(0, message.length() - 1) + "加入群聊";
// sendSystemMessage(selfUser1.userId + " 邀请 " + user.getUserId() + "加入群聊", group);
sendSystemMessage(message, group);
return;
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
logger.error(e.toString());
} catch (MyException e) {
logger.error(e.toString());
}
// 回复客户端
createGroupChattingResponse.setResultCode(CreateGroupChatRsp.ResultCode.FAIL);
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.CREATE_GROUP_CHAT_RSP_VALUE, createGroupChattingResponse.build()
.toByteArray())));
}
/**
* 获取一个聊天群资料
*
* @param networkPacket
* @author Feng
* @throws NoIpException
*/
public void getGroupInfo(NetworkPacket networkPacket) throws NoIpException {
logger.debug("Server_Chatting : getGroupInfo : Client GetGroupInfo Event :Deal with user's "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " request");
// 构造回复对象
GetGroupInfoRsp.Builder responseBuilder = GetGroupInfoRsp.newBuilder();
responseBuilder.setResultCode(GetGroupInfoRsp.ResultCode.FAIL);
try {
// 获取请求对象
GetGroupInfoReq requestObj = GetGroupInfoReq.parseFrom(networkPacket.getMessageObjectBytes());
// 获取群资料
Session session = HibernateSessionFactory.getSession();
ResultCode resultCode = ResultCode.NULL;
Group group = getGroupInfo(Integer.parseInt(requestObj.getGroupId()), session);
if (group == null) {
responseBuilder.setResultCode(GetGroupInfoRsp.ResultCode.GROUP_NOT_EXIST);
throw new MyException("Server_Chatting : getGroupInfo(NetworkPacket) : Can't get Group, Group = null");
}
GroupItem.Builder groupItem = GroupItem.newBuilder();
// 设置创建者
groupItem.setCreaterUserId(group.getCreaterId());
// groupItem.setCreater(User.createUserItemBuilder(server_User.getUser(group.getCreaterId(),
// session)));
// 添加成员
for (User user : group.getMemberList())
groupItem.addMemberUserId(user.getUserId());
// groupItem.addMemberUser(User.createUserItemBuilder(user));
// 群Id
groupItem.setGroupId(group.getGroupId() + "");
// groupItem.setGroupId(group.getGroupId() + "");
// 群名
groupItem.setGroupName(group.getGroupName());
// groupItem.setGroupName(group.getGroupName());
// responseBuilder.setGroupItem(groupItem);
responseBuilder.setGroupItem(groupItem);
responseBuilder.setResultCode(GetGroupInfoRsp.ResultCode.SUCCESS);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
logger.error(e.toString());
} catch (MyException e) {
logger.error(e.toString());
}
// 回复客户端说修改成功(保存在服务器成功)
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.GET_GROUP_INFO_RSP_VALUE, responseBuilder.build().toByteArray())));
}
public Group getGroupInfo(int groupId, Session session) throws NoIpException, MyException {
// 获取群资料
ResultCode resultCode = ResultCode.NULL;
List<Group> groupList = HibernateDataOperation.query(Group.GROUP_ID, groupId, Group.class, resultCode, session);
if (groupList == null)
throw new MyException("Server_Chatting : getGroupInfo : getGroup Fail!");
Group group = null;
if (resultCode.getCode().equals(ResultCode.SUCCESS) && groupList.size() > 0)
group = groupList.get(0);
return group;
}
/**
* 修改群
*
* @param networkPacket
* @throws NoIpException
* @author Feng
*/
public void changeGroup(NetworkPacket networkPacket) throws NoIpException {
logger.debug("Server_Chatting : changGroupChattingMember : User ChangeGroupChattingMember Event :Deal with user's "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " request");
// 构造回复对象
ChangeGroupRsp.Builder responseBuilder = ChangeGroupRsp.newBuilder();
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.FAIL);
// 验证用户在线
ClientUser requestUser = serverModel.getClientUserFromTable(networkPacket.ioSession);
if (requestUser == null || requestUser.userId == null || requestUser.userId.equals(""))
try {
throw new MyException("ServerModel : changeGroupMember : User has no authority!");
} catch (MyException e) {
logger.error(e.toString());
e.printStackTrace();
// 回复
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.NO_AUTHORITY);
serverNetwork.sendToClient(networkPacket.ioSession,
new PacketFromServer(NetworkPacket.getMessageID(networkPacket.arrayBytes),
ProtoHead.ENetworkMessage.CHANGE_GROUP_RSP_VALUE, responseBuilder.build().toByteArray()));
}
ChangeGroupReq changeGroupObj;
try {
changeGroupObj = ChangeGroupReq.parseFrom(networkPacket.getMessageObjectBytes());
if (changeGroupObj.getChangeType() == ChangeGroupReq.ChangeType.UPDATE_INFO) // 改群信息
changeGroupInfo(networkPacket, changeGroupObj, requestUser, responseBuilder);
else // 改人
changeGroupMember(networkPacket, changeGroupObj, requestUser, responseBuilder);
} catch (InvalidProtocolBufferException e) {
logger.error(e.toString());
e.printStackTrace();
}
// 显示“A已经要清B,C加入
}
/**
* 修改群--》修改群成员
*
* @param networkPacket
* @author Feng
*/
private void changeGroupMember(NetworkPacket networkPacket, ChangeGroupReq changeGroupObj, ClientUser requestUser,
ChangeGroupRsp.Builder responseBuilder) {
try {
// 获取群聊名单
Session session = HibernateSessionFactory.getSession();
ResultCode resultCode = ResultCode.NULL;
Group group = getGroupInfo(Integer.parseInt(changeGroupObj.getGroupId()), session);
// 获取要处理的用户名单
List<String> userListBeDeal = changeGroupObj.getUserIdList();
// 检查权限 (在群用户中)
if (!checkUserInGroup(requestUser.userId, group))
throw new MyException(
"Server_Chatting : changGroupChattingMember(NetworkPacket) : User has no authority to Change member!");
// 操作类型
boolean containes;
List<User> newUserList = new ArrayList<User>();
newUserList.addAll(group.getMemberList());
List<String> userBeAddList = new ArrayList<String>();
if (changeGroupObj.getChangeType() == ChangeType.ADD) { // 添加新用户
// 整理出未存在群内的用户
a: for (String userId : userListBeDeal) {
for (User user : newUserList)
if (user.getUserId().equals(userId)) // 若用户已存在,则跳过
continue a;
// 用户不存在群表中,添加
userBeAddList.add(userId);
}
// 加到新群用户表中
if (userBeAddList.size() > 0)
newUserList.addAll(server_User.getUsers(userBeAddList, session));
} else if (changeGroupObj.getChangeType() == ChangeType.DELETE) { // 删除自己
User user = null;
for (User u : newUserList)
if (u.getUserId().equals(requestUser.userId))
user = u;
if (user != null)
newUserList.remove(user);
}
group.setMemberList(newUserList);
// 存入数据库
if (newUserList.size() == 0) { // 如果群已经空了,则删除群
HibernateDataOperation.delete(group, resultCode);
} else { // 否则,更新群
HibernateDataOperation.update(group, resultCode, session);
if (resultCode.getCode().equals(ResultCode.SUCCESS))
logger.debug("Server_Chatting : changGroupChattingMember(NetworkPacket) : Change member successful!");
else
throw new MyException("Server_Chatting : changGroupChattingMember : Update to database Error!");
}
HibernateSessionFactory.commitSession(session);
// 回复客户端(修改成功)
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.SUCCESS);
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.CHANGE_GROUP_RSP_VALUE, responseBuilder.build().toByteArray())));
// 通知所有用户
// ChangeGroupSync.ChangeType changeType;
// if (changeGroupObj.getChangeType() == ChangeType.ADD) {
// changeType = ChangeGroupSync.ChangeType.ADD;
//
// // 消息通知成员(谁把谁加进来了)
// notifyMemberJionIn2(requestUser.userId, userListBeDeal,
// group.getGroupId() + "");
// } else if (changeGroupObj.getChangeType() == ChangeType.DELETE)
// changeType = ChangeGroupSync.ChangeType.DELETE;
// else
// changeType = ChangeGroupSync.ChangeType.UPDATE_MEMBER;
// 更新每位成员的数据
sendChangeGroupSync(group);
//系统消息 通知成员变化
if (changeGroupObj.getChangeType() == ChangeType.ADD) { // 添加新用户
for (String userId : userBeAddList)
sendSystemMessage(requestUser.userId + " 邀请 " + userId + " 加入群聊", group);
} else if (changeGroupObj.getChangeType() == ChangeType.DELETE) { // 删除自己
sendSystemMessage(requestUser.userId + " 退出群聊", group);
}
return;
} catch (MyException e) {
logger.error(e.toString());
} catch (NoIpException e) {
e.printStackTrace();
logger.error(e.toString());
}
// 回复客户端
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.FAIL);
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.CHANGE_GROUP_RSP_VALUE, responseBuilder.build().toByteArray())));
}
/**
* 修改群--》修改群详细信息
*
* @param networkPacket
*/
private void changeGroupInfo(NetworkPacket networkPacket, ChangeGroupReq changeGroupObj, ClientUser requestUser,
ChangeGroupRsp.Builder responseBuilder) {
// 新群名
String newGroupName = changeGroupObj.getGroupName();
// 获取群
Session session = HibernateSessionFactory.getSession();
ResultCode resultCode = ResultCode.NULL;
Group group;
try {
group = getGroupInfo(Integer.parseInt(changeGroupObj.getGroupId()), session);
if (group == null)
throw new MyException("Server_Chatting : changeGroupInfo : Group not Found!");
if (newGroupName != null && !newGroupName.equals(""))
group.setGroupName(newGroupName);
HibernateDataOperation.update(group, resultCode, session);
HibernateSessionFactory.commitSession(session);
if (!resultCode.getCode().equals(ResultCode.SUCCESS))
throw new MyException("Server_Chatting : changeGroupInfo : database Exception!");
// 回复客户端
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.SUCCESS);
serverNetwork.sendToClient(networkPacket.ioSession, new PacketFromServer(networkPacket.getMessageID(),
ProtoHead.ENetworkMessage.CHANGE_GROUP_RSP_VALUE, responseBuilder.build().toByteArray()));
// 修改所有用户的群数据
sendChangeGroupSync(group);
// 已系统消息方式通知每个用户
sendSystemMessage(requestUser.userId + "将群名称改为 ‘" + group.getGroupName() + "’", group);
return;
} catch (NoIpException e) {
logger.error(e.toString());
e.printStackTrace();
} catch (MyException e) {
logger.error(e.toString());
e.printStackTrace();
}
// 回复客户端
responseBuilder.setResultCode(ChangeGroupRsp.ResultCode.FAIL);
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.CHANGE_GROUP_RSP_VALUE, responseBuilder.build().toByteArray())));
}
/**
* 查询用户是否在群中
*
* @param userId
* @param group
* @return boolean
* @author Feng
*/
private boolean checkUserInGroup(String userId, Group group) {
for (User user : group.getMemberList())
if (userId.equals(user.getUserId()))
return true;
return false;
}
/**
* 发送消息“(邀请者)已邀请(被邀请者)加入
*
* @param inviterUserId
* @param invitees
*/
// private void sendSystemMessage_Add(String inviterUserId, List<User> userList, Group group) {
// StringBuffer message = new StringBuffer(inviterUserId + " 已邀请");
// for (String userId : inviteeUserIds)
// if (!userId.equals(inviteeUserIds))
// message.append("'" + userId + "',");
// String message2 = message.subSequence(0, message.length() - 1) + " 加入群聊";
// }
// private void notifyMemberJionIn1(String inviterUserId, List<User> inviteeUsers, String groupId) {
// String[] userList = new String[inviteeUsers.size()];
// for (int i = 0; i < inviteeUsers.size(); i++)
// userList[i] = inviteeUsers.get(i).getUserId();
// notifyMemberJionIn(inviterUserId, userList, groupId);
// }
//
// private void notifyMemberJionIn2(String inviterUserId, List<String> inviteeUserIds, String groupId) {
// String[] userList = new String[inviteeUserIds.size()];
// inviteeUserIds.toArray(userList);
// notifyMemberJionIn(inviterUserId, userList, groupId);
// }
// private void notifyMemberJionIn(String inviterUserId, String[] inviteeUserIds, String groupId) {
public void sendSystemMessage(String message, String targetUserId) {
ChatItem.Builder builder = ChatItem.newBuilder();
builder.setChatBody(message);
builder.setChatType(ChatType.TEXT);
builder.setReceiveUserId(targetUserId);
builder.setTargetType(TargetType.SYSTEM);
builder.setDate(Calendar.getInstance().getTimeInMillis());
try {
clientSendChatting_Individual(null, builder.build(), null);
} catch (Exception e) {
logger.error(e.toString());
}
}
private void sendSystemMessage(String message, Group group) {
ChatItem.Builder builder = ChatItem.newBuilder();
builder.setChatBody(message);
builder.setChatType(ChatType.TEXT);
builder.setReceiveUserId(group.getGroupId() +"");
builder.setTargetType(TargetType.SYSTEM);
builder.setDate(Calendar.getInstance().getTimeInMillis());
try {
clientSendChatting_Group(null, builder.build(), null);
} catch (Exception e) {
logger.error(e.toString());
}
}
/**
* 给用户发送群人员变更消息
*
* @param userList
* @param type
*/
// private void sendChangeGroupSync(Group group, List<User> userList,
// ChangeGroupSync.ChangeType type) {
// User[] userList2 = new User[userList.size()];
// userList.toArray(userList2);
// sendChangeGroupSync(group, userList2, type);
// }
// private void sendChangeGroupSync(Group group, User[] userList,
// ChangeGroupSync.ChangeType type) {
private void sendChangeGroupSync(Group group) {
GroupItem.Builder groupItem = GroupItem.newBuilder();
for (User user : group.getMemberList())
groupItem.addMemberUserId(user.getUserId());
groupItem.setCreaterUserId(group.getCreaterId());
groupItem.setGroupId(group.getGroupId() + "");
groupItem.setGroupName(group.getGroupName());
ChangeGroupSync.Builder builder = ChangeGroupSync.newBuilder();
builder.setGroupItem(groupItem);
ClientUser clientUser;
// 对每个在线的群成员发送
for (User user : group.getMemberList()) {
clientUser = serverModel.getClientUserByUserId(user.getUserId());
if (clientUser == null)
continue;
serverNetwork.sendToClient(clientUser.ioSession, new PacketFromServer(
ProtoHead.ENetworkMessage.CHANGE_GROUP_SYNC_VALUE, builder.build().toByteArray()));
}
}
/**
* 发消息自动回复(调试测试用)
*
* @param networkPacket
* @param chatting
* @author Feng
* @throws IOException
*/
private void sendChattingAutoResponse(NetworkPacket networkPacket, Chatting chatting) throws IOException {
// 回复发送者:发送成功
SendChatMsg.SendChatRsp.Builder sendChattingResponse = SendChatMsg.SendChatRsp.newBuilder();
sendChattingResponse.setResultCode(SendChatMsg.SendChatRsp.ResultCode.SUCCESS);
serverNetwork.sendToClient(networkPacket.ioSession, new PacketFromServer(networkPacket.getMessageID(),
ProtoHead.ENetworkMessage.SEND_CHAT_RSP_VALUE, sendChattingResponse.build().toByteArray()));
// 自动回复
ReceiveChatSync.Builder receiverChatObj = ReceiveChatSync.newBuilder();
ChatItem.Builder chatItem = chatting.createChatItem();
chatItem.setSendUserId(chatting.getReceiverUserId());
chatItem.setReceiveUserId(chatting.getSenderUserId());
receiverChatObj.addChatData(chatItem);
// 发送
serverNetwork.sendToClient(networkPacket.ioSession, new PacketFromServer(
ProtoHead.ENetworkMessage.RECEIVE_CHAT_SYNC_VALUE, receiverChatObj.build().toByteArray()));
// byte[] messageWillSend =
// networkPacket.packMessage(ProtoHead.ENetworkMessage.RECEIVE_CHAT_SYNC_VALUE,
// receiverChatObj
// .build().toByteArray());
// 添加回复监听
// serverModel_Chatting.addListenReceiveChatting(networkPacket.ioSession,
// chatting, messageWillSend);
}
// private void sendChatSuperCommand(networkPacket networkPacket, Chatting
// chatting) throws IOException {
// // 回复发送者:发送成功
// SendChatMsg.SendChatRsp.Builder sendChattingResponse =
// SendChatMsg.SendChatRsp.newBuilder();
// sendChattingResponse.setResultCode(SendChatMsg.SendChatRsp.ResultCode.SUCCESS);
// serverNetwork.sendMessageToClient(networkPacket.ioSession,
// networkPacket.packMessage(
// ProtoHead.ENetworkMessage.SEND_CHAT_RSP_VALUE,
// networkPacket.getMessageID(), sendChattingResponse.build()
// .toByteArray()));
// }
/**
* 客户端已接收到服务其发送的“未接收消息”, 删除对客户端回复的等待
*
* @param networkPacket
*/
// public void clientReceiveChatting(networkPacket networkPacket) {
// byte[] key = networkPacket.getMessageID(networkPacket.arrayBytes);
// serverModel.removeClientResponseListener(key);
// }
}