Skip to content
Snippets Groups Projects
Verified Commit 762cebb0 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Fixes additional issues with WHOIS functionality

parent 0ea84be6
No related branches found
No related tags found
No related merge requests found
/*
* Quasseldroid - Quassel client for Android
*
* Copyright (c) 2018 Janne Koschinski
* Copyright (c) 2018 The Quassel Project
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3 as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.kuschku.quasseldroid.ui.chat.info.user
import de.kuschku.libquassel.quassel.syncables.Network
data class IrcUserInfo(
val networkId: Int,
val nick: String,
val user: String? = null,
val host: String? = null,
val account: String? = null,
val server: String? = null,
val realName: String? = null,
val isAway: Boolean? = false,
val awayMessage: String? = null,
val network: Network? = null,
val knownToCore: Boolean = false
)
...@@ -32,9 +32,12 @@ import android.widget.Toast ...@@ -32,9 +32,12 @@ import android.widget.Toast
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.protocol.Buffer_Type
import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.IrcUser import de.kuschku.libquassel.quassel.syncables.IrcUser
import de.kuschku.libquassel.util.IrcUserUtils import de.kuschku.libquassel.util.IrcUserUtils
import de.kuschku.libquassel.util.Optional
import de.kuschku.libquassel.util.helpers.nullIf import de.kuschku.libquassel.util.helpers.nullIf
import de.kuschku.libquassel.util.helpers.value
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.ChatActivity import de.kuschku.quasseldroid.ui.chat.ChatActivity
...@@ -130,31 +133,55 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -130,31 +133,55 @@ class UserInfoFragment : ServiceBoundFragment() {
getColor(0, 0) getColor(0, 0)
} }
val networkId = arguments?.getInt("networkId") val networkId2 = arguments?.getInt("networkId")
val nickName = arguments?.getString("nick") val nickName2 = arguments?.getString("nick")
combineLatest(viewModel.session, viewModel.networks).switchMap { (sessionOptional, networks) -> combineLatest(viewModel.session, viewModel.networks).switchMap { (sessionOptional, networks) ->
fun processUser(user: IrcUser, info: BufferInfo? = null) = when {
user == IrcUser.NULL && info != null -> Optional.of(IrcUserInfo(
info.networkId,
info.bufferName ?: ""
))
user == IrcUser.NULL -> Optional.empty()
else -> Optional.of(IrcUserInfo(
networkId = user.network().networkId(),
nick = user.nick(),
user = user.user(),
host = user.host(),
account = user.account(),
server = user.server(),
realName = user.realName(),
isAway = user.isAway(),
awayMessage = user.awayMessage(),
network = user.network(),
knownToCore = true
))
}
if (openBuffer == true) { if (openBuffer == true) {
val session = sessionOptional?.orNull() val session = sessionOptional?.orNull()
val bufferSyncer = session?.bufferSyncer val bufferSyncer = session?.bufferSyncer
val bufferInfo = bufferSyncer?.bufferInfo(arguments?.getInt("bufferId") ?: -1) val bufferInfo = bufferSyncer?.bufferInfo(arguments?.getInt("bufferId") ?: -1)
bufferInfo?.let { bufferInfo?.let {
networks[it.networkId]?.liveIrcUser(it.bufferName) networks[it.networkId]?.liveIrcUser(it.bufferName)?.switchMap(IrcUser::updates)?.map {
processUser(it, bufferInfo)
}
} }
} else { } else {
networks[networkId]?.liveIrcUser(nickName) networks[networkId2]
} ?: Observable.just(IrcUser.NULL) ?.liveIrcUser(nickName2)
}.filter { ?.switchMap(IrcUser::updates)
it != IrcUser.NULL ?.map { user -> processUser(user) }
}.switchMap(IrcUser::updates).toLiveData().observe(this, Observer { user -> } ?: Observable.just(IrcUser.NULL).map { user -> processUser(user) }
if (user != null) { }.toLiveData().observe(this, Observer {
val senderColorIndex = IrcUserUtils.senderColor(user.nick()) val processUser = { user: IrcUserInfo ->
val rawInitial = user.nick().trimStart(*IGNORED_CHARS).firstOrNull() val senderColorIndex = IrcUserUtils.senderColor(user.nick)
?: user.nick().firstOrNull() val rawInitial = user.nick.trimStart(*IGNORED_CHARS).firstOrNull()
?: user.nick.firstOrNull()
val initial = rawInitial?.toUpperCase().toString() val initial = rawInitial?.toUpperCase().toString()
val senderColor = when (messageSettings.colorizeNicknames) { val senderColor = when (messageSettings.colorizeNicknames) {
MessageSettings.ColorizeNicknamesMode.ALL -> senderColors[senderColorIndex] MessageSettings.ColorizeNicknamesMode.ALL -> senderColors[senderColorIndex]
MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE -> MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE ->
if (user.network().isMyNick(user.nick())) selfColor if (user.network?.isMyNick(user.nick) == true) selfColor
else senderColors[senderColorIndex] else senderColors[senderColorIndex]
MessageSettings.ColorizeNicknamesMode.NONE -> selfColor MessageSettings.ColorizeNicknamesMode.NONE -> selfColor
} }
...@@ -165,59 +192,62 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -165,59 +192,62 @@ class UserInfoFragment : ServiceBoundFragment() {
crop = false crop = false
) )
nick.text = user.nick() nick.text = user.nick
realName.text = contentFormatter.formatContent(user.realName()) realName.text = contentFormatter.formatContent(user.realName ?: "")
realName.visibleIf(user.realName().isNotBlank() && user.realName() != user.nick()) realName.visibleIf(!user.realName.isNullOrBlank() && user.realName != user.nick)
awayMessage.text = user.awayMessage().nullIf { it.isBlank() } ?: SpannableString(getString(R.string.label_no_away_message)).apply { awayMessage.text = user.awayMessage.nullIf { it.isNullOrBlank() } ?: SpannableString(
getString(
R.string.label_no_away_message)).apply {
setSpan(IrcItalicSpan(), 0, length, 0) setSpan(IrcItalicSpan(), 0, length, 0)
} }
awayContainer.visibleIf(user.isAway()) awayContainer.visibleIf(user.isAway == true)
account.text = user.account() account.text = user.account
accountContainer.visibleIf(user.account().isNotBlank()) accountContainer.visibleIf(!user.account.isNullOrBlank())
ident.text = user.user() ident.text = user.user
identContainer.visibleIf(user.user().isNotBlank()) identContainer.visibleIf(!user.user.isNullOrBlank())
host.text = user.host() host.text = user.host
hostContainer.visibleIf(user.host().isNotBlank()) hostContainer.visibleIf(!user.host.isNullOrBlank())
server.text = user.server() server.text = user.server
serverContainer.visibleIf(user.server().isNotBlank()) serverContainer.visibleIf(!user.server.isNullOrBlank())
}
}) actionWhois.visibleIf(user.knownToCore)
actionQuery.setOnClickListener { actionQuery.setOnClickListener {
viewModel.session { viewModel.session.value?.orNull()?.let { session ->
it.orNull()?.let { session ->
val info = session.bufferSyncer?.find( val info = session.bufferSyncer?.find(
bufferName = nickName, bufferName = user.nick,
networkId = networkId, networkId = user.networkId,
type = Buffer_Type.of(Buffer_Type.QueryBuffer) type = Buffer_Type.of(Buffer_Type.QueryBuffer)
) )
if (info != null) { if (info != null) {
ChatActivity.launch(requireContext(), bufferId = info.bufferId) ChatActivity.launch(requireContext(),
bufferId = info.bufferId)
} else { } else {
viewModel.allBuffers.map { viewModel.allBuffers.map {
listOfNotNull(it.find { listOfNotNull(it.find {
it.networkId == networkId && it.bufferName == nickName it.networkId == user.networkId && it.bufferName == user.nick
}) })
}.filter { }.filter {
it.isNotEmpty() it.isNotEmpty()
}.firstElement().toLiveData().observe(this, Observer { }.firstElement().toLiveData().observe(this, Observer {
it?.firstOrNull()?.let { info -> it?.firstOrNull()?.let { info ->
ChatActivity.launch(requireContext(), bufferId = info.bufferId) ChatActivity.launch(requireContext(),
bufferId = info.bufferId)
} }
}) })
session.bufferSyncer?.find( session.bufferSyncer?.find(
networkId = networkId, networkId = user.networkId,
type = Buffer_Type.of(Buffer_Type.StatusBuffer) type = Buffer_Type.of(Buffer_Type.StatusBuffer)
)?.let { statusInfo -> )?.let { statusInfo ->
session.rpcHandler?.sendInput(statusInfo, "/query $nickName") session.rpcHandler?.sendInput(statusInfo,
} "/query ${user.nick}")
} }
} }
} }
...@@ -228,21 +258,24 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -228,21 +258,24 @@ class UserInfoFragment : ServiceBoundFragment() {
} }
actionMention.setOnClickListener { actionMention.setOnClickListener {
ChatActivity.launch(requireContext(), sharedText = "$nickName: ") ChatActivity.launch(requireContext(), sharedText = "${user.nick}: ")
} }
actionWhois.setOnClickListener { actionWhois.setOnClickListener {
viewModel.session { viewModel.session {
it.orNull()?.let { session -> it.orNull()?.let { session ->
session.bufferSyncer?.find( session.bufferSyncer?.find(
networkId = networkId, networkId = user.networkId,
type = Buffer_Type.of(Buffer_Type.StatusBuffer) type = Buffer_Type.of(Buffer_Type.StatusBuffer)
)?.let { statusInfo -> )?.let { statusInfo ->
session.rpcHandler?.sendInput(statusInfo, "/whois $nickName $nickName") session.rpcHandler?.sendInput(statusInfo, "/whois ${user.nick} ${user.nick}")
}
} }
} }
} }
} }
it?.orNull()?.let(processUser)
})
actionMention.visibleIf(arguments?.getBoolean("openBuffer") == false) actionMention.visibleIf(arguments?.getBoolean("openBuffer") == false)
......
...@@ -24,6 +24,7 @@ import de.kuschku.libquassel.util.irc.HostmaskHelper ...@@ -24,6 +24,7 @@ import de.kuschku.libquassel.util.irc.HostmaskHelper
import de.kuschku.libquassel.util.irc.IrcCaseMappers import de.kuschku.libquassel.util.irc.IrcCaseMappers
import de.kuschku.quasseldroid.persistence.QuasselDatabase import de.kuschku.quasseldroid.persistence.QuasselDatabase
import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.info.user.IrcUserInfo
import de.kuschku.quasseldroid.util.Patterns import de.kuschku.quasseldroid.util.Patterns
import de.kuschku.quasseldroid.util.backport.codec.Hex import de.kuschku.quasseldroid.util.backport.codec.Hex
import de.kuschku.quasseldroid.util.helper.letIf import de.kuschku.quasseldroid.util.helper.letIf
...@@ -37,8 +38,7 @@ object AvatarHelper { ...@@ -37,8 +38,7 @@ object AvatarHelper {
size: Int? = null) = listOfNotNull( size: Int? = null) = listOfNotNull(
message.avatarUrl.notBlank()?.let { listOf(Avatar.NativeAvatar(it)) }, message.avatarUrl.notBlank()?.let { listOf(Avatar.NativeAvatar(it)) },
settings.showIRCCloudAvatars.letIf { settings.showIRCCloudAvatars.letIf {
ircCloudFallback(HostmaskHelper.user(message.sender), ircCloudFallback(HostmaskHelper.user(message.sender), size)
size)
}, },
settings.showGravatarAvatars.letIf { settings.showGravatarAvatars.letIf {
gravatarFallback(message.realName, size) gravatarFallback(message.realName, size)
...@@ -52,8 +52,7 @@ object AvatarHelper { ...@@ -52,8 +52,7 @@ object AvatarHelper {
size: Int? = null) = listOfNotNull( size: Int? = null) = listOfNotNull(
message.avatarUrl.notBlank()?.let { listOf(Avatar.NativeAvatar(it)) }, message.avatarUrl.notBlank()?.let { listOf(Avatar.NativeAvatar(it)) },
settings.showIRCCloudAvatars.letIf { settings.showIRCCloudAvatars.letIf {
ircCloudFallback(HostmaskHelper.user(message.sender), ircCloudFallback(HostmaskHelper.user(message.sender), size)
size)
}, },
settings.showGravatarAvatars.letIf { settings.showGravatarAvatars.letIf {
gravatarFallback(message.realName, size) gravatarFallback(message.realName, size)
...@@ -65,16 +64,25 @@ object AvatarHelper { ...@@ -65,16 +64,25 @@ object AvatarHelper {
fun avatar(settings: MessageSettings, user: IrcUserItem, size: Int? = null) = listOfNotNull( fun avatar(settings: MessageSettings, user: IrcUserItem, size: Int? = null) = listOfNotNull(
settings.showIRCCloudAvatars.letIf { settings.showIRCCloudAvatars.letIf {
ircCloudFallback(HostmaskHelper.user(user.hostmask), ircCloudFallback(HostmaskHelper.user(user.hostmask), size)
size)
}, },
settings.showGravatarAvatars.letIf { settings.showGravatarAvatars.letIf {
gravatarFallback(user.realname.toString(), gravatarFallback(user.realname.toString(), size)
size)
}, },
settings.showMatrixAvatars.letIf { settings.showMatrixAvatars.letIf {
matrixFallback(user.realname.toString(), matrixFallback(user.realname.toString(), size)
size) }
).flatten()
fun avatar(settings: MessageSettings, user: IrcUserInfo, size: Int? = null) = listOfNotNull(
settings.showIRCCloudAvatars.letIf {
ircCloudFallback(user.user ?: "", size)
},
settings.showGravatarAvatars.letIf {
gravatarFallback(user.realName ?: "", size)
},
settings.showMatrixAvatars.letIf {
matrixFallback(user.realName ?: "", size)
} }
).flatten() ).flatten()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment