Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion bot/middleware/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ export const superAdminMiddleware = async (
ctx: CommunityContext,
next: () => void,
) => {
const admin = await validateSuperAdmin(ctx);
const tgId =
Comment thread
Luquitasjeffrey marked this conversation as resolved.
Outdated
'callback_query' in ctx.update
? ctx.update.callback_query.from.id.toString()
: undefined;
const admin = await validateSuperAdmin(ctx, tgId);
Comment thread
Matobi98 marked this conversation as resolved.
Outdated
if (!admin) return false;
ctx.i18n.locale(admin.lang);
ctx.admin = admin;
Expand Down
10 changes: 8 additions & 2 deletions bot/modules/community/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ const getVolumeNDays = async (

export const onCommunityInfo = async (ctx: MainContext) => {
const commId = ctx.match?.[1];
const community = await Community.findById(commId);
const community = await Community.findOne({
_id: commId,
enabled: { $ne: false },
});
if (community === null) throw new Error('community not found');
const userCount = await User.countDocuments({ default_community_id: commId });
const orderCount = await getOrdersNDays(1, commId);
Expand Down Expand Up @@ -120,7 +123,10 @@ export const onSetCommunity = async (ctx: CommunityContext) => {

export const withdrawEarnings = async (ctx: CommunityContext) => {
ctx.deleteMessage();
const community = await Community.findById(ctx.match?.[1]);
const community = await Community.findOne({
_id: ctx.match?.[1],
enabled: { $ne: false },
});
ctx.scene.enter('ADD_EARNINGS_INVOICE_WIZARD_SCENE_ID', {
community,
});
Comment thread
Matobi98 marked this conversation as resolved.
Expand Down
151 changes: 146 additions & 5 deletions bot/modules/community/commands.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-underscore-dangle */
import { logger } from '../../../logger';
import { showUserCommunitiesMessage } from './messages';
import { Community, Order } from '../../../models';
import { Community, Order, User } from '../../../models';
import { validateParams, validateObjectId } from '../../validations';
import { MainContext } from '../../start';
import { CommunityContext } from './communityContext';
Expand All @@ -21,6 +21,7 @@ async function findCommunities(currency: string) {
const communities = await Community.find({
currencies: currency,
public: true,
enabled: { $ne: false },
});
const orderCount = await getOrderCountByCommunity();
return communities.map(comm => {
Expand Down Expand Up @@ -49,9 +50,15 @@ export const setComm = async (ctx: MainContext) => {
if (groupName[0] == '@') {
// Allow find communities case insensitive
const regex = new RegExp(['^', groupName, '$'].join(''), 'i');
community = await Community.findOne({ group: regex });
community = await Community.findOne({
group: regex,
enabled: { $ne: false },
});
} else if (groupName[0] == '-') {
community = await Community.findOne({ group: groupName });
community = await Community.findOne({
group: groupName,
enabled: { $ne: false },
});
}
if (!community) {
return await ctx.reply(ctx.i18n.t('community_not_found'));
Expand All @@ -70,7 +77,11 @@ export const communityAdmin = async (ctx: CommunityContext) => {
try {
const [group] = (await validateParams(ctx, 2, '\\<_community_\\>'))!;
const creator_id = ctx.user.id;
const [community] = await Community.find({ group, creator_id });
const [community] = await Community.find({
group,
creator_id,
enabled: { $ne: false },
});
if (!community) throw new Error('CommunityNotFound');
await ctx.scene.enter('COMMUNITY_ADMIN', { community });
} catch (err: any) {
Expand All @@ -89,7 +100,10 @@ export const myComms = async (ctx: MainContext) => {
try {
const { user } = ctx;

const communities = await Community.find({ creator_id: user._id });
const communities = await Community.find({
creator_id: user._id,
enabled: { $ne: false },
});

if (!communities.length)
return await ctx.reply(ctx.i18n.t('you_dont_have_communities'));
Expand Down Expand Up @@ -147,6 +161,7 @@ export const updateCommunity = async (
const community = await Community.findOne({
_id: id,
creator_id: user._id,
enabled: { $ne: false },
});

if (!community) {
Expand Down Expand Up @@ -228,6 +243,7 @@ export const deleteCommunity = async (ctx: CommunityContext) => {
const community = await Community.findOne({
_id: id,
creator_id: ctx.user._id,
enabled: { $ne: false },
});

if (!community) {
Expand All @@ -241,6 +257,130 @@ export const deleteCommunity = async (ctx: CommunityContext) => {
}
};

async function findCommunityByInput(
ctx: MainContext,
input: string,
): Promise<(typeof Community.prototype) | null> {
if (input[0] === '@') {
const escapedInput = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const regex = new RegExp(`^${escapedInput}$`, 'i');
return Community.findOne({ group: regex });
}
if (!(await validateObjectId(ctx, input))) return null;
return Community.findOne({ _id: input });
}

function buildCommunityInfoText(
ctx: MainContext,
community: (typeof Community.prototype),
creatorUsername: string,
localeKey: string,
): string {
const solversText =
community.solvers.length > 0
? community.solvers.map((s: { username: string }) => `@${s.username}`).join(', ')
: '-';
const groupText = community.group || '-';
return ctx.i18n.t(localeKey, {
communityName: community.name,
group: groupText,
solvers: solversText,
creatorUsername,
});
}

export const disableCommunity = async (ctx: MainContext) => {
try {
const [input] = (await validateParams(
ctx,
2,
'\\<_community id \\| @groupUsername_\\>',
))!;
if (!input) return;

const community = await findCommunityByInput(ctx, input);
if (community === null) {
return ctx.reply(ctx.i18n.t('community_not_found'));
}

if (community.enabled === false) {
return ctx.reply(ctx.i18n.t('community_already_disabled'));
}

community.enabled = false;
await community.save();

const creator = await User.findById(community.creator_id);
const creatorUsername = creator?.username || 'unknown';

if (creator) {
try {
await ctx.telegram.sendMessage(
creator.tg_id,
ctx.i18n.t('community_disabled_by_admin', {
communityName: community.name,
}),
);
} catch (notifyError) {
logger.error(notifyError);
}
}

return ctx.reply(
buildCommunityInfoText(ctx, community, creatorUsername, 'community_disabled_info'),
);
} catch (error) {
logger.error(error);
await ctx.reply(ctx.i18n.t('generic_error'));
}
};

export const enableCommunity = async (ctx: MainContext) => {
try {
const [input] = (await validateParams(
ctx,
2,
'\\<_community id \\| @groupUsername_\\>',
))!;
if (!input) return;

const community = await findCommunityByInput(ctx, input);
if (community === null) {
return ctx.reply(ctx.i18n.t('community_not_found'));
}

if (community.enabled !== false) {
return ctx.reply(ctx.i18n.t('community_already_enabled'));
}

community.enabled = true;
await community.save();

const creator = await User.findById(community.creator_id);
const creatorUsername = creator?.username || 'unknown';

if (creator) {
try {
await ctx.telegram.sendMessage(
creator.tg_id,
ctx.i18n.t('community_enabled_by_admin', {
communityName: community.name,
}),
);
} catch (notifyError) {
logger.error(notifyError);
}
}

return ctx.reply(
buildCommunityInfoText(ctx, community, creatorUsername, 'community_enabled_info'),
);
} catch (error) {
logger.error(error);
await ctx.reply(ctx.i18n.t('generic_error'));
}
};

export const changeVisibility = async (ctx: CommunityContext) => {
try {
ctx.deleteMessage();
Expand All @@ -251,6 +391,7 @@ export const changeVisibility = async (ctx: CommunityContext) => {
const community = await Community.findOne({
_id: id,
creator_id: ctx.user._id,
enabled: { $ne: false },
});

if (!community) {
Expand Down
13 changes: 12 additions & 1 deletion bot/modules/community/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Telegraf } from 'telegraf';
import { userMiddleware } from '../../middleware/user';
import { userMiddleware, superAdminMiddleware } from '../../middleware/user';
import * as actions from './actions';
import * as commands from './commands';
import {
Expand Down Expand Up @@ -65,6 +65,17 @@ export const configure = (bot: Telegraf<CommunityContext>) => {
},
);

bot.command(
'disablecommunity',
superAdminMiddleware,
commands.disableCommunity,
);
bot.command(
'enablecommunity',
superAdminMiddleware,
commands.enableCommunity,
);

bot.command('findcomms', userMiddleware, commands.findCommunity);
bot.action(
/^communityInfo_([0-9a-f]{24})$/,
Expand Down
10 changes: 8 additions & 2 deletions bot/modules/community/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ export const updateCommunityMessage = async (ctx: MainContext) => {
try {
await ctx.deleteMessage();
const id = ctx.match?.[1];
const community = await Community.findById(id);
const community = await Community.findOne({
_id: id,
enabled: { $ne: false },
});
if (community == null) throw new Error('community was not found');
let text = ctx.i18n.t('community') + `: ${community.name}\n`;
text += ctx.i18n.t('what_to_do');
Expand Down Expand Up @@ -170,7 +173,10 @@ export const earningsMessage = async (ctx: MainContext) => {
if (isScheduled)
return await ctx.reply(ctx.i18n.t('invoice_already_being_paid'));

const community = await Community.findById(communityId);
const community = await Community.findOne({
_id: communityId,
enabled: { $ne: false },
});
if (community == null) throw new Error('community was not found');
const button =
community.earnings > 0
Expand Down
5 changes: 4 additions & 1 deletion bot/modules/orders/scenes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,10 @@ const createOrderSteps = {
const stateComm = ctx.wizard.state.community;
const loadedComm =
!stateComm && user?.default_community_id
? await Community.findById(user.default_community_id)
? await Community.findOne({
_id: user.default_community_id,
enabled: { $ne: false },
})
: null;
const community = stateComm ?? loadedComm;
if (loadedComm) ctx.wizard.state.community = loadedComm;
Expand Down
10 changes: 7 additions & 3 deletions bot/modules/user/scenes/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@ function make() {
lightning_address: '',
};
if (user.default_community_id) {
const community = await Community.findById(user.default_community_id);
if (community == null) throw new Error('community not found');
data.community = community.group;
const community = await Community.findOne({
_id: user.default_community_id,
enabled: { $ne: false },
});
if (community != null) {
data.community = community.group;
}
}
if (user.nostr_public_key) {
data.npub = NostrLib.encodeNpub(user.nostr_public_key);
Expand Down
6 changes: 6 additions & 0 deletions locales/de.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -717,3 +717,9 @@ payment_methods_saved: "Zahlungsmethoden gespeichert ✅"
custom_payment_method: "✍️ Benutzerdefinierte Zahlungsmethode"
payment_methods_reset: "Zahlungsmethoden entfernt. Benutzer können jetzt beliebige Zahlungsmethoden frei eingeben."
payment_methods_wizard_commands: "/reset — alle Zahlungsmethoden entfernen und Standardverhalten wiederherstellen\n/exit — ohne Speichern beenden"
community_disabled_info: "Gemeinschaft: ${communityName}\nGruppe: ${group}\nLöser: ${solvers}\nErsteller: @${creatorUsername}\nDie Gemeinschaft wurde deaktiviert"
community_enabled_info: "Gemeinschaft: ${communityName}\nGruppe: ${group}\nLöser: ${solvers}\nErsteller: @${creatorUsername}\nDie Gemeinschaft wurde aktiviert"
community_disabled_by_admin: Ein Administrator hat Ihre Gemeinschaft ${communityName} deaktiviert
community_enabled_by_admin: Ein Administrator hat Ihre Gemeinschaft ${communityName} wieder aktiviert
community_already_disabled: Diese Gemeinschaft ist bereits deaktiviert
community_already_enabled: Diese Gemeinschaft ist bereits aktiv
6 changes: 6 additions & 0 deletions locales/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -722,3 +722,9 @@ payment_methods_saved: "Payment methods saved ✅"
custom_payment_method: "✍️ Custom payment method"
payment_methods_reset: "Payment methods removed. Users can now enter any payment method freely."
payment_methods_wizard_commands: "/reset — remove all payment methods and restore default behavior\n/exit — exit without saving"
community_disabled_info: "Community: ${communityName}\nGroup: ${group}\nSolvers: ${solvers}\nCreator: @${creatorUsername}\nThe community was disabled"
community_enabled_info: "Community: ${communityName}\nGroup: ${group}\nSolvers: ${solvers}\nCreator: @${creatorUsername}\nThe community was enabled"
community_disabled_by_admin: An administrator has disabled your community ${communityName}
community_enabled_by_admin: An administrator has re-enabled your community ${communityName}
community_already_disabled: This community is already disabled
community_already_enabled: This community is already enabled
6 changes: 6 additions & 0 deletions locales/es.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -719,3 +719,9 @@ payment_methods_saved: "Métodos de pago guardados ✅"
custom_payment_method: "✍️ Método de pago personalizado"
payment_methods_reset: "Métodos de pago eliminados. Los usuarios ahora pueden ingresar cualquier método de pago libremente."
payment_methods_wizard_commands: "/reset — eliminar todos los métodos de pago y restaurar el comportamiento predeterminado\n/exit — salir sin guardar"
community_disabled_info: "Comunidad: ${communityName}\nGrupo: ${group}\nSolvers: ${solvers}\nCreador: @${creatorUsername}\nLa comunidad fue deshabilitada"
community_enabled_info: "Comunidad: ${communityName}\nGrupo: ${group}\nSolvers: ${solvers}\nCreador: @${creatorUsername}\nLa comunidad fue habilitada"
community_disabled_by_admin: Un administrador ha deshabilitado tu comunidad ${communityName}
community_enabled_by_admin: Un administrador ha reactivado tu comunidad ${communityName}
community_already_disabled: Esta comunidad ya está deshabilitada
community_already_enabled: Esta comunidad ya está habilitada
6 changes: 6 additions & 0 deletions locales/fa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -816,3 +816,9 @@ payment_methods_saved: "روش‌های پرداخت ذخیره شد ✅"
custom_payment_method: "✍️ روش پرداخت سفارشی"
payment_methods_reset: "روش‌های پرداخت حذف شدند. کاربران اکنون می‌توانند هر روش پرداختی را آزادانه وارد کنند."
payment_methods_wizard_commands: "/reset — حذف همه روش‌های پرداخت و بازگرداندن رفتار پیش‌فرض\n/exit — خروج بدون ذخیره"
community_disabled_info: "جامعه: ${communityName}\nگروه: ${group}\nحل‌کنندگان: ${solvers}\nسازنده: @${creatorUsername}\nجامعه غیرفعال شد"
community_enabled_info: "جامعه: ${communityName}\nگروه: ${group}\nحل‌کنندگان: ${solvers}\nسازنده: @${creatorUsername}\nجامعه فعال شد"
community_disabled_by_admin: یک مدیر جامعه شما ${communityName} را غیرفعال کرد
community_enabled_by_admin: یک مدیر جامعه شما ${communityName} را مجدداً فعال کرد
community_already_disabled: این جامعه از قبل غیرفعال است
community_already_enabled: این جامعه از قبل فعال است
6 changes: 6 additions & 0 deletions locales/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -716,3 +716,9 @@ payment_methods_saved: "Méthodes de paiement enregistrées ✅"
custom_payment_method: "✍️ Méthode de paiement personnalisée"
payment_methods_reset: "Méthodes de paiement supprimées. Les utilisateurs peuvent désormais saisir n'importe quelle méthode de paiement librement."
payment_methods_wizard_commands: "/reset — supprimer toutes les méthodes de paiement et restaurer le comportement par défaut\n/exit — quitter sans enregistrer"
community_disabled_info: "Communauté: ${communityName}\nGroupe: ${group}\nSolveurs: ${solvers}\nCréateur: @${creatorUsername}\nLa communauté a été désactivée"
community_enabled_info: "Communauté: ${communityName}\nGroupe: ${group}\nSolveurs: ${solvers}\nCréateur: @${creatorUsername}\nLa communauté a été activée"
community_disabled_by_admin: Un administrateur a désactivé votre communauté ${communityName}
community_enabled_by_admin: Un administrateur a réactivé votre communauté ${communityName}
community_already_disabled: Cette communauté est déjà désactivée
community_already_enabled: Cette communauté est déjà active
6 changes: 6 additions & 0 deletions locales/it.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -714,3 +714,9 @@ payment_methods_saved: "Metodi di pagamento salvati ✅"
custom_payment_method: "✍️ Metodo di pagamento personalizzato"
payment_methods_reset: "Metodi di pagamento rimossi. Gli utenti possono ora inserire qualsiasi metodo di pagamento liberamente."
payment_methods_wizard_commands: "/reset — rimuovere tutti i metodi di pagamento e ripristinare il comportamento predefinito\n/exit — uscire senza salvare"
community_disabled_info: "Comunità: ${communityName}\nGruppo: ${group}\nRisolutori: ${solvers}\nCreatore: @${creatorUsername}\nLa comunità è stata disabilitata"
community_enabled_info: "Comunità: ${communityName}\nGruppo: ${group}\nRisolutori: ${solvers}\nCreatore: @${creatorUsername}\nLa comunità è stata abilitata"
community_disabled_by_admin: Un amministratore ha disabilitato la tua comunità ${communityName}
community_enabled_by_admin: Un amministratore ha riattivato la tua comunità ${communityName}
community_already_disabled: Questa comunità è già disabilitata
community_already_enabled: Questa comunità è già attiva
6 changes: 6 additions & 0 deletions locales/ko.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -714,3 +714,9 @@ payment_methods_saved: "결제 방법이 저장되었습니다 ✅"
custom_payment_method: "✍️ 사용자 지정 결제 방법"
payment_methods_reset: "결제 방법이 삭제되었습니다. 이제 사용자는 어떤 결제 방법이든 자유롭게 입력할 수 있습니다."
payment_methods_wizard_commands: "/reset — 모든 결제 방법을 삭제하고 기본 동작을 복원합니다\n/exit — 저장하지 않고 종료"
community_disabled_info: "커뮤니티: ${communityName}\n그룹: ${group}\n해결사: ${solvers}\n생성자: @${creatorUsername}\n커뮤니티가 비활성화되었습니다"
community_enabled_info: "커뮤니티: ${communityName}\n그룹: ${group}\n해결사: ${solvers}\n생성자: @${creatorUsername}\n커뮤니티가 활성화되었습니다"
community_disabled_by_admin: 관리자가 귀하의 커뮤니티 ${communityName}을 비활성화했습니다
community_enabled_by_admin: 관리자가 귀하의 커뮤니티 ${communityName}을 다시 활성화했습니다
community_already_disabled: 이 커뮤니티는 이미 비활성화되어 있습니다
community_already_enabled: 이 커뮤니티는 이미 활성화되어 있습니다
Loading
Loading