🐛 fix prune
This commit is contained in:
parent
85592a980e
commit
b844b6b39c
@ -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) =>
|
||||||
member.id !== guild.owner_id && //can't kick owner
|
member.id !== guild.owner_id && //can't kick owner
|
||||||
member.roles?.some(role =>
|
member.roles?.some(
|
||||||
|
(role) =>
|
||||||
role.position < myHighestRole || //roles higher than me can't be kicked
|
role.position < myHighestRole || //roles higher than me can't be kicked
|
||||||
me.id === guild.owner_id //owner can kick anyone
|
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;
|
||||||
|
@ -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([
|
||||||
|
@ -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++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user