Twitch4K
O Twitch4K é uma biblioteca Kotlin que tem como objetivo principal facilitar a criação de aplicações de Chat e Chatbots voltadas para a plataforma de stream Twitch.
Recursos
O Twitch4K é uma biblioteca Kotlin que tem como objetivo principal facilitar a criação de aplicações de Chat e Chatbots voltadas para a plataforma de stream Twitch.
Android Chat SDK Overview Applozic brings real-time engagement with chat, video, and voice to your web, mobile, and conversational apps. We power emer
Kommunicate Android Chat SDK for Customer Support An Open Source Android Live Chat SDK for Customer Support Overview Kommunicate provides open source
Wurst Plus 3 Chat Server This is a server for wurst + 3! Ideas/TODO Friend requests Secure key for clients DMs Global Chat Friend's Online Color/rainb
A hybrid chat android application based on the features of Instagram and Whatsapp having UI just as Telegram.
Tremola README Tremola is a Secure Scuttlebutt (SSB) client for Android that only supports private chat. Tremola aims at having the same functionality
Fire Chat A one-to-one chat app (similar to WhatsApp) built using Kotlin and Firebase. Sceenshots Whenever a user will enter the app a registration pa
💙 Android sample Avengers chat application using Stream Chat SDK based on MVVM (ViewModel, Coroutines, Room, Hilt, Repository) architecture.
Jetchat sample Jetchat is a sample chat app built with Jetpack Compose. To try out this sample app, you need to use Android Studio Arctic Fox You can
HGLabor-Log-Extractor Das Programm durchläuft einmalig deine Minecraft-Logs und sammelt alle Nachrichten heraus, die auf HGLabor geschrieben wurden. K
Apenas algumas separações de código em métodos, isolando algumas responsabilidades como a criação do socket e das threads dos handlers
Também utilizado o método .also
do kotlin, funciona igual o .apply
porém sem a troca do contexto this, ou seja, o código dentro do bloco { }, tem referencia ao próprio objeto porém com "it", exemplo dos 2 usos no método da criação do socket...
// com o `apply`, dentro do bloco { }, o "this" é a referencia do próprio objeto (socket)
Socket().apply {
receiveBufferSize = 4096
}
// com o `also`, dentro do bloco { }, o "this" é a referência da classe que está executando o código (no caso o Twitch4k)
socket.also {
it.connect( ... )
}
Mesma alteração com relação ao uso do .also
(e um toque pessoal usando when
ao invés do if else
)
Um ponto diferenciado do .also
com relação ao .apply
é a possibilidade de "nomear" a referencia
// Sem nomear a referencia
MessageHandlerDiscovery().also { it.onReceivedChatMessageListener = onReceivedChatMessageListener }
// Nomeando a referencia
MessageHandlerDiscovery().also { discovery ->
discovery.onReceivedChatMessageListener = onReceivedChatMessageListener
}
Apenas remoção do in ArrayOf(...)
para os casos em que se testa apenas 1 string
Neste caso, como já temos de qual channel
que veio a mensagem, já estou passando direto para o Chat, assim quem for implementar o bot não precisará passar o channel
para o send(message: String)
Ficando a chamada ao chat desta maneira
chat.send("Hello World")
Sem a necessidade de fazer isto
chat.send(message.channel, "Hello World")
Neste foi implementado a solução para o Chat descrito acima
Transformando a interface em uma Functional Interface
Assim como no java tem a anotação @FunctionalInterface
para as interfaces, no Kotlin tem a fun interface
, o que isto quer dizer?
Garante que a interface terá apenas um método a ser implementado (abstrato) e isto permite a implementação da interface com lambda (sem a necessidade de criar uma classe para implementar o método, mas também não tira essa possibilidade)
Exemplo de mudança: Antes
class BotMessageListener : OnReceivedChatMessageListener {
fun onReceived(message: ChatMessage, chat: Chat) {
if (message.text.startsWith("test")) {
chat.send("Hello World")
}
}
}
fun main() {
val t4k = Twitch4K(...)
t4k.setOnReceivedChatMessageListener(BotMessageListener())
t4k.start()
}
Depois
fun main() {
val t4k = Twitch4K(...)
t4k.setOnReceivedChatMessageListener { message, chat ->
if (message.text.startsWith("test")) {
chat.send("Hello World")
}
}
t4k.start()
}
A ideia neste PR é apenas dar sugestões de implementações:
Como são muitos os códigos que determinam o tipo de mensagem a ser tratada, deixar esta lógica dentro do TwitchHandler pode deixar esta classe muito extensa a longo prazo, visto que as comunicações ainda estão em desenvolvimento.
Uma ideia é criar algo similar a um "service discovery" ou "strategy pattern", é ondeo MessageHandler
entra:
Criei a interface MessageHandler que contém o "identificador" de cada handler (neste caso pode ser vários, caso um identificador pode ter muito a ver com outro, usei desta forma devido aos comandos numéricos
"002", "003", "004", "353", "366", "372", "375", "376"
e também pelos comandos "USERSTATE" e "ROOMSTATE" que já estavam agrupados
Criei este abstract pois notei que todos os handlers utilizam o mesmo logger com o mesmo ID, porém, pode-se remover este cara e criar um logger pra cada handler (seria mais facil pra identificar onde está o erro/info talvez)
Cada Handler precisa implementar o "code" para o discovery conseguir identificar o handler
E o método handle
que será usado para executar o comando com o RawMessage
Dentro do discovery foi criada a instancia de TODOS os handlers e adicionado a uma lista, é essa lista que o discovery percorrerá buscando pelo "code" enviado pela Twitch e identificará como executar a mensagem RawMessage
Neste caso apenas usei a validação de NullPointer direto na criação do objeto, isto fará o mesmo que validar se o raw
e command
é nulo com if como estava anteriormente
RawMessage(
raw = this.raw ?: throw NullPointerException("A propriedade raw não pode ser nula"),
command = this.command ?: throw NullPointerException("A propriedade command não pode ser nula"),
...
)
Foi criado uma extension function do Boolean pra transformar o bool em texto lido por humanos
Boolean.toHumanReadable
: reduzindo duplicação de código (mesmo if pra vários lugares)
E no isFollowersOnlyMode
, fiz a conversão pra IntOrNull
, uma forma talvez mais segura de validar se é followersOnly devido a flexibilidade do valor ser -1, 0, etc... "vai que vem um -2 aí, e nào ta tratado, ficaria como ativado"
Ainda sobre este cara, a lista de roomState está sendo criado direto no Handler de USERSTATE e ROOMSTATE, mas, se posteriormente esta lista for utilizada em outros comandos, talvez seja necessário voltar ele pro TwitchHandler e repassá-lo para os handlers necessários seja por construtor (navegando pelo discovery) ou por setter
This is a Bluetooth operational Chat-App developed using Kotlin which shows the list of available devices nearby and paired devices, upon clicking you can start chat ... VOILA ???? It is still in its early stages of development and currently let user to one-time chat at a time. It is under heavy development ??
Shit Chat Shit Chat is a realtime chat application made with Kotlin. Screeshots : Login UI Sign Up UI User List UI Chat UI Features Store Chat on Fire
Avengers Chat AvengersChat is a demo application based on modern Android tech stacks and Stream Chat SDK. Previews Download Go to the Releases to down
ktor_chatting_application Server/Client Chatting application that uses Ktor webs
Multi Lingual Chat app - A modern chat application that allows users to translate text messages into their preferred language
Firebase-Chat-App-Final An android real-time chat application implemented using
End-to-End Encrypted Chat ?? Chat App is built to demonstrate a simple end-to-end chat encryption using RSA and AES algorithms Built With ⚒️ Jetpack C
Chat Box A simple chat box written in kotlin which requires a redis server to be used. Features Command Support Online User storage in Redis Easy to u
Chat App Android About A chat app for Android written in Kotlin using MVVM. Features Authentication: Email and password Google Auth Reset Password Sen
Chat App Android About A chat app for Android written in Kotlin using MVVM. Features Authentication: Email and password Google Auth Reset Password Sen