Skip to content

Commit 64ab4b9

Browse files
committed
feat(OKISO): add activity
1 parent b00d259 commit 64ab4b9

2 files changed

Lines changed: 135 additions & 0 deletions

File tree

websites/O/OKISO/metadata.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"$schema": "https://schemas.premid.app/metadata/1.16",
3+
"apiVersion": 1,
4+
"author": {
5+
"name": "OKISO",
6+
"id": "274178934143451137"
7+
},
8+
"service": "OKISO",
9+
"description": {
10+
"en": "Shows what you're watching on okiso.net"
11+
},
12+
"url": [
13+
"okiso.net",
14+
"localhost"
15+
],
16+
"regExp": ".*(okiso\\.net|localhost).*",
17+
"version": "1.0.0",
18+
"logo": "https://i.imgur.com/LLE4SVZ.png",
19+
"thumbnail": "https://i.imgur.com/LLE4SVZ.png",
20+
"color": "#FF7EB3",
21+
"category": "music",
22+
"tags": [
23+
"music",
24+
"vtuber",
25+
"streaming"
26+
]
27+
}

websites/O/OKISO/presence.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { Assets, getTimestampsFromMedia } from 'premid'
2+
3+
// Initialize with the new Discord Application Client ID
4+
const presence = new Presence({ clientId: '1505219461152636949' })
5+
const browsingTimestamp = Math.floor(Date.now() / 1000)
6+
7+
enum ActivityAssets {
8+
Logo = 'logo',
9+
}
10+
11+
presence.on('UpdateData', async () => {
12+
const { pathname } = document.location
13+
14+
const presenceData = {
15+
largeImageKey: ActivityAssets.Logo,
16+
largeImageText: 'okiso.net',
17+
startTimestamp: browsingTimestamp,
18+
buttons: [
19+
{ label: 'Visit okiso.net', url: `https://okiso.net${pathname === '/' ? '' : pathname}` }
20+
]
21+
} as any
22+
23+
// ─── Home Page ───
24+
if (pathname === '/') {
25+
// Check for Terms Modal
26+
const termsModal = document.querySelector('[data-premid-modal=\"terms\"]')
27+
if (termsModal) {
28+
presenceData.details = 'Reading Content Terms'
29+
presenceData.state = 'Legal & Guidelines'
30+
} else {
31+
// Check for live broadcast
32+
const isLive = document.querySelector('[data-premid-live=\"true\"]')
33+
if (isLive) {
34+
presenceData.details = 'Watching Live Broadcast'
35+
presenceData.state = '🔴 LIVE on Twitch'
36+
presenceData.smallImageKey = Assets.Live
37+
presenceData.smallImageText = 'Live'
38+
delete presenceData.startTimestamp
39+
} else {
40+
// Check for video playback
41+
const videoPlayer = document.querySelector('[data-premid-title]')
42+
if (videoPlayer) {
43+
const videoTitle = videoPlayer.getAttribute('data-premid-title')
44+
const paused = videoPlayer.getAttribute('data-premid-paused') === 'true'
45+
46+
presenceData.details = videoTitle || 'Watching a Video'
47+
presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
48+
presenceData.smallImageText = paused ? 'Paused' : 'Playing'
49+
50+
if (!paused) {
51+
const video = document.querySelector<HTMLVideoElement>('[data-premid-title] video')
52+
if (video) {
53+
[presenceData.startTimestamp, presenceData.endTimestamp] = getTimestampsFromMedia(video)
54+
}
55+
}
56+
57+
presenceData.state = paused ? '⏸ Paused' : '▶ Playing'
58+
} else {
59+
presenceData.details = 'Browsing'
60+
presenceData.state = 'Home Page'
61+
}
62+
}
63+
}
64+
}
65+
// ─── Discography (3D Gallery) ───
66+
else if (pathname === '/releases') {
67+
presenceData.details = 'Exploring the 3D Audio Archive'
68+
presenceData.state = 'Interactive Discography'
69+
}
70+
// ─── Individual Release Page ───
71+
else if (pathname.startsWith('/releases/')) {
72+
const releaseEl = document.querySelector('[data-premid-release-title]')
73+
const releaseTitle = releaseEl?.getAttribute('data-premid-release-title')
74+
presenceData.details = 'Viewing Release'
75+
presenceData.state = releaseTitle ? `🎵 ${releaseTitle}` : 'Release Page'
76+
}
77+
// ─── Upcoming Page ───
78+
else if (pathname === '/upcoming') {
79+
presenceData.details = 'Browsing'
80+
presenceData.state = 'Upcoming Releases'
81+
}
82+
// ─── Fallback ───
83+
else {
84+
presenceData.details = document.title || 'Browsing'
85+
presenceData.state = 'okiso.net'
86+
}
87+
88+
// ─── Global Music Player ───
89+
const musicContainer = document.getElementById('spotify-embed-container-data')
90+
const trackTitle = musicContainer?.getAttribute('data-premid-track-title')
91+
92+
if (trackTitle) {
93+
const artist = musicContainer?.getAttribute('data-premid-track-artist')
94+
const paused = musicContainer?.getAttribute('data-premid-paused') === 'true'
95+
96+
// Override the main details if they are listening to music
97+
presenceData.details = paused ? `Paused: ${trackTitle}` : `Listening to ${trackTitle}`
98+
presenceData.state = `by ${artist || 'OKISO'}`
99+
presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
100+
presenceData.smallImageText = paused ? 'Paused' : 'Playing'
101+
delete presenceData.startTimestamp // Remove browsing timestamp so it doesn't look like a long song
102+
}
103+
104+
if (presenceData.details)
105+
presence.setActivity(presenceData)
106+
else
107+
presence.setActivity()
108+
})

0 commit comments

Comments
 (0)