🐛 fix prune

This commit is contained in:
Flam3rboy 2021-10-15 00:35:18 +02:00
parent 85592a980e
commit b844b6b39c
3 changed files with 35 additions and 28 deletions

View File

@ -1,7 +1,6 @@
import { Router, Request, Response } from "express"; import { Router, Request, Response } from "express";
import { Guild, Member, Snowflake } from "@fosscord/util"; import { Guild, Member, Snowflake } from "@fosscord/util";
import { HTTPError } from "lambert-server"; import { LessThan, IsNull } from "typeorm";
import { LessThan } from "typeorm";
import { route } from "@fosscord/api"; import { route } from "@fosscord/api";
const router = Router(); const router = Router();
@ -16,59 +15,68 @@ export const inactiveMembers = async (guild_id: string, user_id: string, days: n
where: [ where: [
{ {
guild_id, guild_id,
last_message_id: LessThan(minId.toString()), last_message_id: LessThan(minId.toString())
}, },
{
last_message_id: IsNull()
}
], ],
relations: ["roles"] relations: ["roles"]
}); });
console.log(members);
if (!members.length) return []; if (!members.length) return [];
//I'm sure I can do this in the above db query ( and it would probably be better to do so ), but oh well. //I'm sure I can do this in the above db query ( and it would probably be better to do so ), but oh well.
if (roles.length && members.length) if (roles.length && members.length) members = members.filter((user) => user.roles?.some((role) => roles.includes(role.id)));
members = members.filter(user => user.roles?.some(role => roles.includes(role.id)));
const me = await Member.findOne({ id: user_id, guild_id }, { relations: ["roles"] }); const me = await Member.findOneOrFail({ id: user_id, guild_id }, { relations: ["roles"] });
if (!me) throw new HTTPError("You are not member of this guild", 403); const myHighestRole = Math.max(...(me.roles?.map((x) => x.position) || []));
const myHighestRole = Math.max(...(me.roles?.map(x => x.position) || []))
const guild = await Guild.findOneOrFail({ where: { id: guild_id } }) const guild = await Guild.findOneOrFail({ where: { id: guild_id } });
members = members.filter(member => members = members.filter(
member.id !== guild.owner_id && //can't kick owner (member) =>
member.roles?.some(role => member.id !== guild.owner_id && //can't kick owner
role.position < myHighestRole || //roles higher than me can't be kicked member.roles?.some(
me.id === guild.owner_id //owner can kick anyone (role) =>
) role.position < myHighestRole || //roles higher than me can't be kicked
) me.id === guild.owner_id //owner can kick anyone
)
);
return members; return members;
} };
router.get("/", async (req: Request, res: Response) => { router.get("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => {
const days = parseInt(req.query.days as string); const days = parseInt(req.query.days as string);
var roles = req.query.include_roles; var roles = req.query.include_roles;
if (typeof roles === 'string') roles = [roles]; //express will return array otherwise if (typeof roles === "string") roles = [roles]; //express will return array otherwise
const members = await inactiveMembers(req.params.guild_id, req.user_id, days, roles as string[]); const members = await inactiveMembers(req.params.guild_id, req.user_id, days, roles as string[]);
res.send({ pruned: members.length }); res.send({ pruned: members.length });
}); });
export interface PruneSchema {
/**
* @min 0
*/
days: number;
}
router.post("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => { router.post("/", route({ permission: "KICK_MEMBERS" }), async (req: Request, res: Response) => {
const days = parseInt(req.body.days); const days = parseInt(req.body.days);
var roles = req.query.include_roles; var roles = req.query.include_roles;
if (typeof roles === 'string') roles = [roles]; if (typeof roles === "string") roles = [roles];
const { guild_id } = req.params; const { guild_id } = req.params;
const members = await inactiveMembers(guild_id, req.user_id, days, roles as string[]); const members = await inactiveMembers(guild_id, req.user_id, days, roles as string[]);
for (var curr of members) { await Promise.all(members.map((x) => Member.removeFromGuild(x.id, guild_id)));
await Member.removeFromGuild(curr.id, guild_id);
}
res.send({ purged: members.length }); res.send({ purged: members.length });
}) });
export default router; export default router;

View File

@ -84,8 +84,8 @@ export class Member extends BaseClassWithoutId {
@Column({ type: "simple-json" }) @Column({ type: "simple-json" })
settings: UserGuildSettings; settings: UserGuildSettings;
@Column() @Column({ nullable: true })
last_message_id: string; last_message_id?: string;
// TODO: update // TODO: update
// @Column({ type: "simple-json" }) // @Column({ type: "simple-json" })
@ -233,7 +233,6 @@ export class Member extends BaseClassWithoutId {
deaf: false, deaf: false,
mute: false, mute: false,
pending: false, pending: false,
last_message_id: "",
}; };
await Promise.all([ await Promise.all([

View File

@ -84,7 +84,7 @@ export class Snowflake {
} }
static generate() { static generate() {
var time = BigInt(Date.now() - Snowflake.EPOCH) << 22n; var time = BigInt(Date.now() - Snowflake.EPOCH) << BigInt(22);
var worker = Snowflake.workerId << 17n; var worker = Snowflake.workerId << 17n;
var process = Snowflake.processId << 12n; var process = Snowflake.processId << 12n;
var increment = Snowflake.INCREMENT++; var increment = Snowflake.INCREMENT++;