import { Address, Loggable, Logger, RestClient } from '@reyaxyz/common'; import { IsDiscordLinkedResult, IsDiscordLinkedParams, LinkDiscordParams, LinkDiscordResult, UnlinkDiscordParams, UnlinkDiscordResult, ApiErrorResponse, } from './types'; export default class DiscordModule extends RestClient implements Loggable { loggingEnabled: boolean = false; constructor(apiUrl: string, loggingEnabled: boolean) { super(apiUrl); this.loggingEnabled = loggingEnabled; } @Logger('DiscordModule.linkDiscord') async linkDiscord(params: LinkDiscordParams): Promise { const signerAddress = ( await params.signer.getAddress() ).toLowerCase() as Address; let signature; try { signature = await params.signer.signMessage(signerAddress); } catch (error) { throw new Error('Error signing message'); } const formData = new FormData(); formData.append('address', signerAddress); formData.append('signature', signature); formData.append('discordAccessToken', params.discordAccessToken); const uri = `/api/discord/link`; try { const response = await this.post( uri, undefined, formData, undefined, ); return response; } catch (error) { if (isApiErrorResponse(error)) { throw new Error( error.response.data.error || 'An error occurred while linking Discord', ); } throw new Error('An unknown error occurred while linking Discord'); } } @Logger('DiscordModule.unlinkDiscord') async unlinkDiscord( params: UnlinkDiscordParams, ): Promise { const formData = new FormData(); formData.append('address', params.address); formData.append('discordAccessToken', params.discordAccessToken); const uri = `/api/discord/unlink`; try { const response = await this.delete( uri, undefined, formData, undefined, ); return response; } catch (error) { if (isApiErrorResponse(error)) { throw new Error( error.response.data.error || 'An error occurred while unlinking Discord', ); } throw new Error('An unknown error occurred while unlinking Discord'); } } @Logger('DiscordModule.isDiscordLinked') async isDiscordLinked( params: IsDiscordLinkedParams, ): Promise { const uri = `/api/discord/is-linked/${params.address}`; return this.get(uri); } } // eslint-disable-next-line @typescript-eslint/no-explicit-any function isApiErrorResponse(error: any): error is ApiErrorResponse { return ( error && error.response && typeof error.response.status === 'number' && error.response.data && typeof error.response.data.error === 'string' ); }