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}