Prechádzať zdrojové kódy

Fix xenforo api requests

ghorsington 4 rokov pred
rodič
commit
434de4377d
3 zmenil súbory, kde vykonal 35 pridanie a 28 odobranie
  1. 2 5
      bot/src/logging.ts
  2. 13 0
      bot/src/util.ts
  3. 20 23
      bot/src/xenforo.ts

+ 2 - 5
bot/src/logging.ts

@@ -2,7 +2,7 @@ import winston from "winston";
 import nodemailer from "nodemailer";
 import TransportStream from "winston-transport";
 import Mail from "nodemailer/lib/mailer";
-import { HTTPError } from "got/dist/source";
+import { isHttpError } from "./util";
 
 export const logger = winston.createLogger({
     level: "debug",
@@ -13,16 +13,13 @@ export const logger = winston.createLogger({
             debugStdout: true,
             format: winston.format.combine(
                 winston.format.splat(),
+                winston.format.prettyPrint(),
                 winston.format.cli()
             ),
         }),
     ]
 });
 
-function isHttpError(reason?: unknown): reason is HTTPError {
-    return reason && Object.prototype.hasOwnProperty.call(reason, "request");
-}
-
 process.on("unhandledRejection", (reason) => {
     if (isHttpError(reason))
         throw new Error(`HTTPError: ${reason.request.requestUrl} failed because ${reason}`);

+ 13 - 0
bot/src/util.ts

@@ -1,6 +1,7 @@
 import { GuildMember } from "discord.js";
 import { getRepository, In } from "typeorm";
 import { KnownUser } from "@shared/db/entity/KnownUser";
+import { HTTPError } from "got/dist/source";
 
 const VALID_EXTENSIONS = new Set([
     "png",
@@ -75,4 +76,16 @@ export function getNumberEnums<E>(e : Record<keyof E, number>) : number[] {
 
 export function formatString(str: string, vars: Record<string, string>): string {
     return Object.keys(vars).filter(s => Object.prototype.hasOwnProperty.call(vars, s)).reduce((s, cur) => s.replace(`{${cur}}`, vars[cur]), str);
+}
+
+export async function tryDo<TResult>(promise: Promise<TResult>) : Promise<{ok: boolean, result?: TResult, error?: unknown}> {
+    try {
+        return {ok: true, result: await promise};
+    } catch(err) {
+        return {ok: false, error: err};
+    }
+}
+
+export function isHttpError(err?: unknown): err is HTTPError {
+    return err && Object.prototype.hasOwnProperty.call(err, "response");
 }

+ 20 - 23
bot/src/xenforo.ts

@@ -1,12 +1,6 @@
-import { Dict } from "./util";
+import { Dict, tryDo, isHttpError } from "./util";
 import got, { Method } from "got";
 
-enum ReqMethod {
-    GET = "get",
-    POST = "post",
-    DELETE = "delete"
-}
-
 export interface RequestError {
     code: string;
     message: string;
@@ -21,29 +15,32 @@ export class XenforoClient {
     }
 
     private async makeRequest<TResult, TData>(uri: string, method: Method, data?: TData): Promise<TResult> {
-        const result = await got<TResult | RequestErrorSet>(`${this.endpoint}/${uri}`, {
+        const result = await tryDo(got<TResult | RequestErrorSet>(`${this.endpoint}/${uri}`, {
             responseType: "json",
             method: method,
             headers: {
                 "XF-Api-Key": this.userKey
             },
-            json: data
-        });
-
-        if (result.statusCode != 200) {
-            throw result.body as RequestErrorSet;
+            form: data
+        }));
+
+        if (!result.ok) {
+            if (isHttpError(result.error))
+                throw result.error.response.body as RequestErrorSet;
+            else
+                throw { errors: [{ code: "UNK", message: "Unkown error" }] } as RequestErrorSet;
         } else {
-            return result.body as TResult;
+            return result.result?.body as TResult;
         }
     }
 
     async getMe(): Promise<User> {
-        const { me }: {me: User} = await this.makeRequest("me/", ReqMethod.GET);
+        const { me }: {me: User} = await this.makeRequest("me/", "get");
         return me;
     }
 
     async postReply(thread_id: number, message: string, attachment_key?: string): Promise<void> {
-        return await this.makeRequest("posts/", ReqMethod.POST, {
+        return await this.makeRequest("posts/", "post", {
             thread_id,
             message,
             attachment_key
@@ -51,23 +48,23 @@ export class XenforoClient {
     }
 
     async editThread(id: number, opts?: EditThreadOptions): Promise<CreateThreadResponse> {
-        return await this.makeRequest(`threads/${id}`, ReqMethod.POST, opts);
+        return await this.makeRequest(`threads/${id}`, "post", opts);
     }
 
     async editPost(id: number, opts?: EditPostOptions): Promise<EditPostResponse> {
-        return await this.makeRequest(`posts/${id}`, ReqMethod.POST, opts);
+        return await this.makeRequest(`posts/${id}`, "post", opts);
     }
 
     async getThread(id: number, opts?: GetThreadOptions): Promise<GetThreadResponse> {
-        return await this.makeRequest(`threads/${id}`, ReqMethod.GET, opts);
+        return await this.makeRequest(`threads/${id}`, "post", opts);
     }
 
     async deleteThread(id: number, opts?: DeleteThreadOptions): Promise<SuccessResponse> {
-        return await this.makeRequest(`threads/${id}`, ReqMethod.DELETE, opts);
+        return await this.makeRequest(`threads/${id}`, "delete", opts);
     }
 
     async createThread(forumId: number, title: string, message: string, opts?: CreateThreadOptions): Promise<CreateThreadResponse> {
-        return await this.makeRequest("threads/", ReqMethod.POST, {
+        return await this.makeRequest("threads/", "post", {
             node_id: forumId,
             title: title,
             message: message,
@@ -76,12 +73,12 @@ export class XenforoClient {
     }
 
     async getPost(id: number): Promise<Post> {
-        const { post }: {post: Post} = await this.makeRequest(`posts/${id}`, ReqMethod.GET);
+        const { post }: {post: Post} = await this.makeRequest(`posts/${id}`, "get");
         return post;
     }
 
     async getForumThreads(id: number): Promise<GetForumThreadsResponse> {
-        return await this.makeRequest(`forums/${id}/threads`, ReqMethod.GET);
+        return await this.makeRequest(`forums/${id}/threads`, "get");
     }
 }