1package eu.siacs.conversations.entities;
  2
  3import com.google.common.base.Objects;
  4import com.google.common.base.Strings;
  5import com.google.common.collect.ComparisonChain;
  6import com.google.common.collect.Iterables;
  7import com.google.common.primitives.Ints;
  8import eu.siacs.conversations.services.AvatarService;
  9import eu.siacs.conversations.utils.LanguageUtils;
 10import eu.siacs.conversations.utils.UIHelper;
 11import eu.siacs.conversations.xmpp.Jid;
 12import im.conversations.android.xmpp.model.disco.info.InfoQuery;
 13
 14public class Room implements AvatarService.Avatarable, Comparable<Room> {
 15
 16    public final String address;
 17    public final String name;
 18    public final String description;
 19    public final String language;
 20    public final int numberOfUsers;
 21
 22    public Room(
 23            final String address,
 24            final String name,
 25            final String description,
 26            final String language,
 27            final Integer numberOfUsers) {
 28        this.address = address;
 29        this.name = name;
 30        this.description = description;
 31        this.language = language;
 32        this.numberOfUsers = numberOfUsers == null ? 0 : numberOfUsers;
 33    }
 34
 35    public String getName() {
 36        if (Strings.isNullOrEmpty(name)) {
 37            final var jid = Jid.ofOrInvalid(address);
 38            return jid.getLocal();
 39        } else {
 40            return name;
 41        }
 42    }
 43
 44    public String getDescription() {
 45        return description;
 46    }
 47
 48    public Jid getRoom() {
 49        try {
 50            return Jid.of(address);
 51        } catch (IllegalArgumentException e) {
 52            return null;
 53        }
 54    }
 55
 56    public String getLanguage() {
 57        return LanguageUtils.convert(language);
 58    }
 59
 60    @Override
 61    public int getAvatarBackgroundColor() {
 62        Jid room = getRoom();
 63        return UIHelper.getColorForName(room != null ? room.asBareJid().toString() : name);
 64    }
 65
 66    @Override
 67    public String getAvatarName() {
 68        return name;
 69    }
 70
 71    @Override
 72    public boolean equals(Object o) {
 73        if (this == o) return true;
 74        if (o == null || getClass() != o.getClass()) return false;
 75        Room room = (Room) o;
 76        return Objects.equal(address, room.address)
 77                && Objects.equal(name, room.name)
 78                && Objects.equal(description, room.description);
 79    }
 80
 81    @Override
 82    public int hashCode() {
 83        return Objects.hashCode(address, name, description);
 84    }
 85
 86    public boolean contains(String needle) {
 87        return Strings.nullToEmpty(name).contains(needle)
 88                || Strings.nullToEmpty(description).contains(needle)
 89                || Strings.nullToEmpty(address).contains(needle);
 90    }
 91
 92    @Override
 93    public int compareTo(Room o) {
 94        return ComparisonChain.start()
 95                .compare(o.numberOfUsers, numberOfUsers)
 96                .compare(Strings.nullToEmpty(name), Strings.nullToEmpty(o.name))
 97                .compare(Strings.nullToEmpty(address), Strings.nullToEmpty(o.address))
 98                .result();
 99    }
100
101    public static Room of(final Jid address, InfoQuery query) {
102        final var identity = Iterables.getFirst(query.getIdentities(), null);
103        final var ri =
104                query.getServiceDiscoveryExtension("http://jabber.org/protocol/muc#roominfo");
105        final String name = identity == null ? null : identity.getIdentityName();
106        String roomName = ri == null ? null : ri.getValue("muc#roomconfig_roomname");
107        String description = ri == null ? null : ri.getValue("muc#roominfo_description");
108        String language = ri == null ? null : ri.getValue("muc#roominfo_lang");
109        String occupants = ri == null ? null : ri.getValue("muc#roominfo_occupants");
110        final Integer numberOfUsers = Ints.tryParse(Strings.nullToEmpty(occupants));
111
112        return new Room(
113                address.toString(),
114                Strings.isNullOrEmpty(roomName) ? name : roomName,
115                description,
116                language,
117                numberOfUsers);
118    }
119}