Skip to content

Commit a69da64

Browse files
Toshi7878Bas950
andauthored
feat(e-typing): add activity (#9327)
Signed-off-by: Toshi <38578537+Toshi7878@users.noreply.github.com> Co-authored-by: Bas van Zanten <bas.van.zanten007@gmail.com>
1 parent 44d6e64 commit a69da64

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

websites/E/e-typing/metadata.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"$schema": "https://schemas.premid.app/metadata/1.7",
3+
"author": {
4+
"name": "Toshi",
5+
"id": "548698164874575875"
6+
},
7+
"service": "e-typing",
8+
"description": {
9+
"en": "Japanese typing practice service. Improving your typing skills even a little can expand your possibilities.",
10+
"ja": "タイピングが少しうまくなると可能性が広がる。"
11+
},
12+
"url": "www.e-typing.ne.jp",
13+
"version": "1.0.0",
14+
"logo": "https://i.imgur.com/FbaFi9M.png",
15+
"thumbnail": "https://i.imgur.com/ynvp2J1.png",
16+
"color": "#fb9d2c",
17+
"category": "games",
18+
"tags": ["game", "typing"]
19+
}

websites/E/e-typing/presence.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import { ActivityType } from 'premid'
2+
3+
const presence = new Presence({
4+
clientId: '1343107487477399592',
5+
})
6+
7+
const romaLargeImageKey = 'https://i.imgur.com/FbaFi9M.png'
8+
const englishLargeImageKey = 'https://i.imgur.com/55iKGjg.png'
9+
const kanaLargeImageKey = 'https://i.imgur.com/gJwNzqB.png'
10+
const browsingTimestamp = Math.floor(Date.now() / 1000)
11+
12+
presence.on('UpdateData', async () => {
13+
const presenceData = generatePresenceData()
14+
15+
presence.setActivity(presenceData)
16+
})
17+
18+
function getMode() {
19+
const { search } = location
20+
21+
if (search.includes('.2')) {
22+
return 'english'
23+
}
24+
else if (search.includes('kana.1')) {
25+
return 'kana'
26+
}
27+
else if (search.includes('.0')) {
28+
return 'roma'
29+
}
30+
31+
const headerImgSrc = document.querySelector<HTMLImageElement>('#etyping img')?.src ?? ''
32+
const paths = headerImgSrc.split('/').filter(i => i !== '')
33+
const mode = paths[3]
34+
35+
if (mode === 'eng') {
36+
return 'english'
37+
}
38+
else if (mode === 'kana') {
39+
return 'kana'
40+
}
41+
else {
42+
return 'roma'
43+
}
44+
}
45+
46+
function getTypingContentWindowInfo() {
47+
const typingContent = document.querySelector<HTMLIFrameElement>('#typing_content')
48+
const appElement = typingContent?.contentDocument?.querySelector<HTMLDivElement>('#start_view > .title') ?? document.getElementById('app')
49+
50+
if (typingContent || appElement) {
51+
const windowTitleElement = document.querySelector<HTMLParagraphElement>('.pp_description') ?? window.parent.document.querySelector<HTMLParagraphElement>('.pp_description')
52+
const windowTitle = windowTitleElement?.textContent ?? ''
53+
54+
const wordTitleElement = typingContent?.contentDocument?.querySelector<HTMLDivElement>('#start_view > .title') ?? document.querySelector<HTMLDivElement>('#start_view > .title')
55+
const wordTitle = wordTitleElement?.textContent ?? ''
56+
const sessionStorageWordTitle = sessionStorage.getItem('presence:wordTitle') ?? ''
57+
58+
if (!sessionStorageWordTitle) {
59+
sessionStorage.setItem('presence:wordTitle', wordTitle)
60+
return { windowTitle, wordTitle: `お題: ${wordTitle}` }
61+
}
62+
else {
63+
const replacedWindowTitle = location.search.includes('trysc.trysc.trysc') ? '腕試しレベルチェック' : windowTitle.replace(sessionStorageWordTitle, '')
64+
65+
return { windowTitle: replacedWindowTitle, wordTitle: `お題: ${sessionStorageWordTitle}` }
66+
}
67+
}
68+
69+
sessionStorage.setItem('presence:wordTitle', '')
70+
return { windowTitle: '', wordTitle: '' }
71+
}
72+
73+
function generatePresenceData() {
74+
const mode = getMode()
75+
76+
const { windowTitle: categoryTitle, wordTitle } = getTypingContentWindowInfo()
77+
78+
const presenceData: PresenceData = {
79+
state: wordTitle,
80+
startTimestamp: browsingTimestamp,
81+
type: ActivityType.Playing,
82+
}
83+
84+
if (mode === 'english') {
85+
presenceData.largeImageKey = englishLargeImageKey
86+
87+
if (categoryTitle) {
88+
presenceData.details = `${categoryTitle} (英語)`
89+
}
90+
}
91+
else if (mode === 'kana') {
92+
presenceData.largeImageKey = kanaLargeImageKey
93+
if (categoryTitle) {
94+
presenceData.details = `${categoryTitle} (かな)`
95+
}
96+
}
97+
else {
98+
presenceData.largeImageKey = romaLargeImageKey
99+
if (categoryTitle) {
100+
presenceData.details = `${categoryTitle} (ローマ字)`
101+
}
102+
}
103+
104+
return presenceData
105+
}

0 commit comments

Comments
 (0)