package com.netease.nim.uikit.session.helper;
import android.text.TextUtils;
import com.netease.nim.uikit.NimUIKit;
import com.netease.nim.uikit.R;
import com.netease.nim.uikit.cache.TeamDataCache;
import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.team.constant.TeamAllMuteModeEnum;
import com.netease.nimlib.sdk.team.constant.TeamFieldEnum;
import com.netease.nimlib.sdk.team.constant.TeamTypeEnum;
import com.netease.nimlib.sdk.team.constant.VerifyTypeEnum;
import com.netease.nimlib.sdk.team.model.MemberChangeAttachment;
import com.netease.nimlib.sdk.team.model.MuteMemberAttachment;
import com.netease.nimlib.sdk.team.model.Team;
import com.netease.nimlib.sdk.team.model.UpdateTeamAttachment;
import java.util.List;
import java.util.Map;
/**
* 系统消息描述文本构造器。主要是将各个系统消息转换为显示的文本内容。<br>
* Created by huangjun on 2015/3/11.
*/
public class TeamNotificationHelper {
private static ThreadLocal<String> teamId = new ThreadLocal<>();
public static String getMsgShowText(final IMMessage message) {
String content = "";
String messageTip = message.getMsgType().getSendMessageTip();
if (messageTip.length() > 0) {
content += "[" + messageTip + "]";
} else {
if (message.getSessionType() == SessionTypeEnum.Team && message.getAttachment() != null) {
content += getTeamNotificationText(message, message.getSessionId());
} else {
content += message.getContent();
}
}
return content;
}
public static String getTeamNotificationText(IMMessage message, String tid) {
return getTeamNotificationText(message.getSessionId(), message.getFromAccount(), (NotificationAttachment) message.getAttachment());
}
public static String getTeamNotificationText(String tid, String fromAccount, NotificationAttachment attachment) {
teamId.set(tid);
String text = buildNotification(tid, fromAccount, attachment);
teamId.set(null);
return text;
}
private static String buildNotification(String tid, String fromAccount, NotificationAttachment attachment) {
String text;
switch (attachment.getType()) {
case InviteMember:
text = buildInviteMemberNotification(((MemberChangeAttachment) attachment), fromAccount);
break;
case KickMember:
text = buildKickMemberNotification(((MemberChangeAttachment) attachment));
break;
case LeaveTeam:
text = buildLeaveTeamNotification(fromAccount);
break;
case DismissTeam:
text = buildDismissTeamNotification(fromAccount);
break;
case UpdateTeam:
text = buildUpdateTeamNotification(tid, fromAccount, (UpdateTeamAttachment) attachment);
break;
case PassTeamApply:
text = buildManagerPassTeamApplyNotification((MemberChangeAttachment) attachment);
break;
case TransferOwner:
text = buildTransferOwnerNotification(fromAccount, (MemberChangeAttachment) attachment);
break;
case AddTeamManager:
text = buildAddTeamManagerNotification((MemberChangeAttachment) attachment);
break;
case RemoveTeamManager:
text = buildRemoveTeamManagerNotification((MemberChangeAttachment) attachment);
break;
case AcceptInvite:
text = buildAcceptInviteNotification(fromAccount, (MemberChangeAttachment) attachment);
break;
case MuteTeamMember:
text = buildMuteTeamNotification((MuteMemberAttachment) attachment);
break;
default:
text = getTeamMemberDisplayName(fromAccount) + ": unknown message";
break;
}
return text;
}
private static String getTeamMemberDisplayName(String account) {
return TeamDataCache.getInstance().getTeamMemberDisplayNameYou(teamId.get(), account);
}
private static String buildMemberListString(List<String> members, String fromAccount) {
StringBuilder sb = new StringBuilder();
for (String account : members) {
if (!TextUtils.isEmpty(fromAccount) && fromAccount.equals(account)) {
continue;
}
sb.append(getTeamMemberDisplayName(account));
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
private static String buildInviteMemberNotification(MemberChangeAttachment a, String fromAccount) {
StringBuilder sb = new StringBuilder();
String selfName = getTeamMemberDisplayName(fromAccount);
sb.append(selfName);
sb.append("邀请 ");
sb.append(buildMemberListString(a.getTargets(), fromAccount));
Team team = TeamDataCache.getInstance().getTeamById(teamId.get());
if (team.getType() == TeamTypeEnum.Advanced) {
sb.append(" 加入群");
} else {
sb.append(" 加入讨论组");
}
return sb.toString();
}
private static String buildKickMemberNotification(MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(buildMemberListString(a.getTargets(), null));
Team team = TeamDataCache.getInstance().getTeamById(teamId.get());
if (team.getType() == TeamTypeEnum.Advanced) {
sb.append(" 已被移出群");
} else {
sb.append(" 已被移出讨论组");
}
return sb.toString();
}
private static String buildLeaveTeamNotification(String fromAccount) {
String tip;
Team team = TeamDataCache.getInstance().getTeamById(teamId.get());
if (team.getType() == TeamTypeEnum.Advanced) {
tip = " 离开了群";
} else {
tip = " 离开了讨论组";
}
return getTeamMemberDisplayName(fromAccount) + tip;
}
private static String buildDismissTeamNotification(String fromAccount) {
return getTeamMemberDisplayName(fromAccount) + " 解散了群";
}
private static String buildUpdateTeamNotification(String tid, String account, UpdateTeamAttachment a) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<TeamFieldEnum, Object> field : a.getUpdatedFields().entrySet()) {
if (field.getKey() == TeamFieldEnum.Name) {
sb.append("名称被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.Introduce) {
sb.append("群介绍被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.Announcement) {
sb.append(TeamDataCache.getInstance().getTeamMemberDisplayNameYou(tid, account) + " 修改了群公告");
} else if (field.getKey() == TeamFieldEnum.VerifyType) {
VerifyTypeEnum type = (VerifyTypeEnum) field.getValue();
String authen = "群身份验证权限更新为";
if (type == VerifyTypeEnum.Free) {
sb.append(authen + NimUIKit.getContext().getString(R.string.team_allow_anyone_join));
} else if (type == VerifyTypeEnum.Apply) {
sb.append(authen + NimUIKit.getContext().getString(R.string.team_need_authentication));
} else {
sb.append(authen + NimUIKit.getContext().getString(R.string.team_not_allow_anyone_join));
}
} else if (field.getKey() == TeamFieldEnum.Extension) {
sb.append("群扩展字段被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.Ext_Server) {
sb.append("群扩展字段(服务器)被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.ICON) {
sb.append("群头像已更新");
} else if (field.getKey() == TeamFieldEnum.InviteMode) {
sb.append("群邀请他人权限被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.TeamUpdateMode) {
sb.append("群资料修改权限被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.BeInviteMode) {
sb.append("群被邀请人身份验证权限被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.TeamExtensionUpdateMode) {
sb.append("群扩展字段修改权限被更新为 " + field.getValue());
} else if (field.getKey() == TeamFieldEnum.AllMute) {
TeamAllMuteModeEnum teamAllMuteModeEnum = (TeamAllMuteModeEnum) field.getValue();
if (teamAllMuteModeEnum == TeamAllMuteModeEnum.Cancel) {
sb.append("取消群全员禁言");
} else {
sb.append("群全员禁言");
}
} else {
sb.append("群" + field.getKey() + "被更新为 " + field.getValue());
}
sb.append("\r\n");
}
if (sb.length() < 2) {
return "未知通知";
}
return sb.delete(sb.length() - 2, sb.length()).toString();
}
private static String buildManagerPassTeamApplyNotification(MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append("管理员通过用户 ");
sb.append(buildMemberListString(a.getTargets(), null));
sb.append(" 的入群申请");
return sb.toString();
}
private static String buildTransferOwnerNotification(String from, MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(getTeamMemberDisplayName(from));
sb.append(" 将群转移给 ");
sb.append(buildMemberListString(a.getTargets(), null));
return sb.toString();
}
private static String buildAddTeamManagerNotification(MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(buildMemberListString(a.getTargets(), null));
sb.append(" 被任命为管理员");
return sb.toString();
}
private static String buildRemoveTeamManagerNotification(MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(buildMemberListString(a.getTargets(), null));
sb.append(" 被撤销管理员身份");
return sb.toString();
}
private static String buildAcceptInviteNotification(String from, MemberChangeAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(getTeamMemberDisplayName(from));
sb.append(" 接受了 ").append(buildMemberListString(a.getTargets(), null)).append(" 的入群邀请");
return sb.toString();
}
private static String buildMuteTeamNotification(MuteMemberAttachment a) {
StringBuilder sb = new StringBuilder();
sb.append(buildMemberListString(a.getTargets(), null));
sb.append("被管理员");
sb.append(a.isMute() ? "禁言" : "解除禁言");
return sb.toString();
}
}