Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
13 changes: 11 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,13 @@ 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 },
});
if (community == null) {
return ctx.reply(ctx.i18n.t('community_not_found'));
}
ctx.scene.enter('ADD_EARNINGS_INVOICE_WIZARD_SCENE_ID', {
community,
});
Comment thread
Matobi98 marked this conversation as resolved.
Expand Down
163 changes: 158 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,142 @@ 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 +403,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
46 changes: 24 additions & 22 deletions bot/modules/orders/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,32 +187,34 @@ async function enterWizard(
user: UserDocument,
type: string,
) {
const state: EnterWizardState = {
type,
user,
};
if (user.default_community_id) {
// Use optimized community lookup
const communityInfo = await getCommunityInfo(user, 'private');
const { community, isBanned } = communityInfo;

if (!community) {
throw new Error('Default community not found');
}
try {
const state: EnterWizardState = {
type,
user,
};
if (user.default_community_id) {
const communityInfo = await getCommunityInfo(user, 'private');
const { community, isBanned } = communityInfo;

// Check if user is banned
if (isBanned) {
return await messages.bannedUserErrorMessage(ctx, user);
}
if (!community) {
return await deletedCommunityMessage(ctx);
}

state.community = community;
state.currencies = community.currencies;
if (community.currencies.length === 1) {
state.currency = community.currencies[0];
if (isBanned) {
return await messages.bannedUserErrorMessage(ctx, user);
}

state.community = community;
state.currencies = community.currencies;
if (community.currencies.length === 1) {
state.currency = community.currencies[0];
}
}
}

await ctx.scene.enter(Scenes.CREATE_ORDER, state);
await ctx.scene.enter(Scenes.CREATE_ORDER, state);
} catch (error) {
logger.error(error);
}
}

const isMaxPending = async (user: UserDocument) => {
Expand Down
2 changes: 2 additions & 0 deletions bot/modules/orders/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ export const createOrderWizardStatus = (

export const deletedCommunityMessage = async (ctx: MainContext) => {
try {
ctx.user.default_community_id = undefined;
await ctx.user.save();
await ctx.reply(ctx.i18n.t('community_deleted'));
} catch (error) {
logger.error(error);
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
Loading
Loading