mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-11 13:14:06 +01:00
✨ createChannel()
This commit is contained in:
parent
8a13a1f2ea
commit
4715ef1eab
@ -13,6 +13,7 @@ import { HTTPError } from "lambert-server";
|
|||||||
import { ChannelModifySchema } from "../../../schema/Channel";
|
import { ChannelModifySchema } from "../../../schema/Channel";
|
||||||
import { emitEvent } from "../../../util/Event";
|
import { emitEvent } from "../../../util/Event";
|
||||||
import { check } from "../../../util/instanceOf";
|
import { check } from "../../../util/instanceOf";
|
||||||
|
import { createChannel } from "../../../util/Channel";
|
||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
router.get("/", async (req, res) => {
|
router.get("/", async (req, res) => {
|
||||||
@ -26,41 +27,7 @@ router.post("/", check(ChannelModifySchema), async (req, res) => {
|
|||||||
const { guild_id } = req.params;
|
const { guild_id } = req.params;
|
||||||
const body = req.body as ChannelModifySchema;
|
const body = req.body as ChannelModifySchema;
|
||||||
|
|
||||||
if (!body.permission_overwrites) body.permission_overwrites = [];
|
const channel = await createChannel({ ...body, guild_id }, req.user_id);
|
||||||
if (!body.topic) body.topic = "";
|
|
||||||
if (!body.rate_limit_per_user) body.rate_limit_per_user = 0;
|
|
||||||
|
|
||||||
switch (body.type) {
|
|
||||||
case ChannelType.DM:
|
|
||||||
case ChannelType.GROUP_DM:
|
|
||||||
throw new HTTPError("You can't create a dm channel in a guild");
|
|
||||||
// TODO:
|
|
||||||
case ChannelType.GUILD_STORE:
|
|
||||||
throw new HTTPError("Not yet supported");
|
|
||||||
case ChannelType.GUILD_NEWS:
|
|
||||||
// TODO: check if guild is community server
|
|
||||||
}
|
|
||||||
|
|
||||||
if (body.parent_id) {
|
|
||||||
const exists = await ChannelModel.findOne({ id: body.parent_id }, { guild_id: true }).exec();
|
|
||||||
if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400);
|
|
||||||
if (exists.guild_id !== guild_id) throw new HTTPError("The category channel needs to be in the guild");
|
|
||||||
}
|
|
||||||
|
|
||||||
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
|
|
||||||
if (!guild) throw new HTTPError("Guild not found", 404);
|
|
||||||
|
|
||||||
const channel = {
|
|
||||||
...body,
|
|
||||||
id: Snowflake.generate(),
|
|
||||||
created_at: new Date(),
|
|
||||||
guild_id,
|
|
||||||
recipients: null
|
|
||||||
};
|
|
||||||
|
|
||||||
await new ChannelModel(channel).save();
|
|
||||||
|
|
||||||
await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id } as ChannelCreateEvent);
|
|
||||||
|
|
||||||
res.json(channel);
|
res.json(channel);
|
||||||
});
|
});
|
||||||
|
@ -54,15 +54,4 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response)
|
|||||||
return res.send(data);
|
return res.send(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get("/vanity-url", async (req: Request, res: Response) => {
|
|
||||||
const { guild_id } = req.params;
|
|
||||||
|
|
||||||
const guild = await GuildModel.findOne({ id: guild_id }).exec();
|
|
||||||
if (!guild) throw new HTTPError("Guild does not exist", 404);
|
|
||||||
|
|
||||||
if (!guild.vanity_url) throw new HTTPError("This guild has no vanity url", 204);
|
|
||||||
|
|
||||||
return res.json(guild.vanity_url);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
@ -6,6 +6,7 @@ import { GuildCreateSchema } from "../../schema/Guild";
|
|||||||
import Config from "../../util/Config";
|
import Config from "../../util/Config";
|
||||||
import { getPublicUser } from "../../util/User";
|
import { getPublicUser } from "../../util/User";
|
||||||
import { addMember } from "../../util/Member";
|
import { addMember } from "../../util/Member";
|
||||||
|
import { createChannel } from "../../util/Channel";
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
|
|
||||||
@ -80,7 +81,8 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) =
|
|||||||
}).save()
|
}).save()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await addMember(req.user_id, guild_id, { guild: guild_doc });
|
await createChannel({ name: "general", type: 0, guild_id, position: 0, permission_overwrites: [] }, req.user_id);
|
||||||
|
await addMember(req.user_id, guild_id);
|
||||||
|
|
||||||
res.status(201).json({ id: guild.id });
|
res.status(201).json({ id: guild.id });
|
||||||
});
|
});
|
||||||
|
@ -7,7 +7,7 @@ export const InviteCreateSchema = {
|
|||||||
$temporary: Boolean,
|
$temporary: Boolean,
|
||||||
$unique: Boolean,
|
$unique: Boolean,
|
||||||
$target_user: String,
|
$target_user: String,
|
||||||
$target_user_type: Number,
|
$target_user_type: Number
|
||||||
};
|
};
|
||||||
export interface InviteCreateSchema {
|
export interface InviteCreateSchema {
|
||||||
target_user_id?: String;
|
target_user_id?: String;
|
||||||
|
@ -1,34 +1,17 @@
|
|||||||
export const RoleCreateSchema = {
|
|
||||||
name: String,
|
|
||||||
permissions: BigInt,
|
|
||||||
color: Number,
|
|
||||||
hoist: Boolean, // whether the role should be displayed separately in the sidebar
|
|
||||||
mentionable: Boolean // whether the role should be mentionable
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface RoleCreateSchema {
|
|
||||||
name: string,
|
|
||||||
permissions: BigInt,
|
|
||||||
color: number,
|
|
||||||
hoist: boolean, // whether the role should be displayed separately in the sidebar
|
|
||||||
mentionable: boolean // whether the role should be mentionable
|
|
||||||
}
|
|
||||||
|
|
||||||
export const RoleModifySchema = {
|
export const RoleModifySchema = {
|
||||||
$name: String,
|
$name: String,
|
||||||
$permissions: BigInt,
|
$permissions: BigInt,
|
||||||
$color: Number,
|
$color: Number,
|
||||||
$hoist: Boolean, // whether the role should be displayed separately in the sidebar
|
$hoist: Boolean, // whether the role should be displayed separately in the sidebar
|
||||||
$mentionable: Boolean, // whether the role should be mentionable
|
$mentionable: Boolean, // whether the role should be mentionable
|
||||||
$position: Number,
|
$position: Number
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface RoleModifySchema {
|
export interface RoleModifySchema {
|
||||||
name?: string,
|
name?: string;
|
||||||
permissions?: BigInt,
|
permissions?: BigInt;
|
||||||
color?: number,
|
color?: number;
|
||||||
hoist?: boolean, // whether the role should be displayed separately in the sidebar
|
hoist?: boolean; // whether the role should be displayed separately in the sidebar
|
||||||
mentionable?: boolean, // whether the role should be mentionable
|
mentionable?: boolean; // whether the role should be mentionable
|
||||||
position?: number,
|
position?: number;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
import { getPermission } from "@fosscord/server-util";
|
import { Snowflake } from "@fosscord/server-util";
|
||||||
|
|
||||||
async function main() {
|
console.log(Snowflake.deconstruct("0"));
|
||||||
const t = await getPermission("811642917432066048", "812327318532915201");
|
|
||||||
console.log(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
|
54
src/util/Channel.ts
Normal file
54
src/util/Channel.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import {
|
||||||
|
ChannelCreateEvent,
|
||||||
|
ChannelModel,
|
||||||
|
ChannelType,
|
||||||
|
getPermission,
|
||||||
|
GuildModel,
|
||||||
|
Snowflake,
|
||||||
|
TextChannel,
|
||||||
|
VoiceChannel
|
||||||
|
} from "@fosscord/server-util";
|
||||||
|
import { HTTPError } from "lambert-server";
|
||||||
|
import { emitEvent } from "./Event";
|
||||||
|
|
||||||
|
// TODO: DM channel
|
||||||
|
export async function createChannel(channel: Partial<TextChannel | VoiceChannel>, user_id: string = "0") {
|
||||||
|
if (!channel.permission_overwrites) channel.permission_overwrites = [];
|
||||||
|
|
||||||
|
switch (channel.type) {
|
||||||
|
case ChannelType.GUILD_TEXT:
|
||||||
|
case ChannelType.GUILD_VOICE:
|
||||||
|
break;
|
||||||
|
case ChannelType.DM:
|
||||||
|
case ChannelType.GROUP_DM:
|
||||||
|
throw new HTTPError("You can't create a dm channel in a guild");
|
||||||
|
// TODO: check if guild is community server
|
||||||
|
case ChannelType.GUILD_STORE:
|
||||||
|
case ChannelType.GUILD_NEWS:
|
||||||
|
default:
|
||||||
|
throw new HTTPError("Not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
const permissions = await getPermission(user_id, channel.guild_id);
|
||||||
|
permissions.hasThrow("MANAGE_CHANNELS");
|
||||||
|
|
||||||
|
if (channel.parent_id) {
|
||||||
|
const exists = await ChannelModel.findOne({ id: channel.parent_id }, { guild_id: true }).exec();
|
||||||
|
if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400);
|
||||||
|
if (exists.guild_id !== channel.guild_id) throw new HTTPError("The category channel needs to be in the guild");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: auto generate position
|
||||||
|
|
||||||
|
channel = await new ChannelModel({
|
||||||
|
...channel,
|
||||||
|
id: Snowflake.generate(),
|
||||||
|
created_at: new Date(),
|
||||||
|
// @ts-ignore
|
||||||
|
recipients: null
|
||||||
|
}).save();
|
||||||
|
|
||||||
|
await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id: channel.guild_id } as ChannelCreateEvent);
|
||||||
|
|
||||||
|
return channel;
|
||||||
|
}
|
@ -5,7 +5,8 @@ import { Tuple } from "lambert-server";
|
|||||||
import "missing-native-js-functions";
|
import "missing-native-js-functions";
|
||||||
|
|
||||||
export const OPTIONAL_PREFIX = "$";
|
export const OPTIONAL_PREFIX = "$";
|
||||||
export const EMAIL_REGEX = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
export const EMAIL_REGEX =
|
||||||
|
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
||||||
|
|
||||||
export function check(schema: any) {
|
export function check(schema: any) {
|
||||||
return (req: Request, res: Response, next: NextFunction) => {
|
return (req: Request, res: Response, next: NextFunction) => {
|
||||||
@ -27,9 +28,9 @@ export function FieldErrors(fields: Record<string, { code?: string; message: str
|
|||||||
_errors: [
|
_errors: [
|
||||||
{
|
{
|
||||||
message,
|
message,
|
||||||
code: code || "BASE_TYPE_INVALID",
|
code: code || "BASE_TYPE_INVALID"
|
||||||
},
|
}
|
||||||
],
|
]
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -68,7 +69,7 @@ export function instanceOf(
|
|||||||
optional = false,
|
optional = false,
|
||||||
errors = {},
|
errors = {},
|
||||||
req,
|
req,
|
||||||
ref,
|
ref
|
||||||
}: { path?: string; optional?: boolean; errors?: any; req: Request; ref?: { key: string | number; obj: any } }
|
}: { path?: string; optional?: boolean; errors?: any; req: Request; ref?: { key: string | number; obj: any } }
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (!ref) ref = { obj: null, key: "" };
|
if (!ref) ref = { obj: null, key: "" };
|
||||||
@ -131,7 +132,7 @@ export function instanceOf(
|
|||||||
optional,
|
optional,
|
||||||
errors: errors[i],
|
errors: errors[i],
|
||||||
req,
|
req,
|
||||||
ref: { key: i, obj: value },
|
ref: { key: i, obj: value }
|
||||||
}) === true
|
}) === true
|
||||||
) {
|
) {
|
||||||
delete errors[i];
|
delete errors[i];
|
||||||
@ -153,7 +154,7 @@ export function instanceOf(
|
|||||||
throw new FieldError(
|
throw new FieldError(
|
||||||
"BASE_TYPE_BAD_LENGTH",
|
"BASE_TYPE_BAD_LENGTH",
|
||||||
req.t("common:field.BASE_TYPE_BAD_LENGTH", {
|
req.t("common:field.BASE_TYPE_BAD_LENGTH", {
|
||||||
length: `${type.min} - ${type.max}`,
|
length: `${type.min} - ${type.max}`
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -185,7 +186,7 @@ export function instanceOf(
|
|||||||
optional: OPTIONAL,
|
optional: OPTIONAL,
|
||||||
errors: errors[newKey],
|
errors: errors[newKey],
|
||||||
req,
|
req,
|
||||||
ref: { key: newKey, obj: value },
|
ref: { key: newKey, obj: value }
|
||||||
}) === true
|
}) === true
|
||||||
) {
|
) {
|
||||||
delete errors[newKey];
|
delete errors[newKey];
|
||||||
|
Loading…
Reference in New Issue
Block a user