1
0
mirror of https://git.sr.ht/~cadence/bibliogram synced 2025-12-18 03:58:49 +00:00

Add experimental assistant feature

This commit is contained in:
Cadence Ember
2020-04-07 18:30:00 +12:00
parent 160fa7d843
commit b22028aaa4
10 changed files with 236 additions and 3 deletions

View File

@@ -0,0 +1,42 @@
const {request} = require("../utils/request")
const constants = require("../constants")
class Assistant {
constructor(origin) {
this.origin = origin
this.lastRequest = 0
this.lastRequestStatus = constants.symbols.assistant_statuses.NONE
}
available() {
if (this.lastRequestStatus === constants.symbols.assistant_statuses.OFFLINE) {
return Date.now() - this.lastRequest > constants.assistant.offline_request_cooldown
} else if (this.lastRequestStatus === constants.symbols.assistant_statuses.BLOCKED) {
return Date.now() - this.lastRequest > constants.assistant.blocked_request_cooldown
} else {
return true
}
}
requestUser(username) {
this.lastRequest = Date.now()
return new Promise((resolve, reject) => {
request(`${this.origin}/api/user/v1/${username}`).json().then(root => {
console.log(root)
if (root.status === "ok") {
this.lastRequestStatus = constants.symbols.assistant_statuses.OK
resolve(root.data.user)
} else {
this.lastRequestStatus = constants.symbols.assistant_statuses.BLOCKED
reject(constants.symbols.assistant_statuses.BLOCKED)
}
}).catch(error => {
console.error(error)
this.lastRequestStatus = constants.symbols.assistant_statuses.OFFLINE
reject(constants.symbols.assistant_statuses.OFFLINE)
})
})
}
}
module.exports = Assistant

View File

@@ -0,0 +1,49 @@
const constants = require("../constants")
const collectors = require("../collectors")
const Assistant = require("./Assistant")
const db = require("../db")
class AssistantSwitcher {
constructor() {
this.assistants = constants.assistant.origins.map(origin => new Assistant(origin))
}
enabled() {
return constants.assistant.enabled && this.assistants.length
}
getAvailableAssistants() {
return this.assistants.filter(assistant => assistant.available()).sort((a, b) => (a.lastRequest - b.lastRequest))
}
requestUser(username) {
return new Promise(async (resolve, reject) => {
const assistants = this.getAvailableAssistants()
while (assistants.length) {
const assistant = assistants.shift()
try {
const user = await assistant.requestUser(username)
return resolve(user)
} catch (e) {
// that assistant broke. try the next one.
}
}
return reject(constants.symbols.NO_ASSISTANTS_AVAILABLE)
}).then(user => {
const bind = {...user}
bind.created = Date.now()
bind.updated = Date.now()
bind.updated_version = constants.database_version
bind.is_private = +user.is_private
bind.is_verified = +user.is_verified
db.prepare(
"REPLACE INTO Users (username, user_id, created, updated, updated_version, biography, post_count, following_count, followed_by_count, external_url, full_name, is_private, is_verified, profile_pic_url) VALUES "
+"(@username, @user_id, @created, @updated, @updated_version, @biography, @post_count, @following_count, @followed_by_count, @external_url, @full_name, @is_private, @is_verified, @profile_pic_url)"
).run(bind)
collectors.userRequestCache.cache.delete(`user/${username}`)
return collectors.fetchUserFromSaved(user)
})
}
}
module.exports = AssistantSwitcher