improvements to LIVE tracker

This commit is contained in:
ari melody 2025-06-17 02:01:06 +01:00
parent 9274796729
commit 581273370d
Signed by: ari
GPG key ID: CF99829C92678188
7 changed files with 45 additions and 16 deletions

View file

@ -4,7 +4,6 @@ import (
"arimelody-web/model" "arimelody-web/model"
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"net/http" "net/http"
"net/url" "net/url"
"time" "time"
@ -63,8 +62,6 @@ func GetTwitchStatus(app *model.AppState, broadcaster string) (*model.TwitchStre
return lastStreamState, nil return lastStreamState, nil
} }
fmt.Print("MAKING COSTLY REQUEST TO TWITCH.TV API...\n")
requestUrl, _ := url.Parse(TWITCH_API_BASE + "streams") requestUrl, _ := url.Parse(TWITCH_API_BASE + "streams")
requestUrl.RawQuery = url.Values{ requestUrl.RawQuery = url.Values{
"user_login": []string{ broadcaster }, "user_login": []string{ broadcaster },

View file

@ -460,9 +460,11 @@ func main() {
// handle DB migrations // handle DB migrations
controller.CheckDBVersionAndMigrate(app.DB) controller.CheckDBVersionAndMigrate(app.DB)
err = controller.TwitchSetup(&app) if app.Config.Twitch != nil {
if err != nil { err = controller.TwitchSetup(&app)
fmt.Fprintf(os.Stderr, "WARN: Failed to set up Twitch integration: %v\n", err) if err != nil {
fmt.Fprintf(os.Stderr, "WARN: Failed to set up Twitch integration: %v\n", err)
}
} }
// initial invite code // initial invite code

View file

@ -34,8 +34,8 @@ type (
DataDirectory string `toml:"data_dir"` DataDirectory string `toml:"data_dir"`
TrustedProxies []string `toml:"trusted_proxies"` TrustedProxies []string `toml:"trusted_proxies"`
DB DBConfig `toml:"db"` DB DBConfig `toml:"db"`
Discord DiscordConfig `toml:"discord"` Discord *DiscordConfig `toml:"discord"`
Twitch TwitchConfig `toml:"twitch"` Twitch *TwitchConfig `toml:"twitch"`
} }
AppState struct { AppState struct {

View file

@ -231,11 +231,6 @@ div#web-buttons {
box-shadow: 0 0 8px var(--primary); box-shadow: 0 0 8px var(--primary);
} }
#live-banner h2 {
margin: 0 0 .4em 0;
color: var(--on-background);
}
#live-banner p { #live-banner p {
margin: 0; margin: 0;
} }
@ -252,7 +247,11 @@ div#web-buttons {
} }
.live-preview div:first-of-type { .live-preview div:first-of-type {
text-align: center; display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
gap: .3em;
} }
.live-thumbnail { .live-thumbnail {
@ -283,6 +282,36 @@ div#web-buttons {
overflow-x: hidden; overflow-x: hidden;
} }
#live-banner h2 {
margin: 0;
color: var(--on-background);
font-family: 'Inter', sans-serif;
font-weight: 800;
font-style: italic;
}
.live-pinger {
width: .5em;
height: .5em;
margin: .1em .2em;
display: inline-block;
border-radius: 100%;
background-color: var(--primary);
box-shadow: 0 0 4px var(--primary);
animation: live-pinger-pulse 1s infinite alternate ease-in-out;
}
@keyframes live-pinger-pulse {
from {
opacity: .8;
transform: scale(1.0);
}
to {
opacity: 1;
transform: scale(1.1);
}
}
.live-game { .live-game {
overflow: hidden; overflow: hidden;
text-wrap: nowrap; text-wrap: nowrap;

View file

@ -3,6 +3,7 @@
@import url("/style/footer.css"); @import url("/style/footer.css");
@import url("/style/prideflag.css"); @import url("/style/prideflag.css");
@import url("/style/cursor.css"); @import url("/style/cursor.css");
@import url("/font/inter/inter.css");
@font-face { @font-face {
font-family: "Monaspace Argon"; font-family: "Monaspace Argon";

View file

@ -22,7 +22,7 @@ func IndexHandler(app *model.AppState) http.Handler {
var err error var err error
var twitchStatus *model.TwitchStreamInfo = nil var twitchStatus *model.TwitchStreamInfo = nil
if len(app.Config.Twitch.Broadcaster) > 0 { if app.Twitch != nil && len(app.Config.Twitch.Broadcaster) > 0 {
twitchStatus, err = controller.GetTwitchStatus(app, app.Config.Twitch.Broadcaster) twitchStatus, err = controller.GetTwitchStatus(app, app.Config.Twitch.Broadcaster)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "WARN: Failed to get Twitch status for %s: %v\n", app.Config.Twitch.Broadcaster, err) fmt.Fprintf(os.Stderr, "WARN: Failed to get Twitch status for %s: %v\n", app.Config.Twitch.Broadcaster, err)

View file

@ -24,13 +24,13 @@
<main> <main>
{{if .TwitchStatus}} {{if .TwitchStatus}}
<div id="live-banner"> <div id="live-banner">
<h2>ari is <span class="live-highlight">LIVE</span> right now!</h2>
<div class="live-preview"> <div class="live-preview">
<div> <div>
<img src="{{.TwitchStatus.Thumbnail 144 81}}" alt="livestream thumbnail" class="live-thumbnail"> <img src="{{.TwitchStatus.Thumbnail 144 81}}" alt="livestream thumbnail" class="live-thumbnail">
<a href="https://twitch.tv/{{.TwitchStatus.UserName}}" class="live-button">join in!</a> <a href="https://twitch.tv/{{.TwitchStatus.UserName}}" class="live-button">join in!</a>
</div> </div>
<div class="live-info"> <div class="live-info">
<h2>ari melody <span class="live-highlight">LIVE</span> <i class="live-pinger"></i></h2>
<p class="live-game"><span class="live-game-prefix">streaming:</span> {{.TwitchStatus.GameName}}</p> <p class="live-game"><span class="live-game-prefix">streaming:</span> {{.TwitchStatus.GameName}}</p>
<p class="live-title">{{.TwitchStatus.Title}}</p> <p class="live-title">{{.TwitchStatus.Title}}</p>
<p class="live-viewers">{{.TwitchStatus.ViewerCount}} viewers</p> <p class="live-viewers">{{.TwitchStatus.ViewerCount}} viewers</p>