Clicker

A Twitch Android client built with moderators in mind. Join the subreddit to voice your ideas, questions and concerns. Link to app on Google Play store below. Next update is 2024-04-29 (by thePlebDev)

Clicker Alternatives

Similar projects and alternatives to Clicker

  • Retrofit

    A type-safe HTTP client for Android and the JVM

  • InfluxDB

    Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.

    InfluxDB logo
NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a better Clicker alternative or higher similarity.

Clicker reviews and mentions

Posts with mentions or reviews of Clicker. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-01-23.
  • Weekly goals of Modderz Android app . 2024-04-22
    1 project | dev.to | 22 Apr 2024
    1) System level chat messages
  • Using Retrofit Interceptors to check network connection in Android and testing it
    2 projects | dev.to | 23 Jan 2024
    Entire GitHub application code
  • The rules I am using to organize and document my Jetpack Compose code
    1 project | dev.to | 22 Dec 2023
    live list, HERE
  • How I am documenting my interfaces in Kotlin
    1 project | dev.to | 16 Dec 2023
    HERE
  • Lets make a Twitch Android app. Part 2. The secret to implementing chat
    1 project | dev.to | 25 Jul 2023
    @Composable fun AnotherTesting(){ val context = LocalContext.current val html = "" AndroidView( factory = { WebView(context).apply { webViewClient = WebViewClient() webChromeClient = WebChromeClient() settings.loadsImagesAutomatically = true settings.javaScriptEnabled = true settings.allowFileAccess = true settings.javaScriptCanOpenWindowsAutomatically = true settings.mediaPlaybackRequiresUserGesture = false settings.domStorageEnabled = true settings.cacheMode = WebSettings.LOAD_NO_CACHE loadDataWithBaseURL("https://player.twitch.tv/", html, "text/html", "UTF-8", null) } } ) }
    Enter fullscreen mode Exit fullscreen mode
    • Now I would like to point out that with this compose version I was only able to get the audio version working. This is most like do to my lack of experience of working with the AndroidView. So if your mind is set on using the compose system, know that you may have to mess around with the AndroidView a little longer. However, due to the simplicity of it just working, I have decided to stick with the simple XML implementation

    Embedding the chat

    • This is a little trickier, mainly because the documentation tells us that we just need to embed the video and chat together. However, this does not result in the best user experience. Also, the user has to sign in through the WebView to chat(Which is considered an anti practice and a attack vector for hackers)

    The secret : I believe the secret to creating a better twitch chat experience than the embedded version is to treat our application as a chatbot and to implement Twitch’s IRC service. The downside being that we will have to entirely recreate the Twitch chat experience. However, we will get the freedom to recreate the UI as we see fit. There is another downside of Rate Limits. At this moment I am uncertain if the each individual user would be treated as a separate bot or if all users get treated collectively as one bot. But once I find supporting documentation I will post it here.

    • We can implement Twitch’s IRC service with the help of WebSockets provided to us by the engineering team at square.

    • Technically the first thing we need to do to get the chat up and running is to authenticate our application and get a user access token. You can see how to do that through my previous post

    • Once you have a user access token, we can move on to implementing a Websocket and connecting to the twitch IRC servers. We need to create a new class and have it implement the WebSocketListener class.

    • You can check out my github version HERE, although with the current version you have to hard code your user access token.
      But to get us started, it will look something like this:

    class TwitchWebSocket(): WebSocketListener() {
    
    
        val webSocketURL = "wss://irc-ws.chat.twitch.tv:443"
    
        init {
            run()
        }
    
        private fun run() {
            val client: OkHttpClient = OkHttpClient.Builder()
                .readTimeout(1000,TimeUnit.MILLISECONDS)
                .writeTimeout(1000,TimeUnit.MILLISECONDS)
                .build()
    
            val request: Request = Request.Builder()
                .url(webSocketURL)
                .build()
            client.newWebSocket(request, this)
    
            // Trigger shutdown of the dispatcher's executor so this process can exit cleanly.
            client.dispatcher.executorService.shutdown()
        }
    
    Enter fullscreen mode Exit fullscreen mode
    • Then we need to override the onOpen() method and send the PASS and NICK messages. Implemented like so:
    override fun onOpen(webSocket: WebSocket, response: Response) {
            super.onOpen(webSocket, response)
            webSocket.send("CAP REQ :twitch.tv/tags twitch.tv/commands");
            //todo: add the User access tokens after oauth:
            webSocket.send("PASS oauth:yourToken");
            webSocket.send("NICK username");
        }
    
    
    Enter fullscreen mode Exit fullscreen mode
    • Also, we need to log the results:
    override fun onMessage(webSocket: WebSocket, text: String) {
    
            Log.d("websocketStoof","onMessage: ${text}")
        }
    
    
    Enter fullscreen mode Exit fullscreen mode
    • Doing everything correctly should give you back a message of:
    :tmi.twitch.tv 001  :Welcome, YourUsername!
    :tmi.twitch.tv 002  :Your host is tmi.twitch.tv
    :tmi.twitch.tv 003  :This server is rather new
    :tmi.twitch.tv 004  :-
    :tmi.twitch.tv 375  :-
    :tmi.twitch.tv 372  :You are in a maze of twisty passages.
    :tmi.twitch.tv 376  :>
    @badge-info=;badges=;color=;display-name=;emote-sets=0,300374282;user-id=12345678;user-type= :tmi.twitch.tv GLOBALUSERSTATE
    
    
    Enter fullscreen mode Exit fullscreen mode

    What is next?

    • Next tutorial I will clean up the code and we will walk through actually joining a chat room. We might even be able to send our first messages through our app!!!!!!!

    Conclusion

    • Thank you for taking the time out of your day to read this blog post of mine. If you have any questions or concerns please comment below or reach out to me on Twitter.
  • Using OAuth2.0 and Retrofit to talk to the GitHub api on Android
    3 projects | dev.to | 11 Jul 2023
    GitHub
  • A note from our sponsor - InfluxDB
    www.influxdata.com | 3 May 2024
    Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality. Learn more →

Stats

Basic Clicker repo stats
6
3
1.8
5 days ago

The primary programming language of Clicker is Kotlin.

Popular Comparisons


Sponsored
SaaSHub - Software Alternatives and Reviews
SaaSHub helps you find the best software and product alternatives
www.saashub.com