This commit is contained in:
Flam3rboy
2021-09-12 23:28:56 +02:00
parent e2c66a1fe5
commit 6ba9c834bd
75 changed files with 7703 additions and 1550 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ import {
import { HTTPError } from "lambert-server";
import fetch from "node-fetch";
import cheerio from "cheerio";
import { MessageCreateSchema } from "../schema/Message";
import { MessageCreateSchema } from "../routes/channels/#channel_id/messages";
// TODO: check webhook, application, system author
+25 -25
View File
@@ -1,32 +1,32 @@
import {Config} from "@fosscord/util";
import {distanceBetweenLocations, IPAnalysis} from "./ipAddress";
import { Config } from "@fosscord/util";
import { distanceBetweenLocations, IPAnalysis } from "./ipAddress";
export async function getVoiceRegions(ipAddress: string, vip: boolean) {
const regions = Config.get().regions;
const availableRegions = regions.available.filter(ar => vip ? true : !ar.vip);
let optimalId = regions.default
const regions = Config.get().regions;
const availableRegions = regions.available.filter((ar) => (vip ? true : !ar.vip));
let optimalId = regions.default;
if(!regions.useDefaultAsOptimal) {
const clientIpAnalysis = await IPAnalysis(ipAddress)
if (!regions.useDefaultAsOptimal) {
const clientIpAnalysis = await IPAnalysis(ipAddress);
let min = Number.POSITIVE_INFINITY
let min = Number.POSITIVE_INFINITY;
for (let ar of availableRegions) {
//TODO the endpoint location should be saved in the database if not already present to prevent IPAnalysis call
const dist = distanceBetweenLocations(clientIpAnalysis, ar.location || (await IPAnalysis(ar.endpoint)))
for (let ar of availableRegions) {
//TODO the endpoint location should be saved in the database if not already present to prevent IPAnalysis call
const dist = distanceBetweenLocations(clientIpAnalysis, ar.location || (await IPAnalysis(ar.endpoint)));
if(dist < min) {
min = dist
optimalId = ar.id
}
}
}
if (dist < min) {
min = dist;
optimalId = ar.id;
}
}
}
return availableRegions.map(ar => ({
id: ar.id,
name: ar.name,
custom: ar.custom,
deprecated: ar.deprecated,
optimal: ar.id === optimalId
}))
}
return availableRegions.map((ar) => ({
id: ar.id,
name: ar.name,
custom: ar.custom,
deprecated: ar.deprecated,
optimal: ar.id === optimalId
}));
}
-54
View File
@@ -1,54 +0,0 @@
import { Channel, ChannelType, DiscordApiErrors, emitEvent, getPermission, VoiceState, VoiceStateUpdateEvent } from "@fosscord/util";
import { VoiceStateUpdateSchema } from "../schema";
//TODO need more testing when community guild and voice stage channel are working
export async function updateVoiceState(vsuSchema: VoiceStateUpdateSchema, guildId: string, userId: string, targetUserId?: string) {
const perms = await getPermission(userId, guildId, vsuSchema.channel_id);
/*
From https://discord.com/developers/docs/resources/guild#modify-current-user-voice-state
You must have the MUTE_MEMBERS permission to unsuppress yourself. You can always suppress yourself.
You must have the REQUEST_TO_SPEAK permission to request to speak. You can always clear your own request to speak.
*/
if (targetUserId !== undefined || (vsuSchema.suppress !== undefined && !vsuSchema.suppress)) {
perms.hasThrow("MUTE_MEMBERS");
}
if (vsuSchema.request_to_speak_timestamp !== undefined && vsuSchema.request_to_speak_timestamp !== "") {
perms.hasThrow("REQUEST_TO_SPEAK")
}
if (!targetUserId) {
targetUserId = userId;
} else {
if (vsuSchema.suppress !== undefined && vsuSchema.suppress)
vsuSchema.request_to_speak_timestamp = "" //Need to check if empty string is the right value
}
//TODO assumed that empty string means clean, need to test if it's right
let voiceState
try {
voiceState = await VoiceState.findOneOrFail({
guild_id: guildId,
channel_id: vsuSchema.channel_id,
user_id: targetUserId
});
} catch (error) {
throw DiscordApiErrors.UNKNOWN_VOICE_STATE;
}
voiceState.assign(vsuSchema);
const channel = await Channel.findOneOrFail({ guild_id: guildId, id: vsuSchema.channel_id })
if (channel.type !== ChannelType.GUILD_STAGE_VOICE) {
throw DiscordApiErrors.CANNOT_EXECUTE_ON_THIS_CHANNEL_TYPE;
}
await Promise.all([
voiceState.save(),
emitEvent({
event: "VOICE_STATE_UPDATE",
data: voiceState,
guild_id: guildId
} as VoiceStateUpdateEvent)]);
return;
}
-1
View File
@@ -8,4 +8,3 @@ export * from "./RandomInviteID";
export * from "./route";
export * from "./String";
export * from "./Voice";
export * from "./VoiceState";
+12 -2
View File
@@ -5,10 +5,20 @@ import path from "path";
import Ajv from "ajv";
import { AnyValidateFunction } from "ajv/dist/core";
import { FieldErrors } from "..";
import addFormats from "ajv-formats";
const SchemaPath = path.join(__dirname, "..", "..", "assets", "schemas.json");
const schemas = JSON.parse(fs.readFileSync(SchemaPath, { encoding: "utf8" }));
export const ajv = new Ajv({ allErrors: true, parseDate: true, allowDate: true, schemas, messages: true });
export const ajv = new Ajv({
allErrors: true,
parseDate: true,
allowDate: true,
schemas,
messages: true,
strict: true,
strictRequired: true
});
addFormats(ajv);
declare global {
namespace Express {
@@ -19,7 +29,7 @@ declare global {
}
export type RouteSchema = string; // typescript interface name
export type RouteResponse = { status: number; body?: RouteSchema; headers?: Record<string, string> };
export type RouteResponse = { status?: number; body?: RouteSchema; headers?: Record<string, string> };
export interface RouteOptions {
permission?: PermissionResolvable;