diff --git a/packages/api/routes/[server].ts b/packages/api/routes/[server].ts index 3e72963..1b57941 100644 --- a/packages/api/routes/[server].ts +++ b/packages/api/routes/[server].ts @@ -1,9 +1,9 @@ -import { serverNameSchema } from "../../shared/types.js" +import { SERVER_NAMES } from "../../shared/types.js" export default defineEventHandler((event) => { const { server } = event.context.params - const result = serverNameSchema.safeParse(server) - if(!result.success) { + const isValidServer = SERVER_NAMES.includes(server) + if(!isValidServer) { throw createError({ status: 400, message: 'bad request' diff --git a/packages/scrape-and-tweet/constants.ts b/packages/scrape-and-tweet/constants.ts index e9def47..0ac3579 100644 --- a/packages/scrape-and-tweet/constants.ts +++ b/packages/scrape-and-tweet/constants.ts @@ -1,6 +1,7 @@ import { ServerName } from "../shared/types.js"; export const STATUS_URLS: Record = { - east: 'https://serverstatus-sgp.albiononline.com/', - west: 'https://serverstatus.albiononline.com/', + sgp: 'https://serverstatus-sgp.albiononline.com/', + ams: 'https://serverstatus-ams.albiononline.com/', + was: 'https://serverstatus.albiononline.com/', } as const \ No newline at end of file diff --git a/packages/scrape-and-tweet/index.ts b/packages/scrape-and-tweet/index.ts index b233fdb..a01b9f1 100644 --- a/packages/scrape-and-tweet/index.ts +++ b/packages/scrape-and-tweet/index.ts @@ -1,7 +1,5 @@ import { scrape } from "./scrape.js" -import { tweet } from "./tweet.js" -import type { ServerName } from '../shared/types.js' import { Env } from "./types.js" export default { @@ -11,8 +9,9 @@ export default { ctx: ExecutionContext ): Promise { const result = await Promise.allSettled([ - scrapeAndTweet('east', env), - scrapeAndTweet('west', env) + scrape('sgp', env), + scrape('ams', env), + scrape('was', env), ]) if (!result.every(({ status }) => status === 'fulfilled')) { @@ -20,16 +19,4 @@ export default { console.error(result) } } -} - -async function scrapeAndTweet (server: ServerName, env: Env) { - const { didStatusUpdate, currentStatus } = await scrape(server, env) - - if (!didStatusUpdate) { - console.log("Status did not update") - return { success: true, message: "Status did not update" } - } - - console.log(`Tweeting new status - ${currentStatus.message}`) - await tweet({ status: currentStatus, server, env }) -} +} \ No newline at end of file diff --git a/packages/scrape-and-tweet/tweet.ts b/packages/scrape-and-tweet/tweet.ts deleted file mode 100644 index cf2a6d3..0000000 --- a/packages/scrape-and-tweet/tweet.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { $fetch } from 'ofetch' -import OAuth from 'oauth-1.0a' -import HmacSHA1 from 'crypto-js/hmac-sha1.js' -import Base64 from 'crypto-js/enc-base64.js' -import { ServerName, Status } from '../shared/types.js' -import { Env } from './types.js' - -type TweetArgs = { - status: Status - server: ServerName, - env: Env -} -export const tweet = async ({ status, server, env }: TweetArgs) => { - const message = `New server status of Albion ${server}: ${status.type}. -Message: ${status.message} - -#albion${server}` - - const config = { - consumer_key: env.TWITTER_CONSUMER_KEY, - consumer_secret: env.TWITTER_CONSUMER_SECRET, - access_token: env.TWITTER_ACCESS_TOKEN, - access_token_secret: env.TWITTER_ACCESS_TOKEN_SECRET - } - await sendTweet(message, config) -} - -type TwitterKeys = { - consumer_key: string - consumer_secret: string - access_token: string - access_token_secret: string -} - -export async function sendTweet (tweet: string, keys: TwitterKeys) { - const oauth = new OAuth({ - consumer: { key: keys.consumer_key, secret: keys.consumer_secret }, - signature_method: 'HMAC-SHA1', - hash_function (baseString: string, key: string) { - return HmacSHA1(baseString, key).toString(Base64) - }, - }); - - const oauthToken = { - key: keys.access_token, - secret: keys.access_token_secret, - }; - - const requestData = { - url: 'https://api.twitter.com/1.1/statuses/update.json', - method: 'POST', - data: { status: `${tweet.slice(0, 235)}${tweet.length > 235 ? '...' : ''}` }, - }; - - try { - const response = await $fetch(requestData.url, { - headers: { - ...oauth.toHeader(oauth.authorize(requestData, oauthToken)), - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: new URLSearchParams(requestData.data), - method: requestData.method - }); - - return { - data: response - } - } catch (e) { - console.error('Error during tweeting') - console.error(e) - } -} diff --git a/packages/shared/types.ts b/packages/shared/types.ts index 2da978c..4f32633 100644 --- a/packages/shared/types.ts +++ b/packages/shared/types.ts @@ -1,7 +1,5 @@ -import { z } from 'zod' - -export const serverNameSchema = z.enum(['east', 'west']) -export type ServerName = z.infer; +export const SERVER_NAMES = ['sgp', 'ams', 'was'] as const +export type ServerName = typeof SERVER_NAMES[number] export type StatusType = 'online' | 'offline' | 'starting' | 'unknown' export type Status = {