Обновление меню организации
Новая система инвайт кодов
This commit is contained in:
Degradin 2025-01-24 00:17:08 +03:00
parent a31b383dae
commit 9e2eef59de
6 changed files with 5547 additions and 23 deletions

73
bot.js
View File

@ -263,22 +263,22 @@ bot.command('start', async (ctx) => {
if (inviter) {
inviter.money += 250000;
await inviter.save();
user.money += 250000;
user.referated = true;
// Управление статусами
if (user.status === 'bronze') {
user.statustime += 60 * 60 * 24 * 3; // +3 дня
if (inviter.status === 'bronze') {
inviter.statustime += 4320
await ctx.reply('Ваш статус "Bronze" продлен на 3 дня.');
} else if (user.status === 'user') {
user.status = 'bronze';
user.statustime = Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 3;
} else if (inviter.status === 'user') {
inviter.status = 'bronze';
inviter.statustime = 4320
await ctx.reply('Вам выдан статус "Bronze" на 3 дня.');
}
await user.save();
await inviter.save();
// Обновление данных приглашения
invite.users.push(ctx.from.id);
@ -625,7 +625,6 @@ bot.action('manage_organization', async (ctx) => {
const buttons = [
[{ text: '👥 Участники', callback_data: 'org_members' }],
[{ text: '📞 Пригласить', callback_data: 'org_invite' }],
[{ text: '🔧 Настройки', callback_data: 'org_settings' }],
[{ text: '🚫 Расформировать', callback_data: `dissolve_organization_${business.id}` }],
[{ text: '⬅️ Назад', callback_data: 'organization_menu' }]
];
@ -776,9 +775,6 @@ bot.action('org_invite', async (ctx) => {
}
});
/////////////////////////////////////Enterprise Update 20.12.2024//////////////////////////////////////////////////
// Обновление меню "Предприятия"
@ -973,6 +969,39 @@ bot.action(/build_(wood|coal|oil|metall|gold|diamond)/, async (ctx) => {
if (user.money < price) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас недостаточно средств для постройки предприятия. Необходимо ${utils.spaces(price)} руб.`, { show_alert: true })
}
// Проверка уровня, для покупки предприятия, для покупки деревообрабатывающего предприятия нужен 5 уровень и каждое следующее предприятие требует уровень выше
switch (type) {
case 'wood':
if (user.level < 5) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки деревообрабатывающего предприятия необходим 5 уровень.`, { show_alert: true })
}
break;
case 'coal':
if (user.level < 6) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки угольного предприятия необходим 10 уровень.`, { show_alert: true })
}
break;
case 'oil':
if (user.level < 7) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки нефтяного предприятия необходим 15 уровень.`, { show_alert: true })
}
break;
case 'metall':
if (user.level < 9) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки металлургического предприятия необходим 20 уровень.`, { show_alert: true })
}
break;
case 'gold':
if (user.level < 12) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки золотодобывающего предприятия необходим 25 уровень.`, { show_alert: true })
}
break;
case 'diamond':
if (user.level < 15) {
return await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Для постройки алмазодобывающего предприятия необходим 30 уровень.`, { show_alert: true })
}
break;
}
// Строим предприятие
let enterpriseName = `${user.username}'s ${getReadableType(type)}` // Название предприятия
@ -1095,6 +1124,10 @@ bot.action('buy_warehouse', async (ctx) => {
return await ctx.reply('Произошла ошибка. Пользователь не найден.');
}
if (user.level < 5) {
return await ctx.reply('Для покупки склада необходим 5 уровень.');
}
// Получаем цены на металл и дерево
const woodPrice = await ResourcePriceModel.findOne({ where: { resource: 'wood' } });
const metallPrice = await ResourcePriceModel.findOne({ where: { resource: 'metall' } });
@ -2167,6 +2200,22 @@ setInterval(() => {
}*/
}, 3600000);
// cron на проверку остается ли у пользователя привелегия user.status == 'bronze' || user.status == 'silver' || user.status == 'gold' из user.statustime (оставшиеся минуты)
schedule.scheduleJob('*/1 * * * *', async () => {
const users = await UserModel.findAll();
for (const user of users) {
if (user.status == 'bronze' || user.status == 'silver' || user.status == 'gold') {
if (user.statustime > 0) {
user.statustime -= 1
await user.save()
} else {
user.status = 'user'
await user.save()
}
}
}
});
start()
bot.launch()
bot.launch()

View File

@ -9,6 +9,7 @@ const {
weapons,
equipment,
UserModel,
InviteModel,
WorldModel,
JobModel,
PropertyModel,
@ -40,10 +41,20 @@ const {
module.exports = async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
return ctx.reply(`
Для приглашения друга по реферальной системе, отправьте ему ссылку-приглашение
Как только он перейдет по ней и начнет игру, Вы получите 25.000.
Ваша ссылка: https://t.me/CampFireGameBot?start=${user.telegram_id}
`)
const invites = await InviteModel.findAll({ where: { type: 'referral', author: ctx.from.id } });
if (invites.length == 0) {
const invite = await InviteModel.create({ author: ctx.from.id, uid: `${user.username}_ref_invite`, type: 'referral' });
return ctx.reply( `
Для приглашения друга по реферальной системе, отправьте ему ссылку-приглашение
Как только он перейдет по ней и начнет игру, Вы получите 3 дня статуса "Bronze".
Ваша ссылка: https://t.me/CampFireGameBot?start=${invite.uid})
`);
}
const invite = invites[0];
return ctx.reply( `
Для приглашения друга по реферальной системе, отправьте ему ссылку-приглашение
Как только он перейдет по ней и начнет игру, Вы получите 3 дня статуса "Bronze".
Ваша ссылка: https://t.me/CampFireGameBot?start=${invite.uid})
`);
}

View File

@ -53,9 +53,6 @@ module.exports = async (ctx) => {
{
text: `🔧 Управление`,
callback_data: "manage_organization"
},
{ text: '❌ Ликвидировать организацию',
callback_data: `dissolve_organization_${business.id}`
}]
])
.oneTime()

View File

@ -11,9 +11,12 @@ const {
module.exports = async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id);
let property = await PropertyModel.findByPk(ctx.from.id);
// statustime хранит минуты, которые остались до смены статуса, формируем текстовое представление
let hours = Math.floor(user.statustime / 60);
let minutes = user.statustime % 60;
if (!user) return ctx.reply(`Ошибка #1`);
return ctx.replyWithMarkdownV2(`
👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "✅" : ""}
👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "✅" : ""} ${user.status == 'user' ? "" : ` ${hours} ч\\. ${minutes} мин\\.`}
🆔: ${ctx.from.id}
📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}

File diff suppressed because it is too large Load Diff

3
rpg.js
View File

@ -1991,6 +1991,7 @@ rpg.action(/viewlocation_\d+/, async (ctx) => {
});
rpg.action(/explore_\d+/, async (ctx) => {
return ctx.answerCbQuery("Функционал в разработке.");
const locationId = ctx.match[0].split("_")[1];
const location = await Location.findByPk(locationId);
@ -2017,7 +2018,7 @@ rpg.action(/explore_\d+/, async (ctx) => {
character.stamina -= location.level; // Снимаем стамину за исследование
await character.save();
// У локации такой же свой массив лута как и у врагов, поэтому можно использовать ту же функцию dropLoot
const loot = dropLoot(location.loot);
const loot = dropItem(location.loot);
const experience = Math.floor(Math.random() * 10) + 5; // Опыт за исследование
await Exp(ctx, character, experience)
await ctx.reply(`Вы исследовали локацию ${location.name} и нашли:\n${loot.join("\n")}\n\n`);