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<String, Record> mRecords = new ConcurrentHashMap<String, Record>();
|
private static ConcurrentHashMap<String, String> mOneLoginPhone = new ConcurrentHashMap<String, String>();;
|
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<String, String> excludeColumn = new HashMap<String, String>();
|
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<FriendData> friendDataList = new ArrayList<FriendData>();
|
|
List<FriendShip> 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<FriendData> 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<WFCMessage.FriendRequest> friendDatas = new ArrayList<WFCMessage.FriendRequest>();
|
List<FriendShip> 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<WFCMessage.Message> 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<WFCMessage.UserRequest> 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<WFCMessage.ChannelInfo> 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<WFCMessage.User> 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);
|
}
|
|
}
|