Merge pull request 'graphql' (#81) from graphql into main
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 6m0s
All checks were successful
Main / build-and-push-docker-image (20.x) (push) Successful in 6m0s
Reviewed-on: #81
This commit is contained in:
@@ -8,3 +8,5 @@ SERVER_HOST=localhost
|
||||
SERVER_PORT=3000
|
||||
BOT_ADMINS=[1]
|
||||
GROUP_IDS=-
|
||||
GRAPHQL_URL=http://localhost:3000/api/graphql
|
||||
GRAPHQL_API_TOKEN="token-here"
|
||||
@@ -13,6 +13,7 @@ services:
|
||||
- SERVER_PORT=${SERVER_PORT}
|
||||
- BOT_ADMINS=${BOT_ADMINS}
|
||||
- GROUP_IDS=${GROUP_IDS}
|
||||
- GRAPHQL_URL=${GRAPHQL_URL}
|
||||
ports:
|
||||
- "3000:80"
|
||||
volumes:
|
||||
|
||||
@@ -14,5 +14,6 @@ services:
|
||||
- SERVER_PORT=${SERVER_PORT}
|
||||
- BOT_ADMINS=${BOT_ADMINS}
|
||||
- GROUP_IDS=${GROUP_IDS}
|
||||
- GRAPHQL_URL=${GRAPHQL_URL}
|
||||
build:
|
||||
context: .
|
||||
|
||||
@@ -14,5 +14,6 @@ services:
|
||||
- SERVER_PORT=${SERVER_PORT}
|
||||
- BOT_ADMINS=${BOT_ADMINS}
|
||||
- GROUP_IDS=${GROUP_IDS}
|
||||
- GRAPHQL_URL=${GRAPHQL_URL}
|
||||
build:
|
||||
context: .
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "no-twitter-bot",
|
||||
"type": "module",
|
||||
"version": "3.0.0",
|
||||
"version": "3.1.0",
|
||||
"private": true,
|
||||
"packageManager": "yarn@4.9.2",
|
||||
"description": "This grammY powered Telegram bot is designed to delete Twitter/X links and reformat services from whitelisted groups. This one is the main bot for the LCM Telegram groups/communities.",
|
||||
@@ -34,6 +34,7 @@
|
||||
"@grammyjs/runner": "2.0.3",
|
||||
"@grammyjs/types": "3.22.2",
|
||||
"@hono/node-server": "1.19.4",
|
||||
"@urql/core": "^6.0.1",
|
||||
"callback-data": "1.1.1",
|
||||
"grammy": "1.38.2",
|
||||
"hono": "4.9.9",
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -14,6 +16,8 @@ feature.hears(
|
||||
/^\/botInfo/,
|
||||
logHandle("bot-info-command"),
|
||||
async (ctx: Context) => {
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
// Checks if the context includes a message property.
|
||||
if (ctx.msg && ctx.chat && ctx.msg.from) {
|
||||
// Doesn't respond to regular users in groups. This is to prevent users spamming the command.
|
||||
@@ -25,6 +29,11 @@ feature.hears(
|
||||
}
|
||||
}
|
||||
|
||||
await urql
|
||||
.mutation(increment, { command: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the message.
|
||||
await ctx.reply(
|
||||
`I am a bot designed to delete any Twitter/X and Meta links along with corresponding reformatting services\\. I now check embedded links\\!`,
|
||||
@@ -48,13 +57,15 @@ feature.hears(
|
||||
}
|
||||
);
|
||||
return await ctx.reply(
|
||||
`Lucid decided it was time to make a statement\\. Twitter\\/X is not safe anymore\\. The fandom doesn\\'t need it\\. It should be boycotted and not allowed anymore\\. Thus decided to try making this bot public-use to test it's viability\\. Feel free to add this bot into your own group\\. All it needs is an admin role with the permission to delete messages\\.`,
|
||||
`Lucid decided it was time to make a statement\\. Twitter\\/X is not safe anymore\\. The fandom doesn\\'t need it\\. It should be boycotted and not allowed anymore\\. Thus decided to try making this bot public\\-use to test it's viability\\. Feel free to add this bot into your own group\\. All it needs is an admin role with the permission to delete messages\\.`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -3,6 +3,10 @@ import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import metaLinkCheck from "#root/lib/metaLinkCheck.js";
|
||||
import twitterLinkCheck from "#root/lib/twitterLinkCheck.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
import addGroup from "#root/lib/graphql/mutations/addGroupMutation.js";
|
||||
import incrementGroup from "#root/lib/graphql/mutations/incrementGroupMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -13,20 +17,16 @@ const feature = composer.chatType(["group", "supergroup"]);
|
||||
* The trigger is anytime an embedded url is detected.
|
||||
*/
|
||||
feature.on("message::url", logHandle("embed-check"), async (ctx: Context) => {
|
||||
if (ctx.chat && ctx.msg) {
|
||||
// Pulling the group IDs from the env variables.
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
if (ctx.chat && ctx.msg) {
|
||||
if (GROUP_IDS !== undefined) {
|
||||
// Checking if the message is from a whitelisted group.
|
||||
const groupID = ctx.chat.id;
|
||||
const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
const groupName = ctx.chat?.title;
|
||||
const groupID = ctx.chat?.id;
|
||||
const groupUsername = ctx.chat?.username;
|
||||
let deletedLinks = 0;
|
||||
|
||||
const username = ctx.msg.from?.username;
|
||||
|
||||
if (flag) {
|
||||
// Filters every message/caption entity that is a url into a new array.
|
||||
const embeds = ctx.msg.entities
|
||||
? ctx.msg.entities.filter(e => e.type === "text_link")
|
||||
@@ -37,9 +37,7 @@ feature.on("message::url", logHandle("embed-check"), async (ctx: Context) => {
|
||||
|
||||
// If the caption embeds array isn't empty filter through them to check if any is a Twitter/X or Meta url.
|
||||
if (captionEmbeds !== null && captionEmbeds.length) {
|
||||
const metaLinks = captionEmbeds.filter(({ url }) =>
|
||||
metaLinkCheck(url)
|
||||
);
|
||||
const metaLinks = captionEmbeds.filter(({ url }) => metaLinkCheck(url));
|
||||
const twitterLinks = captionEmbeds.filter(({ url }) =>
|
||||
twitterLinkCheck(url)
|
||||
);
|
||||
@@ -48,86 +46,136 @@ feature.on("message::url", logHandle("embed-check"), async (ctx: Context) => {
|
||||
if (metaLinks.length && twitterLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Also Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.\n\nIf this was forwarded from a channel consider forwarding without the caption so the media isn't deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Handle action and response if only meta links are detected.
|
||||
if (metaLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\\n\nIf this was forwarded from a channel consider forwarding without the caption so the media isn't deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Handle action and response if only Twitter/X links are detected.
|
||||
if (twitterLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.\n\nIf this was forwarded from a channel consider forwarding without the caption so the media isn't deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
// If the embeds array isn't empty filter through them to check if any is a Twitter/X or Meta url.
|
||||
if (embeds !== null && embeds.length) {
|
||||
const metaLinks = embeds.filter(({ url }) => metaLinkCheck(url));
|
||||
const twitterLinks = embeds.filter(({ url }) =>
|
||||
twitterLinkCheck(url)
|
||||
);
|
||||
const twitterLinks = embeds.filter(({ url }) => twitterLinkCheck(url));
|
||||
|
||||
// Handle action and response if both meta and Twitter/X links are detected.
|
||||
if (metaLinks.length && twitterLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Also Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Handle action and response if only meta links are detected.
|
||||
if (metaLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Handle action and response if only Twitter/X links are detected.
|
||||
if (twitterLinks.length) {
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
deletedLinks++;
|
||||
|
||||
await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!GROUP_IDS) {
|
||||
console.info("Group IDS:", process.env.GROUP_IDS);
|
||||
return await ctx.reply(
|
||||
`There was a problem retrieving the whitelist\\. Check the env variables and try again\\.`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
if (deletedLinks) {
|
||||
return await urql
|
||||
.mutation(addGroup, { groupID, groupName, groupUsername })
|
||||
.toPromise()
|
||||
.then(() =>
|
||||
urql.mutation(incrementGroup, {
|
||||
groupID,
|
||||
linksDeleted: deletedLinks
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
const feature = composer.chatType(["group", "supergroup"]);
|
||||
|
||||
/**
|
||||
* What triggers this feature and adds to the log when it has been triggered.
|
||||
* The trigger is the command "/botInfo"
|
||||
*/
|
||||
feature.command(
|
||||
"getGroupID",
|
||||
logHandle("get-group-id"),
|
||||
async (ctx: Context) => {
|
||||
// Pulling the group IDs from the env variables.
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
|
||||
// Checks if the context has a chat, msg, and from property.
|
||||
if (ctx.chat && ctx.msg && ctx.msg.from) {
|
||||
if (GROUP_IDS !== undefined) {
|
||||
const groupID = ctx.chat.id;
|
||||
const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
|
||||
// Checks if the group is whitelisted
|
||||
if (flag) {
|
||||
const chatMember = await ctx.getChatMember(ctx.msg.from.id);
|
||||
|
||||
// Checks if the user is an admin
|
||||
if (["creator", "administrator"].includes(chatMember.status)) {
|
||||
return await ctx.reply(`The group id is: \`${groupID}\``, {
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
});
|
||||
}
|
||||
|
||||
// Send a default message if the user is not an admin
|
||||
return await ctx.reply(
|
||||
`You have to be an admin to use this command\\!`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export { composer as getGroupIDCommand };
|
||||
@@ -1,6 +1,8 @@
|
||||
import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -11,12 +13,19 @@ const feature = composer.chatType(["group", "supergroup", "private"]);
|
||||
* The trigger is the command "/help"
|
||||
*/
|
||||
feature.hears(/^\/help/, logHandle("help"), async (ctx: Context) => {
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
// const GROUP_IDS = process.env.GROUP_IDS
|
||||
// ? process.env.GROUP_IDS.split(",")
|
||||
// : undefined;
|
||||
|
||||
// Checks there is a chat and msg property in the context.
|
||||
if (ctx.chat && ctx.msg && ctx.msg.from) {
|
||||
await urql
|
||||
.mutation(increment, { command: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg && ctx.chat && ctx.msg.from) {
|
||||
// Checks if the chat is private
|
||||
if (ctx.chat.type === "private") {
|
||||
// Responds with message.
|
||||
@@ -67,58 +76,8 @@ feature.hears(/^\/help/, logHandle("help"), async (ctx: Context) => {
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
|
||||
// Checks if the whitelist is set up.
|
||||
// if (GROUP_IDS !== undefined) {
|
||||
// const groupID = ctx.chat.id;
|
||||
// const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
|
||||
// // Checks if the chat is in the whitelist.
|
||||
// if (flag) {
|
||||
// // Responds with the command list.
|
||||
// return await ctx.reply(
|
||||
// `**Here are the available commands you can use:**\n\n/getGroupID _ADMIN ONLY_ \\- Replies with the ID of the group I am in\\.\n\n/isWKCGRoup _ADMIN ONLY_ \\- Checks if this group's ID is on the whitelist and responds accordingly\\.\n\n/botInfo _Private Command_\\- Info about me and how to fork me to deploy for your own use\\.\n\n/help\\- Displays this help message\\.`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
|
||||
// Checks if the chat is not in the whitelist.
|
||||
// if (!flag) {
|
||||
// await ctx
|
||||
// // Responds with the command list with a warning that the available commands are limited.
|
||||
// .reply(
|
||||
// `**Since this is not a whitelisted group the features are limited\\!\\!**\n\nHere are the available commands you can use:\n\n/isWKCGRoup _ADMIN ONLY_\\- Checks if this group's ID is on the whitelist and responds accordingly\\.\n\n/botInfo _Private Command_\\- Info about me and how to fork me to deploy for your own use\\.\n\n/help \\- Displays this help message\\.`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// )
|
||||
// .then(() => {});
|
||||
// // Sends a follow-up message with information about the bot.
|
||||
// return await ctx.reply(
|
||||
// `This group is NOT in the whitelisted and is NOT a part of the WKC Telegram groups/communities\\. I am a bot designed to delete any Twitter/X and Meta links along with corresponding reformatting services within whitelisted groups\\. You can fork me from this link: https://github\\.com/lucid\\-creations\\-media/no\\-twitter\\-bot and deploy me for use in your own groups\\!`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// Checks if the whitelist is not set up.
|
||||
// if (!GROUP_IDS) {
|
||||
// // Sends a warning that the whitelist is not set up or the bot cannot access it.
|
||||
// return await ctx.reply(
|
||||
// `There was a problem retrieving the whitelist\\. Check the env variables and try again\\.`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
const feature = composer.chatType(["group", "supergroup"]);
|
||||
|
||||
/**
|
||||
* What triggers this feature and adds to the log when it has been triggered.
|
||||
* The trigger is the command "/isWKCGroup"
|
||||
*/
|
||||
feature.command(
|
||||
"isWKCGroup",
|
||||
logHandle("is-WKC-group"),
|
||||
async (ctx: Context) => {
|
||||
// Pulling the group IDs from the env variables.
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
|
||||
// Checking that context has chat, msg, and msg.from properties
|
||||
if (ctx.chat && ctx.msg && ctx.msg.from) {
|
||||
const groupID = ctx.chat.id;
|
||||
const chatMember = await ctx.getChatMember(ctx.msg.from.id);
|
||||
|
||||
// Checking if the user is an admin.
|
||||
if (["creator", "administrator"].includes(chatMember.status)) {
|
||||
if (GROUP_IDS !== undefined) {
|
||||
const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
|
||||
// Checking if the group is whitelisted.
|
||||
if (flag) {
|
||||
// Confirming that the group is whitelisted and should be deleting detected messages.
|
||||
await ctx.reply(
|
||||
`This group is in the whitelisted and is a part of the WKC Telegram groups/communities\\. I should be deleting any Twitter/X and Meta links along with corresponding reformatting services within this group\\.`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
if (!flag) {
|
||||
// Informing the user that features are blocked because the group is not in the whitelist.
|
||||
await ctx.reply(
|
||||
`This group is NOT in the whitelisted and is NOT a part of the WKC Telegram groups/communities\\. I am a bot designed to delete any Twitter/X and Meta links along with corresponding reformatting services within groups\\. You can fork me from this link: https://github\\.com/lucid\\-creations\\-media/no\\-twitter\\-bot and deploy me for use in your own groups\\!`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!GROUP_IDS) {
|
||||
// Altering that the whitelist is not set or the bot cannot access it.
|
||||
await ctx.reply(
|
||||
`There was a problem retrieving the whitelist\\. Check the env variables and try again\\.`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// Informing the user that they need to be an admin to use this command.
|
||||
await ctx.reply(
|
||||
`You have to be an admin of this group to use this command\\!`,
|
||||
{
|
||||
parse_mode: "MarkdownV2",
|
||||
reply_parameters: { message_id: ctx.msg.message_id }
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export { composer as isWKCGroup };
|
||||
@@ -2,6 +2,10 @@ import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import { metaRegex } from "#root/lib/metaLinkCheck.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
import addGroup from "#root/lib/graphql/mutations/addGroupMutation.js";
|
||||
import incrementGroup from "#root/lib/graphql/mutations/incrementGroupMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -15,52 +19,37 @@ feature.hears(
|
||||
metaRegex,
|
||||
logHandle("blacklist-detection-meta"),
|
||||
async (ctx: Context) => {
|
||||
// Pulling the group IDs from the env variables.
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
if (ctx.chat && ctx.msg) {
|
||||
const username = ctx.msg.from?.username;
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
|
||||
return await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
|
||||
const groupName = ctx.chat?.title;
|
||||
const groupID = ctx.chat?.id;
|
||||
const groupUsername = ctx.chat?.username;
|
||||
|
||||
return await urql
|
||||
.mutation(addGroup, { groupID, groupName, groupUsername })
|
||||
.toPromise()
|
||||
.then(() =>
|
||||
urql.mutation(incrementGroup, { groupID, linksDeleted: 1 })
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// if (ctx.chat && ctx.msg) {
|
||||
// if (GROUP_IDS !== undefined) {
|
||||
// // Checking if the message is from a whitelisted group.
|
||||
// const groupID = ctx.chat.id;
|
||||
// const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
// const username = ctx.msg.from?.username;
|
||||
|
||||
// if (flag) {
|
||||
// // Deletes the offending message.
|
||||
// ctx.msg.delete();
|
||||
// // Replies to the user informing them of the action.
|
||||
// return await ctx.reply(
|
||||
// `@${username} Facebook and meta links along with with links to meta\\-owned services are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
// { parse_mode: "MarkdownV2" }
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// // If the env variables are misconfigured an error is sent to the group.
|
||||
// if (!GROUP_IDS) {
|
||||
// console.info("Group IDS:", process.env.GROUP_IDS);
|
||||
// return await ctx.reply(
|
||||
// `There was a problem retrieving the whitelist\\. Check the env variables and try again\\.`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@ import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import { twitterRegex } from "#root/lib/twitterLinkCheck.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
import addGroup from "#root/lib/graphql/mutations/addGroupMutation.js";
|
||||
import incrementGroup from "#root/lib/graphql/mutations/incrementGroupMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -15,57 +19,37 @@ feature.hears(
|
||||
twitterRegex,
|
||||
logHandle("blacklist-detection-twitter"),
|
||||
async (ctx: Context) => {
|
||||
// Pulling the group IDs from the env variables.
|
||||
const GROUP_IDS = process.env.GROUP_IDS
|
||||
? process.env.GROUP_IDS.split(",")
|
||||
: undefined;
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
if (ctx.chat && ctx.msg) {
|
||||
const username = ctx.msg.from?.username;
|
||||
// Deletes the offending message.
|
||||
ctx.msg.delete();
|
||||
|
||||
return await urql
|
||||
.mutation(increment, { link: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Replies to the user informing them of the action.
|
||||
return await ctx.reply(
|
||||
await ctx.reply(
|
||||
`@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
|
||||
const groupName = ctx.chat?.title;
|
||||
const groupID = ctx.chat?.id;
|
||||
const groupUsername = ctx.chat?.username;
|
||||
|
||||
return await urql
|
||||
.mutation(addGroup, { groupID, groupName, groupUsername })
|
||||
.toPromise()
|
||||
.then(() =>
|
||||
urql.mutation(incrementGroup, { groupID, linksDeleted: 1 })
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// if (ctx.chat && ctx.msg) {
|
||||
// if (GROUP_IDS !== undefined) {
|
||||
// // Checking if the message is from a whitelisted group.
|
||||
// const groupID = ctx.chat.id;
|
||||
// const flag = GROUP_IDS.includes(`${groupID}`);
|
||||
// const username = ctx.msg.from?.username;
|
||||
|
||||
// if (flag) {
|
||||
// // Deletes the offending message.
|
||||
// ctx.msg.delete();
|
||||
// // Replies to the user informing them of the action.
|
||||
// return await ctx.reply(
|
||||
// `@${username} Twitter and X links along with reformatting services for Twitter posts are not allowed here\\. Please consider sharing the media directly or from other social media sources or websites\\. No administration action was taken against you other than the message being deleted\\.`,
|
||||
// { parse_mode: "MarkdownV2" }
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// // If the env variables are misconfigured an error is sent to the group.
|
||||
// if (!GROUP_IDS) {
|
||||
// console.info(
|
||||
// "Group IDS:",
|
||||
// process.env.GROUP_IDS,
|
||||
// GROUP_IDS,
|
||||
// GROUP_IDS !== undefined
|
||||
// );
|
||||
// return await ctx.reply(
|
||||
// `There was a problem retrieving the whitelist\\. Check the env variables and try again\\.`,
|
||||
// {
|
||||
// parse_mode: "MarkdownV2",
|
||||
// reply_parameters: { message_id: ctx.msg.message_id }
|
||||
// }
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import { Composer } from "grammy";
|
||||
import type { Context } from "#root/bot/context.js";
|
||||
import { logHandle } from "#root/bot/helpers/logging.js";
|
||||
import urql from "#root/lib/urql.js";
|
||||
import increment from "#root/lib/graphql/mutations/incrimentMutation.js";
|
||||
|
||||
const composer = new Composer<Context>();
|
||||
|
||||
@@ -9,12 +11,21 @@ const feature = composer.chatType("private");
|
||||
* What triggers this feature and adds to the log when it has been triggered.
|
||||
* The trigger is the command "/start" or "start"
|
||||
*/
|
||||
feature.command("start", logHandle("command-start"), ctx => {
|
||||
feature.command("start", logHandle("command-start"), async ctx => {
|
||||
await urql.mutation(increment, { trigger: true });
|
||||
|
||||
await urql
|
||||
.mutation(increment, { command: true })
|
||||
.toPromise()
|
||||
.then(async () => {
|
||||
if (ctx.msg) {
|
||||
// Responds with information about the bot.
|
||||
return ctx.reply(
|
||||
`Welcome\\! I am a bot created by Lucid for [Werewolf Kid Creations](https://werewolfkid.monster/) I am designed to delete any Twitter/X and Meta links along with corresponding reformatting services within groups\\. I also check embedded links and forwarded messages\\! I am currently in a public beta mode\\! Simply add me to a group and make me an admin with the permission to delete messages\\. From there I will start deleting any Twitter\\/X and Meta links I detect\\.`,
|
||||
{ parse_mode: "MarkdownV2" }
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
export { composer as welcomeFeature };
|
||||
|
||||
@@ -16,10 +16,8 @@ import { MemorySessionStorage, Bot as TelegramBot } from "grammy";
|
||||
import { twitterBlacklist } from "./features/twitterBlacklist.js";
|
||||
import { metaBlacklist } from "./features/metaBlacklist.js";
|
||||
import { botInfoCommand } from "./features/botInfoCommand.js";
|
||||
import { getGroupIDCommand } from "./features/getGroupIDCommand.js";
|
||||
import { helpCommand } from "./features/helpCommand.js";
|
||||
import { embedCheck } from "./features/embedCheck.js";
|
||||
import { isWKCGroup } from "./features/isWKCGroup.js";
|
||||
|
||||
interface Dependencies {
|
||||
config: Config;
|
||||
@@ -71,8 +69,6 @@ export function createBot(
|
||||
|
||||
// Commands
|
||||
protectedBot.use(botInfoCommand);
|
||||
// protectedBot.use(getGroupIDCommand);
|
||||
// protectedBot.use(isWKCGroup);
|
||||
protectedBot.use(helpCommand);
|
||||
|
||||
// Blacklist Feature
|
||||
|
||||
24
src/lib/graphql/mutations/addGroupMutation.ts
Normal file
24
src/lib/graphql/mutations/addGroupMutation.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { gql } from "@urql/core";
|
||||
|
||||
const addGroup = gql`
|
||||
mutation addGroup(
|
||||
$groupID: BigInt
|
||||
$groupName: String
|
||||
$groupUsername: String
|
||||
) {
|
||||
addGroup(
|
||||
groupID: $groupID
|
||||
groupName: $groupName
|
||||
groupUsername: $groupUsername
|
||||
) {
|
||||
telegramID
|
||||
name
|
||||
username
|
||||
linksDeleted
|
||||
createdAt
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export default addGroup;
|
||||
16
src/lib/graphql/mutations/incrementGroupMutation.ts
Normal file
16
src/lib/graphql/mutations/incrementGroupMutation.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { gql } from "@urql/core";
|
||||
|
||||
const incrementGroup = gql`
|
||||
mutation incrementGroup($groupID: BigInt, $linksDeleted: Int) {
|
||||
incrementGroup(groupID: $groupID, linksDeleted: $linksDeleted) {
|
||||
telegramID
|
||||
name
|
||||
username
|
||||
linksDeleted
|
||||
createdAt
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export default incrementGroup;
|
||||
12
src/lib/graphql/mutations/incrimentMutation.ts
Normal file
12
src/lib/graphql/mutations/incrimentMutation.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { gql } from "@urql/core";
|
||||
|
||||
const increment = gql`
|
||||
mutation increment($command: Boolean, $link: Boolean, $trigger: Boolean) {
|
||||
increment(command: $command, link: $link, trigger: $trigger) {
|
||||
createdAt
|
||||
updatedAt
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export default increment;
|
||||
13
src/lib/urql.ts
Normal file
13
src/lib/urql.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Client, cacheExchange, fetchExchange } from "@urql/core";
|
||||
|
||||
const urql = new Client({
|
||||
url: process.env.GRAPHQL_URL || "",
|
||||
exchanges: [cacheExchange, fetchExchange],
|
||||
fetchOptions: {
|
||||
headers: {
|
||||
"x-api-key": process.env?.GRAPHQL_API_TOKEN || ""
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export default urql;
|
||||
30
yarn.lock
30
yarn.lock
@@ -5,6 +5,18 @@ __metadata:
|
||||
version: 8
|
||||
cacheKey: 10c0
|
||||
|
||||
"@0no-co/graphql.web@npm:^1.0.13":
|
||||
version: 1.2.0
|
||||
resolution: "@0no-co/graphql.web@npm:1.2.0"
|
||||
peerDependencies:
|
||||
graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
|
||||
peerDependenciesMeta:
|
||||
graphql:
|
||||
optional: true
|
||||
checksum: 10c0/4eed600962bfab42afb49cddcfb31a47b00502f59707609cf160559920ce0f5cf8874791e4cafc465ede30ae291992f3f892bc757b2a989e80e50e358f71c518
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@antfu/eslint-config@npm:5.4.1":
|
||||
version: 5.4.1
|
||||
resolution: "@antfu/eslint-config@npm:5.4.1"
|
||||
@@ -1063,6 +1075,16 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@urql/core@npm:^6.0.1":
|
||||
version: 6.0.1
|
||||
resolution: "@urql/core@npm:6.0.1"
|
||||
dependencies:
|
||||
"@0no-co/graphql.web": "npm:^1.0.13"
|
||||
wonka: "npm:^6.3.2"
|
||||
checksum: 10c0/44ff0d12dcef1e47338a9ff1217759d1124fa66eec1eec21ff9622e44c179b9d66fa78f462f195bfd8b790b04609abbe5a0674cbfcb0bc6d9c6fe6223d7d7b5b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/eslint-plugin@npm:^1.3.12":
|
||||
version: 1.3.13
|
||||
resolution: "@vitest/eslint-plugin@npm:1.3.13"
|
||||
@@ -3744,6 +3766,7 @@ __metadata:
|
||||
"@grammyjs/types": "npm:3.22.2"
|
||||
"@hono/node-server": "npm:1.19.4"
|
||||
"@types/node": "npm:^24.5.2"
|
||||
"@urql/core": "npm:^6.0.1"
|
||||
callback-data: "npm:1.1.1"
|
||||
eslint: "npm:^9.36.0"
|
||||
grammy: "npm:1.38.2"
|
||||
@@ -4976,6 +4999,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"wonka@npm:^6.3.2":
|
||||
version: 6.3.5
|
||||
resolution: "wonka@npm:6.3.5"
|
||||
checksum: 10c0/044fe5ae26c0a32b0a1603cc0ed71ede8c9febe5bb3adab4fad5e088ceee600a84a08d0deb95a72189bbaf0d510282d183b6fb7b6e9837e7a1c9b209f788dd07
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"word-wrap@npm:^1.2.5":
|
||||
version: 1.2.5
|
||||
resolution: "word-wrap@npm:1.2.5"
|
||||
|
||||
Reference in New Issue
Block a user