/* * Copyright (C) 2014-2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.mentions; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import im.actor.core.entity.Group; import im.actor.core.entity.GroupMember; import im.actor.core.entity.MentionFilterResult; import im.actor.core.entity.User; import im.actor.core.modules.AbsModule; import im.actor.core.modules.ModuleContext; import im.actor.core.util.StringMatch; import im.actor.core.util.StringMatcher; public class MentionsModule extends AbsModule { private static final int SEARCH_LIMIT = 30; public MentionsModule(ModuleContext context) { super(context); } public List<MentionFilterResult> findMentions(int gid, String query) { query = query.trim().toLowerCase(); ArrayList<MentionFilterResult> results = new ArrayList<MentionFilterResult>(); final Group group = groups().getValue(gid); GroupMember[] members = group.getMembers().toArray(new GroupMember[group.getMembers().size()]); Arrays.sort(members, (a, b) -> { User ua = users().getValue(a.getUid()); User ub = users().getValue(b.getUid()); return ua.getName().compareToIgnoreCase(ub.getName()); }); for (GroupMember member : members) { if (member.getUid() == myUid()) { continue; } User user = users().getValue(member.getUid()); boolean isNick = user.getNick() != null; String mention; String secondName; if (isNick) { mention = user.getNick(); secondName = user.getName(); } else { if (user.getLocalName() != null) { mention = user.getServerName(); secondName = user.getLocalName(); } else { mention = user.getName(); secondName = null; } } if (query.length() == 0) { results.add(new MentionFilterResult(user.getUid(), user.getAvatar(), isNick ? "@" + mention : mention, new ArrayList<>(), secondName, new ArrayList<>(), isNick)); } else { List<StringMatch> mentionMatches = StringMatcher.findMatches(mention, query); if (secondName != null) { List<StringMatch> secondNameMatches = StringMatcher.findMatches(secondName, query); if (mentionMatches.size() > 0 || secondNameMatches.size() > 0) { if (isNick) { List<StringMatch> nickMatches = new ArrayList<>(); for (StringMatch m : mentionMatches) { nickMatches.add(new StringMatch(m.getStart() + 1, m.getLength())); } mentionMatches = nickMatches; } results.add(new MentionFilterResult(user.getUid(), user.getAvatar(), isNick ? "@" + mention : mention, mentionMatches, secondName, secondNameMatches, isNick)); } } else { if (mentionMatches.size() > 0) { results.add(new MentionFilterResult(user.getUid(), user.getAvatar(), mention, mentionMatches, null, null, false)); } } } } if (results.size() > SEARCH_LIMIT) { results.clear(); } return results; } }