2024-01-14 21:46:24 +00:00
/ *
* Vencord , a modification for Discord ' s desktop app
* Copyright ( c ) 2022 Vendicated and contributors
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
* /
2024-01-22 00:18:48 +00:00
import { Toasts } from "@webpack/common" ;
2024-01-14 21:46:24 +00:00
import { Auth , authorize , getToken , updateAuth } from "./auth" ;
2024-01-15 16:36:24 +00:00
import { Review , ReviewDBCurrentUser , ReviewDBUser , ReviewType } from "./entities" ;
2024-01-14 21:46:24 +00:00
import { settings } from "./settings" ;
2024-01-22 00:18:48 +00:00
import { showToast } from "./utils" ;
2024-01-14 21:46:24 +00:00
2024-01-15 16:36:24 +00:00
const API_URL = "https://manti.vendicated.dev/api/reviewdb" ;
2024-01-14 21:46:24 +00:00
export const REVIEWS_PER_PAGE = 50 ;
export interface Response {
message : string ;
reviews : Review [ ] ;
updated : boolean ;
hasNextPage : boolean ;
reviewCount : number ;
}
const WarningFlag = 0 b00000010 ;
2024-01-22 00:18:48 +00:00
async function rdbRequest ( path : string , options : RequestInit = { } ) {
return fetch ( API_URL + path , {
. . . options ,
headers : {
. . . options . headers ,
Authorization : await getToken ( ) || "" ,
}
} ) ;
}
2024-01-14 21:46:24 +00:00
export async function getReviews ( id : string , offset = 0 ) : Promise < Response > {
let flags = 0 ;
if ( ! settings . store . showWarning ) flags |= WarningFlag ;
const params = new URLSearchParams ( {
flags : String ( flags ) ,
offset : String ( offset )
} ) ;
2024-01-15 16:36:24 +00:00
const req = await fetch ( ` ${ API_URL } /users/ ${ id } /reviews? ${ params } ` ) ;
2024-01-14 21:46:24 +00:00
2024-01-22 00:18:48 +00:00
const res = ( req . ok )
2024-01-14 21:46:24 +00:00
? await req . json ( ) as Response
: {
2024-01-15 16:36:24 +00:00
message : req.status === 429 ? "You are sending requests too fast. Wait a few seconds and try again." : "An Error occured while fetching reviews. Please try again later." ,
2024-01-14 21:46:24 +00:00
reviews : [ ] ,
updated : false ,
hasNextPage : false ,
reviewCount : 0
} ;
2024-01-22 00:18:48 +00:00
if ( ! req . ok ) {
2024-01-14 21:46:24 +00:00
showToast ( res . message , Toasts . Type . FAILURE ) ;
return {
. . . res ,
reviews : [
{
id : 0 ,
2024-01-15 16:36:24 +00:00
comment : res.message ,
2024-01-14 21:46:24 +00:00
star : 0 ,
timestamp : 0 ,
2024-01-15 16:36:24 +00:00
type : ReviewType . System ,
2024-01-14 21:46:24 +00:00
sender : {
id : 0 ,
2024-01-15 16:36:24 +00:00
username : "ReviewDB" ,
profilePhoto : "https://cdn.discordapp.com/avatars/1134864775000629298/3f87ad315b32ee464d84f1270c8d1b37.png?size=256&format=webp&quality=lossless" ,
discordID : "1134864775000629298" ,
2024-01-14 21:46:24 +00:00
badges : [ ]
}
}
]
} ;
}
return res ;
}
export async function addReview ( review : any ) : Promise < Response | null > {
2024-01-22 00:18:48 +00:00
const token = await getToken ( ) ;
if ( ! token ) {
2024-01-14 21:46:24 +00:00
showToast ( "Please authorize to add a review." ) ;
authorize ( ) ;
return null ;
}
2024-01-22 00:18:48 +00:00
return await rdbRequest ( ` /users/ ${ review . userid } /reviews ` , {
2024-01-14 21:46:24 +00:00
method : "PUT" ,
body : JSON.stringify ( review ) ,
headers : {
"Content-Type" : "application/json" ,
}
2024-01-22 00:18:48 +00:00
} ) . then ( async r = > {
const data = await r . json ( ) as Response ;
showToast ( data . message ) ;
return r . ok ? data : null ;
} ) ;
2024-01-14 21:46:24 +00:00
}
2024-01-22 00:18:48 +00:00
export async function deleteReview ( id : number ) : Promise < Response | null > {
return await rdbRequest ( ` /users/ ${ id } /reviews ` , {
2024-01-14 21:46:24 +00:00
method : "DELETE" ,
2024-02-20 18:13:25 +00:00
headers : {
2024-01-14 21:46:24 +00:00
"Content-Type" : "application/json" ,
Accept : "application/json" ,
2024-02-20 18:13:25 +00:00
} ,
2024-01-14 21:46:24 +00:00
body : JSON.stringify ( {
reviewid : id
} )
2024-01-22 00:18:48 +00:00
} ) . then ( async r = > {
const data = await r . json ( ) as Response ;
showToast ( data . message ) ;
return r . ok ? data : null ;
} ) ;
2024-01-14 21:46:24 +00:00
}
export async function reportReview ( id : number ) {
2024-01-22 00:18:48 +00:00
const res = await rdbRequest ( "/reports" , {
2024-01-14 21:46:24 +00:00
method : "PUT" ,
2024-02-20 18:13:25 +00:00
headers : {
2024-01-14 21:46:24 +00:00
"Content-Type" : "application/json" ,
Accept : "application/json" ,
2024-02-20 18:13:25 +00:00
} ,
2024-01-14 21:46:24 +00:00
body : JSON.stringify ( {
reviewid : id ,
} )
} ) . then ( r = > r . json ( ) ) as Response ;
showToast ( res . message ) ;
}
async function patchBlock ( action : "block" | "unblock" , userId : string ) {
2024-01-22 00:18:48 +00:00
const res = await rdbRequest ( "/blocks" , {
2024-01-14 21:46:24 +00:00
method : "PATCH" ,
2024-02-20 18:13:25 +00:00
headers : {
2024-01-14 21:46:24 +00:00
"Content-Type" : "application/json" ,
Accept : "application/json" ,
2024-02-20 18:13:25 +00:00
} ,
2024-01-14 21:46:24 +00:00
body : JSON.stringify ( {
action : action ,
discordId : userId
} )
} ) ;
if ( ! res . ok ) {
showToast ( ` Failed to ${ action } user ` , Toasts . Type . FAILURE ) ;
} else {
showToast ( ` Successfully ${ action } ed user ` , Toasts . Type . SUCCESS ) ;
if ( Auth ? . user ? . blockedUsers ) {
const newBlockedUsers = action === "block"
? [ . . . Auth . user . blockedUsers , userId ]
: Auth . user . blockedUsers . filter ( id = > id !== userId ) ;
updateAuth ( { user : { . . . Auth . user , blockedUsers : newBlockedUsers } } ) ;
}
}
}
export const blockUser = ( userId : string ) = > patchBlock ( "block" , userId ) ;
export const unblockUser = ( userId : string ) = > patchBlock ( "unblock" , userId ) ;
export async function fetchBlocks ( ) : Promise < ReviewDBUser [ ] > {
2024-01-22 00:18:48 +00:00
const res = await rdbRequest ( "/blocks" , {
2024-01-14 21:46:24 +00:00
method : "GET" ,
2024-02-20 18:13:25 +00:00
headers : {
2024-01-14 21:46:24 +00:00
Accept : "application/json" ,
2024-02-20 18:13:25 +00:00
}
2024-01-14 21:46:24 +00:00
} ) ;
if ( ! res . ok ) throw new Error ( ` ${ res . status } : ${ res . statusText } ` ) ;
return res . json ( ) ;
}
export function getCurrentUserInfo ( token : string ) : Promise < ReviewDBCurrentUser > {
2024-01-22 00:18:48 +00:00
return rdbRequest ( "/users" , {
2024-01-14 21:46:24 +00:00
method : "POST" ,
} ) . then ( r = > r . json ( ) ) ;
}
export async function readNotification ( id : number ) {
2024-01-22 00:18:48 +00:00
return rdbRequest ( ` /notifications?id= ${ id } ` , {
method : "PATCH"
2024-01-14 21:46:24 +00:00
} ) ;
}