package chat.handler; import static chat.consts.UserSettingScope.kUserSettingMyChannels; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.json.JSONObject; import com.google.gson.Gson; import com.vdurmont.emoji.EmojiParser; import chat.consts.RestResult; import chat.handler.data.DataList; import chat.handler.data.FriendData; import chat.module.Bucket; import chat.module.FriendRequstBucket; import chat.module.ModuleLoader; import chat.module.entity.ChatSpaceType; import chat.module.entity.FriendShip; import chat.module.entity.MessageRecord; import chat.security.AES; import chat.server.call.CallObject; import chat.server.im.IMDispatcher; import chat.server.im.IMTopic; import chat.server.moquette.message.MqttFixedHeader; import chat.server.moquette.message.MqttMessageType; import chat.server.moquette.message.MqttPublishMessage; import chat.server.moquette.message.MqttPublishVariableHeader; import chat.server.moquette.message.MqttQoS; import chat.sms.OneClickLogin; import chat.sms.Record; import chat.sms.SmsService; import chat.tools.Utils; import chat.user.Client; import chat.user.ClientStore; import chat.user.Notify; import chat.user.NotifyContent; import chat.user.NotifyContentDetail; import chat.user.NotifyStore; import chat.user.NotifySubject; import chat.user.ResultMessage; import chat.user.Session; import chat.user.Token; import chat.user.User; import chat.user.UserStore; import chat.util.I18n; import chat.util.MessageShardingUtil; import cn.wildfirechat.common.ErrorCode; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import cn.wildfirechat.proto.WFCMessage.IMHttpWrapper; import frame.object.data.ID; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.util.internal.StringUtil; public class ClientHandler extends CallObject { private static FriendRequstBucket friendRequstBucket; private ScheduledExecutorService mScheduledExecutorService = Executors.newScheduledThreadPool(4); private static ConcurrentHashMap mRecords = new ConcurrentHashMap(); private static ConcurrentHashMap mOneLoginPhone = new ConcurrentHashMap();; private static String clientType; protected static Logger logger; static { friendRequstBucket = FriendRequstBucket.getInstance(); logger = Logger.getLogger(IMDispatcher.class); } @Override protected void publishMethod() { addOneMethod("login"); addOneMethod("sendSMSCode"); addOneMethod("oneLogin"); addOneMethod("getUser"); addOneMethod("pullMessage"); addOneMethod("notifyMessage"); addOneMethod("pullFriend"); addOneMethod("pullRequestFriend"); addOneMethod("addFriend"); addOneMethod("handleFriend"); addOneMethod("setFriendAlias"); addOneMethod("notifyFriend"); addOneMethod("notifyMesage"); addOneMethod("loadRemoteMessage"); addOneMethod("getClient"); addOneMethod("getUserSetting"); addOneMethod("putUserSetting"); addOneMethod("getUserInfo"); addOneMethod("setUserInfo"); addOneMethod("getBlacklist"); addOneMethod("blackListUser"); addOneMethod("userSearch"); addOneMethod("getToken"); addOneMethod("broadCastMessage"); addOneMethod("channelListen"); addOneMethod("channelSearch"); addOneMethod("createChannel"); addOneMethod("deleteFriend"); addOneMethod("destoryUser"); addOneMethod("dismissGroup"); addOneMethod("destoryChannel"); addOneMethod("pullChannel"); addOneMethod("chatRoomInfo"); addOneMethod("getChatRoomMember"); addOneMethod("joinChatRoom"); addOneMethod("quitChatRoom"); addOneMethod("kickOffGroup"); addOneMethod("kickoffPCClient"); addOneMethod("modifyChannel"); addOneMethod("transferChannel"); } //接收从医视无忧发过来的新增用户信息 public ResultMessage createOneUser(NotifyContentDetail contentDetail) throws Exception { ResultMessage resultMessage; User user = User.setUserInfo(contentDetail); if (UserStore.getByExtra(contentDetail.getDoctorId()) != null) { resultMessage = new ResultMessage(false, "用户信息已添加过,此次不添加!"); return resultMessage; } User resultUser = UserStore.createOneUser(user); resultPool.setNeedReturnCode(false); if (resultUser != null) { //保存到内存中 UserStore.addOne(user); resultMessage = new ResultMessage(true, "用户信息添加成功!"); } else { resultMessage = new ResultMessage(false, "用户信息添加失败!"); } return resultMessage; } //接收从医视无忧发过来的修改用户信息 public ResultMessage modifyOneUser(NotifyContentDetail contentDetail) throws Exception { ResultMessage resultMessage; User user = User.setUserInfo(contentDetail); //更新第二个参数:确定唯一记录的字段;第三个参数:更新排除的字段; Map excludeColumn = new HashMap(); excludeColumn.put("id", "id"); int resultRecord = UserStore.modifyUser(user, "extra", excludeColumn); resultPool.setNeedReturnCode(false); if (resultRecord > 0) { //修改内存中的数据 User modifyUser = UserStore.getByExtra(user.getExtra()); modifyUser.reLoad(user); resultMessage = new ResultMessage(true, "用户信息修改成功!"); } else if (resultRecord == -1){ resultMessage = new ResultMessage(false, "用户唯一记录的字段ID值为空"); } else { resultMessage = new ResultMessage(false, "用户信息修改失败!"); } return resultMessage; } //接收从医视无忧发过来的消息 增加JSON解析 public void notifyMesage() throws Exception { ResultMessage resultMessage = null; if (dataPool != null) { if (dataPool.getBody() == null || dataPool.getBody().equals("")) { return; } } else { return; } NotifySubject notifySubject = new Gson().fromJson(dataPool.getBody(), NotifySubject.class); //1.判断是否是增加、修改、基础消息 if (notifySubject.getMsgtitle().contains("addUser") || notifySubject.getMsgtitle().contains("modifyUser")) {//增加 NotifyContentDetail contentDetail = notifySubject.getMsgcontent().getContent(); if (notifySubject.getMsgtitle().contains("addUser")) { resultMessage = createOneUser(contentDetail); } else if (notifySubject.getMsgtitle().contains("modifyUser")) { resultMessage = modifyOneUser(contentDetail); } } else {//基础消息 Notify notify = new Notify(); notify.setId(ID.newValue()); notify.setSender(notifySubject.getSender()); notify.setRoletype(notifySubject.getMsgcontent().getContent().getRoletype()); notify.setTarget(notifySubject.getMsgcontent().getContent().getDoctorId()); notify.setMsgtitle(notifySubject.getMsgcontent().getTitle()); notify.setMsgcontent(notifySubject.getMsgtitle()); notify.setMsgtime(notifySubject.getMsgtime()); notify.setIsread("F"); boolean result = Notify.saveNotify(notify); if (result) { //保存内存 NotifyStore.addOne(notify); resultMessage = new ResultMessage(true, "通知接收成功!"); } else { resultMessage = new ResultMessage(false, "通知接收失败!"); } } resultPool.setNeedReturnCode(false); resultPool.add("success", resultMessage.isFlag()); resultPool.add("msg", resultMessage.getMessage(), false); resultPool.add("timestamp", System.currentTimeMillis()); } public void login() throws Exception { //0. load client type clientType = dataPool.getString("roletype"); //1. load client Client client = ClientStore.getOrCreate(dataPool); //2. load user client.createSession(); //3. write back User user = client.getUser(); Session session = client.getSession(); Token token = session.getToken(); String mobile = ""; String code = ""; //如果,不是一键登陆 if(dataPool.getString("token") == null || mOneLoginPhone.get(dataPool.getString("token")) == null) { //短信验证码 mobile = dataPool.getString("mobile"); code = dataPool.getString("code"); //短信验证 if (mRecords.get(mobile) != null) { if (mRecords.get(mobile).getCode().equalsIgnoreCase(code)) { mRecords.remove(mobile); } else { return; } } else if (!"66666".equals(code)) {//超级密码错误 return; } } else { mobile = mOneLoginPhone.get(dataPool.getString("token")); mOneLoginPhone.remove(dataPool.getString("token")); } byte[] tokenByte = token.getFullValue(); tokenByte = AES.AESEncrypt(tokenByte, ""); String tokenValue = Base64.getEncoder().encodeToString(tokenByte); resultPool.add("userId", user.getId()); resultPool.add("username", user.getName()); resultPool.add("token", tokenValue, false); resultPool.add("portrait", user.getPortrait()); resultPool.add("isregister", true); resultPool.add("doctorId", user.getExtra() == null ? "" : user.getExtra()); } public void oneLogin() throws Exception { String token = dataPool.getString("token"); OneClickLogin oneLogin = new OneClickLogin(); String phone = oneLogin.mobileLogin(token); mOneLoginPhone.put(token, phone); dataPool.setPhone(phone); login(); } public void sendSMSCode() throws Exception { RestResult result = null; String message = ""; String mobile = dataPool.getString("mobile"); String code = Utils.getRandomCode(4); SmsService smsService = new SmsService(); Record record = mRecords.get(mobile); if(record != null) { resultPool.add("code", 0); resultPool.add("message", "ERROR_SEND_SMS_OVER_FREQUENCY"); resultPool.add("result", result); return; } mRecords.put(mobile, new Record(code, mobile)); RestResult.RestCode restCode = smsService.sendAliyunCode(mobile, code); if (restCode == RestResult.RestCode.SUCCESS) { result = RestResult.ok(restCode); message = "SUCCESS"; } else { result = RestResult.error(restCode); message = "ERROR_NOT_LOGIN"; } resultPool.add("code", 0); resultPool.add("message", message); resultPool.add("result", result); } //用户登陆加载好友列表 public void pullFriend() { //1.得到对应用户所有的朋友 List friendDataList = new ArrayList(); List checkUser = user.getFriendship(user.getId()); if (checkUser == null) { resultPool.setBytes(null); return; } for (FriendShip friendShip : user.getFriendship(user.getId())) { friendDataList.add(new FriendData(friendShip.getUserid(), friendShip.getFriendid(), UserStore.getById(friendShip.getFriendid()).getDisplayName(), "", 0, 0, System.currentTimeMillis())); } // List friendDataList = DataList.getFriendList(); WFCMessage.GetFriendsResult.Builder builder = WFCMessage.GetFriendsResult.newBuilder(); for (FriendData data : friendDataList) { WFCMessage.Friend.Builder builder1 = WFCMessage.Friend.newBuilder(); builder1.setState(data.getState()); builder1.setBlacked(data.getBlacked()); builder1.setUid(data.getFriendUid()); builder1.setUpdateDt(data.getTimestamp()); if (!StringUtil.isNullOrEmpty(data.getAlias())) { builder1.setAlias(data.getAlias()); } if (!StringUtil.isNullOrEmpty(data.getExtra())) { builder1.setExtra(data.getExtra()); } builder.addEntry(builder1.build()); } byte[] bytes = builder.build().toByteArray(); resultPool.setBytes(bytes); } //用户登陆添加好友请求 public void pullRequestFriend() { //WFCMessage.Version request = (WFCMessage.Version) dataPool.getWFCMessage(WFCMessage.Version.class); List friendDatas = new ArrayList(); List friendShipList = user.getApplyFriendShip(user.getId()); if (friendShipList != null) { for (FriendShip friendShip : friendShipList) { friendDatas.add(friendShip.getFriendRequest()); } } WFCMessage.GetFriendRequestResult.Builder builder = WFCMessage.GetFriendRequestResult.newBuilder(); builder.addAllEntry(friendDatas); byte[] bytes = builder.build().toByteArray(); resultPool.setBytes(bytes); } //MN public void notifyMessage() { // System.out.println("触发MN消息"); } //MP public void pullMessage() throws Exception { //1.输入参数 WFCMessage.PullMessageRequest request = (WFCMessage.PullMessageRequest) dataPool.getWFCMessage(WFCMessage.PullMessageRequest.class); if (request == null) { return; } WFCMessage.PullMessageResult.Builder builder = WFCMessage.PullMessageResult.newBuilder(); List messageList = user.getUnreceivedMessageList(); for (WFCMessage.Message message: messageList) { builder.addMessage(message); } //2. builder.setCurrent(DataList.timestamp); builder.setHead(DataList.timestamp); //3. byte[] bytes = builder.build().toByteArray(); resultPool.setBytes(bytes); } //FAR public void addFriend() { try { // String userId = dataPool.getString("userId"); // // WFCMessage.AddFriendRequest.Builder addFriendRequestBuild = WFCMessage.AddFriendRequest.newBuilder(); // addFriendRequestBuild.setReason(dataPool.getString("reason")); // addFriendRequestBuild.setTargetUid(dataPool.getString("friendUid")); // // WFCMessage.AddFriendRequest addFriendRequest = addFriendRequestBuild.build(); WFCMessage.AddFriendRequest friendRequest = (WFCMessage.AddFriendRequest) dataPool.getWFCMessage(WFCMessage.AddFriendRequest.class); //将用户请求消息挂到请求的user下面 user.addUserFriendShip(user.getId(), friendRequest); //增加用户验证请求 //friendRequstBucket.createFriendRequest(userId, addFriendRequest, head); resultPool.setBytes(null); //发通知 String NotifyFriendRequestTopic = "FRN"; //publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, addFriendRequest.getTargetUid(), head[0], userId, addFriendRequest.getReason()); // mScheduledExecutorService.schedule(threadFactory.newThread(new Runnable() { // @Override // public void run() { // exeMessage(IMTopic.NotifyFriendRequestTopic, addFriendRequest.getTargetUid(), head[0], userId, addFriendRequest.getReason()); // } // }), 100, TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); } } //加朋友的对方,接受请求 public void handleFriend() throws Exception { //头 WFCMessage.HandleFriendRequest request = (WFCMessage.HandleFriendRequest) dataPool.getWFCMessage(WFCMessage.HandleFriendRequest.class); //尾 long[] heads = new long[2]; WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder(); builder.setFromUser(request.getTargetUid()); user.handleFriendRequest(user.getId(), request, builder, heads); //6.发通知消息 long messageId = MessageShardingUtil.generateId(); long timestamp = System.currentTimeMillis(); builder.setMessageId(messageId); builder.setServerTimestamp(timestamp); ChatSpaceType spaceType = ChatSpaceType.pase(builder.build().getConversation().getType()); Bucket bucket = Bucket.getInstance(spaceType); bucket.pushOneMessage(builder.build(), UserStore.getById(request.getTargetUid()), false); //7.发问候语消息 String language = "zh"; WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder(); contentBuilder.setType(90).setContent(I18n.getString(language, "Above_Greeting_Message")); builder = WFCMessage.Message.newBuilder(); builder.setFromUser(request.getTargetUid()); builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(user.getId()).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build()); builder.setContent(contentBuilder); timestamp = System.currentTimeMillis(); builder.setServerTimestamp(timestamp); messageId = MessageShardingUtil.generateId(); builder.setMessageId(messageId); bucket.pushOneMessage(builder.build(), UserStore.getById(request.getTargetUid()), false); //8.开始聊天消息 contentBuilder.setContent(I18n.getString(language, "Friend_Can_Start_Chat")); builder.setContent(contentBuilder); messageId = MessageShardingUtil.generateId(); builder.setMessageId(messageId); timestamp = System.currentTimeMillis(); builder.setServerTimestamp(timestamp); bucket.pushOneMessage(builder.build(), UserStore.getById(request.getTargetUid())); //9.self消息 ModuleLoader.getImBusinessScheduler().execute(() -> bucket.getOne(user.getId()).notifyOneFriend(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0])); //10.target消息 ModuleLoader.getImBusinessScheduler().execute(() -> bucket.getOne(user.getId()).notifyOneFriend(IMTopic.NotifyFriendTopic, user.getId(), heads[1])); resultPool.setBytes(null); } public void exeMessage(String topic, String receiver, long head, String fromUser, String pushContent) { try { ByteBuf payload = Unpooled.buffer(); payload.writeLong(head); MqttPublishMessage publishMsg; publishMsg = notRetainedPublish(topic, MqttQoS.AT_MOST_ONCE, payload); Client client = user.getClient(user.getId()); Session sessionC = client.getSession(); if (sessionC != null) { Channel channel = sessionC.getChannel(); if (publishMsg != null) { channel.writeAndFlush(publishMsg); } } } catch(Exception e) { e.printStackTrace(); } } public static MqttPublishMessage notRetainedPublish(String topic, MqttQoS qos, ByteBuf message) { return notRetainedPublishWithMessageId(topic, qos, message, 0); } private static MqttPublishMessage notRetainedPublishWithMessageId(String topic, MqttQoS qos, ByteBuf message, int messageId) { MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.PUBLISH, false, qos, false, 0); MqttPublishVariableHeader varHeader = new MqttPublishVariableHeader(topic, messageId); return new MqttPublishMessage(fixedHeader, varHeader, message); } private ThreadFactory threadFactory = new ThreadFactory() { @Override public Thread newThread(final Runnable r) { return new Thread() { @Override public void run() { r.run(); } }; } }; public void getUserInfo() { String userId = dataPool.getString("userId"); User user = UserStore.getById(userId); if (user == null) { return; } WFCMessage.User.Builder userBuilder = WFCMessage.User.newBuilder(); userBuilder.setUid(user.getId()); userBuilder.setName(user.getName()); userBuilder.setDisplayName(user.getDisplayName()); userBuilder.setPortrait(user.getPortrait()); userBuilder.setMobile(user.getMobile()); String extra = user.getExtra(); if (extra != null && !extra.equals("")) { userBuilder.setExtra(extra); } else { userBuilder.setExtra(""); } WFCMessage.User wfcUser = userBuilder.build(); resultPool.add(wfcUser); } public void getUser() { try { IMHttpWrapper httpWrapper = dataPool.getHttpWrapper(); byte[] bytes = null; if (httpWrapper == null) { if (dataPool.getBody() == null) { logger.debug(dataPool); return; } bytes = dataPool.getBody().getBytes(); } else { bytes = httpWrapper.getData().toByteArray(); } WFCMessage.PullUserRequest request = WFCMessage.PullUserRequest.parseFrom(bytes); List requestList = request.getRequestList(); WFCMessage.PullUserResult.Builder builder = WFCMessage.PullUserResult.newBuilder(); logger.debug("requestList: " + requestList.size()); for (WFCMessage.UserRequest userRequest: requestList) { String uid = userRequest.getUid(); User usr = UserStore.getById(uid); logger.debug("UID====>: " + usr.getId()); logger.debug("Mobile====>: " + usr.getMobile()); logger.debug("Extra====>: " + usr.getExtra()); WFCMessage.UserResult userResult = usr.toWFCUserResult();//DataList.getUser(uid); builder.addResult(userResult); } byte[] resBytes = builder.build().toByteArray(); resultPool.setBytes(resBytes); } catch (Exception e) { e.printStackTrace(); } } public void loadRemoteMessage() throws Exception { // //头 // WFCMessage.LoadRemoteMessages request = (WFCMessage.LoadRemoteMessages) dataPool.getWFCMessage(WFCMessage.LoadRemoteMessages.class); // // //尾 // WFCMessage.PullMessageResult result = null; // byte[] bytes = result.toByteArray(); // // resultPool.setBytes(bytes); } public void getClient() { Client client = session.getClient(); resultPool.add(client); } public void getUserSetting() { WFCMessage.GetUserSettingResult.Builder builder = WFCMessage.GetUserSettingResult.newBuilder(); byte[] resBytes = builder.build().toByteArray(); resultPool.setBytes(ErrorCode.ERROR_CODE_NOT_MODIFIED.getCode(), resBytes); } public void putUserSetting() throws Exception { WFCMessage.ModifyUserSettingReq settingRequest = (WFCMessage.ModifyUserSettingReq) dataPool.getWFCMessage(WFCMessage.ModifyUserSettingReq.class); //System.out.println("aaa"); //WFCMessage.ModifyUserSettingReq settingRequest = dataPool.getWFCMessage(WFCMessage.ModifyUserSettingReq.class).getClass(); //IMHttpWrapper wrapper = dataPool.getHttpWrapper(); //byte[] bytes = wrapper.getData().toByteArray(); //WFCMessage.ModifyUserSettingReq settingRequest = WFCMessage.ModifyUserSettingReq.parseFrom(bytes); resultPool.setBytes(null); } public void setUserInfo() { } public void getBlacklist() { } public void blackListUser() { long[] head = new long[1]; try { //输入 WFCMessage.BlackUserRequest.Builder blackUserBuilder = WFCMessage.BlackUserRequest.newBuilder(); blackUserBuilder.setUid(dataPool.getString("targetUid")); blackUserBuilder.setStatus(dataPool.getInteger("status", 0)); WFCMessage.BlackUserRequest blackUserRequest = blackUserBuilder.build(); //输出 resultPool.setBytes(null); //发通知 String NotifyFriendRequestTopic = "FRN"; //publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, addFriendRequest.getTargetUid(), head[0], userId, addFriendRequest.getReason()); } catch (Exception e) { e.printStackTrace(); } } public void broadCastMessage() throws Exception { //头 WFCMessage.Message broadCastMessage = (WFCMessage.Message) dataPool.getWFCMessage(WFCMessage.Message.class); //尾 ByteBuf payload = Unpooled.buffer(); long messageId = MessageRecord.newMessageId(); payload.ensureWritable(20).writeLong(messageId).writeLong(10L); byte[] resBytes = payload.array(); resultPool.setBytes(resBytes); } public void channelListen() throws Exception { //头 WFCMessage.ListenChannel listenChannel = (WFCMessage.ListenChannel) dataPool.getWFCMessage(WFCMessage.ListenChannel.class); //尾 resultPool.setBytes(null); } public void channelSearch() throws Exception { //头 WFCMessage.SearchUserRequest listenChannel = (WFCMessage.SearchUserRequest) dataPool.getWFCMessage(WFCMessage.SearchUserRequest.class); //尾 List users = null; WFCMessage.SearchChannelResult.Builder builder = WFCMessage.SearchChannelResult.newBuilder(); builder.addAllChannel(users); builder.setKeyword(listenChannel.getKeyword()); byte[] resBytes = builder.build().toByteArray(); resultPool.setBytes(resBytes); } public void createChannel() throws Exception { //头 WFCMessage.ChannelInfo request = (WFCMessage.ChannelInfo) dataPool.getWFCMessage(WFCMessage.ChannelInfo.class); //尾 WFCMessage.ChannelInfo.Builder builder = request.toBuilder(); long update = System.currentTimeMillis(); request = builder.setUpdateDt(update).build(); WFCMessage.ModifyUserSettingReq modifyUserSettingReq = WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingMyChannels).setKey(request.getTargetId()).setValue("1").build(); byte[] resBytes = request.getTargetId().getBytes(); resultPool.setBytes(resBytes); } public void deleteFriend() throws Exception { long[] head = new long[2]; //头 WFCMessage.IDBuf request = (WFCMessage.IDBuf) dataPool.getWFCMessage(WFCMessage.IDBuf.class); //尾 resultPool.setBytes(null); } public void destoryUser() throws Exception { //头 WFCMessage.IDBuf request = (WFCMessage.IDBuf) dataPool.getWFCMessage(WFCMessage.IDBuf.class); WFCMessage.IDBuf.Builder requestBuilder = request.toBuilder(); WFCMessage.IDBuf idBuf = requestBuilder.setId(dataPool.getString("userId")).build(); //尾 resultPool.setBytes(null); } public void dismissGroup() throws Exception { //头 WFCMessage.DismissGroupRequest request = (WFCMessage.DismissGroupRequest) dataPool.getWFCMessage(WFCMessage.DismissGroupRequest.class); //尾 resultPool.setBytes(null); } public void destoryChannel() throws Exception { //头 WFCMessage.IDBuf request = (WFCMessage.IDBuf) dataPool.getWFCMessage(WFCMessage.IDBuf.class); //尾 resultPool.setBytes(null); } public void kickOffGroup() throws Exception { //头 WFCMessage.RemoveGroupMemberRequest request = (WFCMessage.RemoveGroupMemberRequest) dataPool.getWFCMessage(WFCMessage.RemoveGroupMemberRequest.class); //尾 resultPool.setBytes(null); } public void kickoffPCClient() throws Exception { //头 WFCMessage.IDBuf request = (WFCMessage.IDBuf) dataPool.getWFCMessage(WFCMessage.IDBuf.class); //尾 resultPool.setBytes(null); } public void modifyChannel() throws Exception { //头 WFCMessage.ModifyChannelInfo request = (WFCMessage.ModifyChannelInfo) dataPool.getWFCMessage(WFCMessage.ModifyChannelInfo.class); //尾 resultPool.setBytes(null); } public void quitChatRoom() throws Exception { //头 WFCMessage.IDBuf request = (WFCMessage.IDBuf) dataPool.getWFCMessage(WFCMessage.IDBuf.class); //尾 resultPool.setBytes(null); } public void setFriendAlias() throws Exception { //头 WFCMessage.AddFriendRequest request = (WFCMessage.AddFriendRequest) dataPool.getWFCMessage(WFCMessage.AddFriendRequest.class); //尾 resultPool.setBytes(null); } public void transferChannel() throws Exception { //头 WFCMessage.TransferChannel request = (WFCMessage.TransferChannel) dataPool.getWFCMessage(WFCMessage.TransferChannel.class); //尾 resultPool.setBytes(null); } public void userSearch() throws Exception { //头 WFCMessage.SearchUserRequest request = (WFCMessage.SearchUserRequest) dataPool.getWFCMessage(WFCMessage.SearchUserRequest.class); //尾 List users = user.searchUser(request.getKeyword(), request.getFuzzy(), request.getPage()); WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder(); builder.addAllEntry(users); byte[] bytes = builder.build().toByteArray(); resultPool.setBytes(bytes); } public void getToken() { Token token = session.getToken(); byte[] value = token.getFullValue(); resultPool.add(value); } public static void main(String[] args) throws Exception { String dataStr = "\\344\\275\\240\\344\\273\\254\\345\\267\\262\\347\\273\\217\\346\\210\\220\\344\\270\\272\\345\\245\\275\\345\\217\\213\\344\\272\\206\\357\\274\\214\\347\\216\\260\\345\\234\\250\\345\\217\\257\\344\\273\\245\\345\\274\\200\\345\\247\\213\\350\\201\\212\\345\\244\\251\\344\\272\\206"; if (! dataStr.contains("\\")) { System.out.println("1:" + dataStr);; } //不属于八进制内容的字符 StringBuilder oldBuffer = new StringBuilder(); //属于八进制的内容,转成十六进制后缓存在这里 StringBuilder hexBuffer = new StringBuilder(); for (int i = 0; i < dataStr.length(); i ++) { char c = dataStr.charAt(i); if (c != '\\') { oldBuffer.append(c); } //反斜杠往后3个为一组,组成了一个八进制数。例如\20710,其实是207组成了一个八进制数 else { char c1 = dataStr.charAt(i + 1); char c2 = dataStr.charAt(i + 2); char c3 = dataStr.charAt(i + 3); i += 3; //将八进制转换为十进制,再转换为十六进制 String hex = Integer.toHexString((Integer.valueOf("" + c1 + c2 + c3, 8))); //先缓存住,直到凑够三个字节 hexBuffer.append(hex); String hexString = hexBuffer.toString(); //utf8编码中,三个字节为一个汉字 if (hexString.length() == 6) { //凑够三个字节了,转成汉字后放入oldBuffer中 oldBuffer.append(hexStr2Str(hexString)); //凑够一个汉字了,清空缓存 hexBuffer = new StringBuilder(); } } } System.out.println("2:" + oldBuffer.toString()); System.out.println("3:" + EmojiParser.parseToHtmlDecimal(oldBuffer.toString())); // String str = "Here is a boy: :boy|type_6:!"; // System.out.println("原始字符为:\n" + str); // // System.out.println("to html:"); // String s = EmojiParser.parseToHtmlDecimal(str); // System.out.println(s); // // System.out.println("还原:"); // System.out.println(EmojiParser.parseToUnicode(s)); String str = "苍天厚土\uD83D\uDE01 \uD83D\uDC36 \uD83E\uDD14 \uD83D\uDC7B \uD83D\uDE92"; System.out.println("原始字符为:\n" + str); System.out.println("to aliases 之后:"); System.out.println(EmojiParser.parseToAliases(str)); System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.PARSE)); System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.REMOVE)); System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.IGNORE)); System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.IGNORE)); System.out.println(EmojiParser.parseToUnicode(str)); } private static String hexStr2Str(String hexStr) { String str = "0123456789abcdef"; char[] hexs = hexStr.toCharArray(); byte[] bytes = new byte[hexStr.length() / 2]; int n; for (int i = 0; i < bytes.length; i++) { n = str.indexOf(hexs[2 * i]) * 16; n += str.indexOf(hexs[2 * i + 1]); bytes[i] = (byte) (n & 0xff); } return new String(bytes, StandardCharsets.UTF_8); } }