Skip to content

feat(OpenGuessr): add activity #9398

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Apr 8, 2025
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions websites/O/OpenGuessr/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"$schema": "https://schemas.premid.app/metadata/1.13",
"apiVersion": 1,
"author": {
"id": "286179374204583938",
"name": "Inkflow"
},
"service": "OpenGuessr",
"description": {
"de": "OpenGuessr ist eine kostenlose GeoGuessr-Alternative mit unbegrenzten Partien und Multiplayer",
"en": "OpenGuessr is a free GeoGuessr alternative with unlimited play and Multiplayer",
"es": "OpenGuessr es una alternativa gratuita a GeoGuessr con un número ilimitado de partidas y Multijugador",
"fr": "OpenGuessr est une alternative gratuite à GeoGuessr avec un nombre de parties illimité et un mode Multijoueur",
"pt": "OpenGuessr é uma alternativa gratuita a GeoGuessr com um número ilimitado de partidas e Multiplayer"
},
"url": [
"openguessr.com",
"www.openguessr.com",
"play.openguessr.com"
],
"regExp": "([a-z0-9-]+[.])*openguessr[.]com[/]",
"version": "1.0.0",
"logo": "https://i.ibb.co/rfxNBp1d/openguessr-icon.png",
"thumbnail": "https://i.imgur.com/Ttplphu.png",
"color": "#f23913",
"category": "games",
"tags": [
"geography",
"maps",
"guessing",
"geolocation",
"streetview"
],
"iFrameRegExp": "([a-z0-9-]+[.])*openguessr[.]com[/]",
"readLogs": true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

readLogs can be set to false as you dont use the getLogs function, IframeRegex can be removed as you dont use the iframe.ts file.

}
168 changes: 168 additions & 0 deletions websites/O/OpenGuessr/presence.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
import { Assets } from 'premid'

const presence = new Presence({
clientId: '1349664981007859754',
})
const browsingTimestamp = Math.floor(Date.now() / 1000)

// Update parameters when they are modified
presence.on('UpdateData', async () => {
try {
const presenceData: PresenceData = {
largeImageKey: 'https://i.ibb.co/rfxNBp1d/openguessr-icon.png',
startTimestamp: browsingTimestamp,
}

// Get current URL
const url = new URL(document.location.href)
const pathname = url.pathname
const fullUrl = url.origin + url.pathname

// Debug - log the current pathname and full URL to help debugging
console.warn('[OpenGuessr] Current pathname:', pathname)
console.warn('[OpenGuessr] Full URL:', fullUrl)

if (fullUrl === 'https://openguessr.com/') {
presenceData.details = 'Playing OpenGuessr'

// Fetch player info
try {
const accountNameElement = document.getElementById('accountName')
const progressRingLevelElement = document.getElementById('progressRingLevel')

if (accountNameElement && progressRingLevelElement) {
const accountName = accountNameElement.textContent?.trim()
const progressRingLevel = progressRingLevelElement.textContent?.trim()

if (accountName && progressRingLevel) {
// If it's a guest account (Guest) with level 1, display "Guest mode"
if (accountName === 'Guest' && progressRingLevel === '1') {
presenceData.details = 'Playing OpenGuessr (Guest mode)'
}
else {
presenceData.details = `Playing OpenGuessr (${accountName} | Lv.${progressRingLevel})`
}
}
}
}
catch (e) {
console.error('[OpenGuessr] Error getting player info:', e)
}

presenceData.state = 'Is guessing'

// Try to get the selected category and timer from localStorage
try {
const selectedCategory = localStorage.getItem('selectedCategory')
const _singleplayerTimer = localStorage.getItem('singleplayerTimer')
const mapTimer = document.getElementById('mapTimer')?.textContent?.trim()

// Add category if available
if (selectedCategory) {
// Truncate "community_" if present
let processedCategory = selectedCategory
if (selectedCategory.startsWith('community_')) {
processedCategory = selectedCategory.substring('community_'.length)
}

// Capitalize the first letter of the category
const capitalizedCategory = processedCategory.charAt(0).toUpperCase() + processedCategory.slice(1)
presenceData.state += ` (${capitalizedCategory})`
}

// Add remaining time if mapTimer is available and different from "00:00"
if (mapTimer && mapTimer !== '00:00') {
presenceData.state += ` (${mapTimer} remaining)`
console.warn('[OpenGuessr] Map timer found:', mapTimer)
}
else {
console.warn('[OpenGuessr] Map timer not found or is 00:00, not displaying remaining time')
}
}
catch (e) {
console.error('[OpenGuessr] Error getting data from localStorage or timer:', e)
}

presenceData.smallImageKey = Assets.Play
presenceData.smallImageText = 'In game'
}
else if (fullUrl === 'https://openguessr.com/multiplayer/duel' || fullUrl.startsWith('https://openguessr.com/multiplayer/duel/')) {
presenceData.details = 'Looking for an opponent'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/multiplayer/host' || fullUrl.startsWith('https://openguessr.com/multiplayer/host/')) {
presenceData.details = 'Hosting a multiplayer game'
presenceData.smallImageKey = Assets.Search

// Check if a room code is available
try {
const roomCodeElement = document.getElementById('roomCodeDisplay')
if (roomCodeElement && roomCodeElement.textContent) {
const roomCode = roomCodeElement.textContent.trim()
if (roomCode) {
// Add a second button to join the room
presenceData.buttons = [
{
label: 'Join the room',
url: `https://openguessr.com/?join=${roomCode}`,
},
]
console.warn(`[OpenGuessr] Room code found: ${roomCode}, adding join button`)
}
}
}
catch (e) {
console.error('[OpenGuessr] Error getting room code:', e)
}
}
else if (fullUrl === 'https://openguessr.com/multiplayer/join' || fullUrl.startsWith('https://openguessr.com/multiplayer/join/')) {
presenceData.details = 'Joining a multiplayer room'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/competitions/create' || fullUrl.startsWith('https://openguessr.com/competitions/create/')) {
presenceData.details = 'Creating a competition'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/leaderboard' || fullUrl.startsWith('https://openguessr.com/leaderboard/')) {
presenceData.details = 'Viewing leaderboard'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/maps' || fullUrl.startsWith('https://openguessr.com/maps/')) {
presenceData.details = 'Is selecting a game mode'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/multiplayer' || fullUrl.startsWith('https://openguessr.com/multiplayer/')) {
presenceData.details = 'Wants to play online'
presenceData.smallImageKey = Assets.Search
}
else if (fullUrl === 'https://openguessr.com/competitions' || fullUrl.startsWith('https://openguessr.com/competitions/')) {
presenceData.details = 'Checks for a competition'
presenceData.smallImageKey = Assets.Search
}
else {
presenceData.details = 'Browsing OpenGuessr'
presenceData.smallImageKey = Assets.Reading
}

// Set activity
presence.setActivity(presenceData)

// Debug - display in console to help debugging
console.warn('[OpenGuessr] Presence updated:', {
pathname,
presenceData,
hasButtons: presenceData.buttons ? 'Yes' : 'No',
buttonsData: presenceData.buttons,
})
}
catch (error) {
console.error(`[OpenGuessr] Error in presence: ${error}`)

// In case of error, display a basic presence
presence.setActivity({
largeImageKey: 'https://i.ibb.co/rfxNBp1d/openguessr-icon.png',
details: 'Browsing OpenGuessr',
startTimestamp: browsingTimestamp,
})
}
})
Loading