lampdiscordbot/activitytracker.js

116 lines
4.2 KiB
JavaScript

var client = require("./client");
var config = require("./config");
var app = require("./www");
var DataStore = require("./datastore");
var ds = new DataStore("activity");
app.get("/detect/:code", (req, res) => {
res.sendFile(process.cwd() + "/track-image.png");
if (req.headers["user-agent"].includes("Discordbot")) return;
onActivity(ds.get(req.params.code));
ds.del(req.params.code);
});
client.on("messageCreate", async m => m.guildId == config.guild && onActivity(m.author.id));
client.on("interactionCreate", async i => i.guildId == config.guild && onActivity(i.user.id));
client.on("typingStart", async t => t.guild?.id == config.guild && onActivity(t.user.id));
client.on("guildMemberAdd", async m => m.guild.id == config.guild && onActivity(m.user.id));
client.on("messageReactionAdd", async (r, user) => r.message?.guild?.id == config.guild && onActivity(user.id));
client.on("messageReactionRemove", async (r, user) => r.message?.guild?.id == config.guild && onActivity(user.id));
client.on("messageUpdate", async (oldMessage, newMessage) => newMessage.guild?.id == config.guild && (oldMessage.editedAt != newMessage.editedAt) && onActivity(newMessage.author.id));
async function onActivity(user_id) {
if (!user_id) return;
let user = client.users.resolve(user_id);
if (!user || user.bot) return;
ds.put(user_id, Date.now());
if (ds.get(user_id + "deactivated")) {
let member = client.guilds.resolve(config.guild).members.resolve(user_id);
await reactivateMember(member);
/*await client.channels.resolve(config.default_channel)?.send(random([
`${member.displayName} bacc`,
`${member.displayName} is bacc`,
`hi ${member.displayName}`
]));*/
}
}
module.exports.interval = setInterval(async () => {
var guild = client.guilds.resolve(config.guild);
if (!guild) return;
guild.members.cache.filter(m => !m.user.bot).forEach(member => {
let lastActivityTime = ds.get(member.user.id);
if (!lastActivityTime) return;
if (Date.now() - lastActivityTime > 1000*60*60*72) { // if last activity > 72 hours ago
if (!ds.get(member.id + "deactivated"))
deactivateMember(member);
}
});
}, 60*60*1000); // every hour i guess
async function deactivateMember(member) {
await member.roles.add(config.inactive_role);
ds.put(member.id + "deactivated");
ds.put(member.id, Date.now());
var magic_channel = client.channels.resolve(ds.get(member.id + "magicchannelid"));
if (!magic_channel) {
magic_channel = await member.guild.channels.create("inactive", {
permissionOverwrites: [
{
id: member.guild.roles.everyone,
deny: "VIEW_CHANNEL"
},
{
id: client.user,
allow: "VIEW_CHANNEL"
},
{
id: member,
allow: "VIEW_CHANNEL"
}
]
});
ds.put(member.id + "magicchannelid", magic_channel.id);
} else {
magic_channel.permissionOverwrites.edit(member, {"VIEW_CHANNEL": true});
}
var magic_channel_message_id = ds.get(member.id + "magicchannelmessage");
var unique_code = Math.random().toString();
ds.put(unique_code, member.id);
var content = `${config.base_uri}/detect/${unique_code}`;
if (!magic_channel_message_id) {
var magic_channel_message = await magic_channel.send({content});
ds.put(member.id + "magicchannelmessage", magic_channel_message.id)
} else {
await magic_channel.messages.edit(magic_channel_message_id, {content});
}
}
async function reactivateMember(member) {
await member.roles.remove(config.inactive_role);
ds.del(member.id + "deactivated");
var magic_channel = client.channels.resolve(ds.get(member.id + "magicchannelid"));
if (magic_channel) await magic_channel.permissionOverwrites.edit(member, {"VIEW_CHANNEL": false});
}
module.exports.deactivateMember = deactivateMember;
module.exports.reactivateMember = reactivateMember;
client.on("messageCreate", async message => {
if (message.guildId != config.guild) return;
let deactivatedMembersMentionedViaRoles = [...new Set(message.mentions.roles.flatMap(r => r.members).values())].filter(x => ds.get(x.id + "deactivated"));
if (deactivatedMembersMentionedViaRoles.length) {
for (let m of deactivatedMembersMentionedViaRoles) await reactivateMember(m);
await message.reply({content: deactivatedMembersMentionedViaRoles.map(String).join(' '), allowedMentions:{repliedUser: false}});
}
});