diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt index 83d1dd8003ace89b3a989da1ce637e46bf02d684..00d03abd5943a5c42b82ce40a66783ab3f08b770 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt @@ -78,12 +78,13 @@ class IrcChannel( } override fun initSetUserModes(usermodes: QVariantMap) { - _userModes.putAll( - usermodes.entries.map { (key, value) -> - network().newIrcUser(key) to value.value("") - }.toMap() - ) - live_userModes.onNext(_userModes) + val users = usermodes.map { (key, _) -> + network().newIrcUser(key) + } + val modes = usermodes.map { (_, value) -> + value.value("") + } + joinIrcUsersInternal(users, modes) } override fun initSetProperties(properties: QVariantMap) { diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt index e0be80108be439ec05e5a3857ac6a091226277ab..5b981d535bc1285e800c321fa60096401e1e7f8d 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt @@ -9,6 +9,7 @@ import de.kuschku.libquassel.session.SignalProxy import de.kuschku.libquassel.util.helpers.getOr import de.kuschku.libquassel.util.helpers.serializeString import de.kuschku.libquassel.util.irc.HostmaskHelper +import de.kuschku.libquassel.util.irc.IrcCaseMappers import io.reactivex.subjects.BehaviorSubject import java.nio.ByteBuffer import java.nio.charset.Charset @@ -47,6 +48,9 @@ class Network constructor( else -> "#&!+".contains(channelName[0]) } + val caseMapper: IrcCaseMappers.IrcCaseMapper + get() = IrcCaseMappers[support("CASEMAPPING")] + /** * Checks if the target counts as a STATUSMSG * @@ -320,7 +324,7 @@ class Network constructor( } fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap()): IrcUser { - val nick = HostmaskHelper.nick(hostMask).toLowerCase(Locale.US) + val nick = caseMapper.toLowerCase(HostmaskHelper.nick(hostMask)) val user = ircUser(nick) return if (user == null) { val ircUser = IrcUser(hostMask, this, proxy) @@ -340,7 +344,7 @@ class Network constructor( } } - fun ircUser(nickName: String?) = _ircUsers[nickName?.toLowerCase(Locale.US)] + fun ircUser(nickName: String?) = _ircUsers[nickName?.let(caseMapper::toLowerCase)] fun liveIrcUser(nickName: String?) = live_ircUsers.map { ircUser( nickName @@ -359,7 +363,7 @@ class Network constructor( ircChannel.initialized = true } proxy.synchronize(ircChannel) - _ircChannels[channelName.toLowerCase(Locale.US)] = ircChannel + _ircChannels[caseMapper.toLowerCase(channelName)] = ircChannel live_ircChannels.onNext(_ircChannels) super.addIrcChannel(channelName) return ircChannel @@ -368,7 +372,7 @@ class Network constructor( } } - fun ircChannel(channelName: String?) = _ircChannels[channelName?.toLowerCase(Locale.US)] + fun ircChannel(channelName: String?) = _ircChannels[channelName?.let(caseMapper::toLowerCase)] fun liveIrcChannel(channelName: String?) = live_ircChannels.map { ircChannel( channelName @@ -839,7 +843,7 @@ class Network constructor( } fun updateNickFromMask(mask: String): IrcUser { - val nick = HostmaskHelper.nick(mask).toLowerCase(Locale.US) + val nick = caseMapper.toLowerCase(HostmaskHelper.nick(mask)) val user = _ircUsers[nick] return if (user != null) { user.updateHostmask(mask) @@ -850,9 +854,9 @@ class Network constructor( } override fun ircUserNickChanged(old: String, new: String) { - val value = _ircUsers.remove(old.toLowerCase(Locale.US)) + val value = _ircUsers.remove(caseMapper.toLowerCase(old)) if (value != null) { - _ircUsers[new.toLowerCase(Locale.US)] = value + _ircUsers[caseMapper.toLowerCase(new)] = value } } @@ -867,12 +871,12 @@ class Network constructor( } fun removeIrcUser(user: IrcUser) { - _ircUsers.remove(user.nick()) + _ircUsers.remove(caseMapper.toLowerCase(user.nick())) live_ircUsers.onNext(_ircUsers) } fun removeIrcChannel(channel: IrcChannel) { - _ircChannels.remove(channel.name()) + _ircChannels.remove(caseMapper.toLowerCase(channel.name())) live_ircChannels.onNext(_ircChannels) }