Skip to content
Merged
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: 13 additions & 0 deletions bot/modules/dispute/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { MainContext } from '../../start';
import * as messages from './messages';
import { validateAdmin } from '../../validations';
import * as globalMessages from '../../messages';
import { handleDispute } from './commands';
import { logger } from '../../../logger';

export const takeDispute = async (ctx: MainContext): Promise<void> => {
const tgId: string = (ctx.update as any).callback_query.from.id;
Expand Down Expand Up @@ -53,3 +55,14 @@ export const takeDispute = async (ctx: MainContext): Promise<void> => {
sellerDisputes,
);
};

export const initiateDispute = async (ctx: MainContext) => {
try {
const orderId = ctx.match?.[1];
if (!orderId) return;
await ctx.deleteMessage();
await handleDispute(ctx, orderId);
} catch (error) {
logger.error(error);
}
};
35 changes: 32 additions & 3 deletions bot/modules/dispute/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@ import * as globalMessages from '../../messages';
import { logger } from '../../../logger';
import { removeAtSymbol } from '../../../util';

const dispute = async (ctx: MainContext) => {
export const handleDispute = async (ctx: MainContext, orderId: string) => {
try {
const { user } = ctx;

const [orderId] = (await validateParams(ctx, 2, '\\<_order id_\\>'))!;

if (!(await validateObjectId(ctx, orderId))) return;
const order = await validateDisputeOrder(ctx, user, orderId);

Expand Down Expand Up @@ -93,6 +91,37 @@ const dispute = async (ctx: MainContext) => {
}
};

const dispute = async (ctx: MainContext) => {
try {
const { user } = ctx;

if (ctx.state.command.args.length > 0) {
const params = await validateParams(ctx, 2, '\\<_order id_\\>');

if (!params || params.length === 0) return;

const [orderId] = params;
return await handleDispute(ctx, orderId);
}

const orders = await Order.find({
$or: [
{ seller_id: user._id.toString() },
{ buyer_id: user._id.toString() },
],
status: { $in: ['ACTIVE', 'FIAT_SENT'] },
});

if (orders.length > 0) {
await messages.listOrdersForDispute(ctx, orders);
} else {
await ctx.reply(ctx.i18n.t('you_have_no_orders'));
}
} catch (error) {
logger.error(error);
}
};

const deleteDispute = async (ctx: MainContext) => {
try {
const { admin } = ctx;
Expand Down
5 changes: 5 additions & 0 deletions bot/modules/dispute/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@ export const configure = (bot: Telegraf<CommunityContext>) => {
userMiddleware,
actions.takeDispute,
);
bot.action(
/^initiateDispute_([0-9a-f]{24})$/,
userMiddleware,
actions.initiateDispute,
);
};
26 changes: 26 additions & 0 deletions bot/modules/dispute/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,32 @@ import { MainContext } from '../../start';
import { IOrder } from '../../../models/order';
import { UserDocument } from '../../../models/user';

export const listOrdersForDispute = async (
ctx: MainContext,
orders: IOrder[],
) => {
try {
const buttons = await Promise.all(
orders.map(async order => {
return [
{
text: `${order._id.toString().substring(0, 2)}..${order._id.toString().slice(-2)} - ${order.type} - ${order.fiat_code} ${order.fiat_amount}`,
callback_data: `initiateDispute_${order._id}`,
},
];
}),
);

await ctx.reply(ctx.i18n.t('choose_order_for_dispute'), {
reply_markup: {
inline_keyboard: buttons,
},
});
} catch (error) {
logger.error(error);
}
};

const getDisputeParties = async (
initiator: 'seller' | 'buyer',
buyer: UserDocument,
Expand Down
1 change: 1 addition & 0 deletions locales/de.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ waiting_seller_to_pay: 'Ich habe eine Zahlungsaufforderung an den Verkäufer ges
sell_success: Dein Verkauf von Sats wurde abgeschlossen, nachdem die Zahlung von @${buyerUsername} bestätigt wurde. ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} hat die Sats bereits freigegeben. Du kannst jederzeit mit der Bezahlung deiner LN-Rechnung rechnen, aber denke daran, dass deine Wallet online sein muss, um über das Lightning-Netzwerk zu empfangen.
rate_counterpart: 'Bitte bewerte deine Gegenpartei:'
choose_order_for_dispute: 'Wählen Sie den Auftrag aus, um den Streitfall einzuleiten:'
cant_process_order: Dieser Auftrag kann nicht bearbeitet werden. Bitte überprüfe, ob die ID korrekt ist.
cant_release_order: Dieser Auftrag kann nicht freigegeben werden, der Käufer hat keine LN-Rechnung geschickt.
no_id_related: Du hast keinen Auftrag, der mit dieser Id verbunden ist.
Expand Down
1 change: 1 addition & 0 deletions locales/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ invalid_id: Invalid ID
cant_take_own_order: You cannot take your own order.
send_me_lninvoice: Please send me a lightning invoice for ${amount} sats, although to make things easier for you, I also accept invoices without a specified amount. I will make the payment of ${amount} sats.
you_have_no_orders: You don't have active orders
choose_order_for_dispute: 'Choose the order to initiate the dispute:'
not_rate_for_currency: |
${fiatRateProvider} There is no exchange rate for this currency,
if you want to use this currency, you must indicate how many satoshis you want
Expand Down
1 change: 1 addition & 0 deletions locales/es.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ waiting_seller_to_pay: 'Le he enviado una solicitud de pago al vendedor para que
sell_success: Tu venta de sats ha sido completada tras confirmar el pago de @${buyerUsername} ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} ya liberó los satoshis, debes esperar por el pago de tu factura, recuerda que para recibir en lightning tu wallet debe estar online.
rate_counterpart: 'Califica a tu contraparte:'
choose_order_for_dispute: 'Elige la orden para iniciar la disputa:'
cant_process_order: Esta orden no puede ser procesada, asegúrate de que el Id es correcto
cant_release_order: Esta orden no puede ser liberada, el comprador no me ha indicado la factura para recibir los sats
no_id_related: No tienes ninguna orden asociada con ese Id
Expand Down
1 change: 1 addition & 0 deletions locales/fa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ waiting_seller_to_pay: 'من یک درخواست پرداخت برای فروش
sell_success: 'فروش ساتوشی‌های شما با تأیید پرداخت @${buyerUsername} به پایان رسید ⚡️🍊⚡️'
funds_released: '🕐 فروشنده @${sellerUsername} ساتوشی‌های شما را آزاد کرده است؛ انتظار می‌‌رود صورتحساب شما به زودی پرداخت شود. به خاطر داشته باشید که برای دریافت از طریق لایتنینگ، نرم‌افزار کیف پول شما باید باز بوده و اتصالش به اینترنت برقرار باشد.'
rate_counterpart: 'لطفاً به طرف مقابل خود امتیاز دهید:'
choose_order_for_dispute: 'سفارش مورد نظر برای ثبت مشاجره را انتخاب کنید:'
cant_process_order: این سفارش قابل پردازش نیست، لطفاً درستی شناسه را بررسی کنید.
cant_release_order: ساتوشی‌های این سفارش نمی‌توانند آزاد شوند زیرا خریدار هنوز صورتحسابی برای من نفرستاده است که بتوانم به اون پرداخت کنم.
no_id_related: شما هیچ سفارشی با این شناسه ندارید.
Expand Down
1 change: 1 addition & 0 deletions locales/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ waiting_seller_to_pay: "J'ai envoyé une requête de paiement au vendeur pour qu
sell_success: Ta vente de sats a été effectuée avec succès suite à la confirmation de paiement de @${buyerUsername} ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} a déjà débloqué les sats, ta facture sera payée incessamment, rappelle-toi que ton portefeuille doit être connecté pour la réception via Lightning Network.
rate_counterpart: 'Merci de nommer ta contre-partie:'
choose_order_for_dispute: 'Choisissez la commande pour initier la dispute:'
cant_process_order: Cette offre ne peut pas être traitée, merci de vérifier que l'ID d'offre est correct.
cant_release_order: Cette offre ne peut pas être débloquée, l'acheteur n'a pas fourni une facture à laquelle envoyer le paiement
no_id_related: Tu n'as aucune offre associée à cette référence.
Expand Down
1 change: 1 addition & 0 deletions locales/it.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ waiting_seller_to_pay: "Ho inviato una richiesta di pagamento al venditore in mo
sell_success: La vendita di sats è stata completata dopo la conferma del pagamento da parte di @${buyerUsername} ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} ha rilasciato i satoshi, la vostra invoice verrà pagata da un momento all'altro. Ricordata che il tuo wallet deve essere online per ricevere attraverso la rete Lightning.
rate_counterpart: 'Dai un voto alla tua controparte:'
choose_order_for_dispute: 'Scegli l''ordine per avviare il reclamo:'
cant_process_order: Quest'ordine non può essere elaborato, si prega di controllare che l'ID sia corretto.
cant_release_order: L'ordine non può essere evaso, l'acquirente non ha inviato la richiesta di pagamento LN
no_id_related: Non c'è nessun ordine associato a questo Id.
Expand Down
1 change: 1 addition & 0 deletions locales/ko.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ waiting_seller_to_pay: '판매자에게 결제 요청을 보냈고, 판매자는
sell_success: 당신의 비트코인 판매가 @${buyerUsername} 의 결제를 확인함으로써 완료되었습니다. ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} 님이 비트코인의 락업을 해제했고, 제공된 인보이스로 곧 결제가 완료될 것입니다. 비수탁형 지갑의 경우, 지갑을 온라인 상태로 유지해서 결제를 받을 수 있게 해주세요.
rate_counterpart: '거래 상대방을 평가해주세요:'
choose_order_for_dispute: '분쟁을 시작할 주문을 선택하세요:'
cant_process_order: 이 주문은 처리될 수 없습니다. ID가 정확한지 확인해 주세요.
cant_release_order: 이 주문은 락업 해제될 수 없습니다. 구매자가 비트코인을 받을 인보이스를 아직 보내지 않았습니다.
no_id_related: 해당 ID로는 등록된 주문이 없습니다.
Expand Down
1 change: 1 addition & 0 deletions locales/pt.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ waiting_seller_to_pay: 'Enviei uma solicitação de pagamento ao vendedor para q
sell_success: Sua venda de SATs foi concluída após a confirmação do pagamento de @${buyerUsername} ⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} Já lançou os Satoshis, espere que sua fatura seja paga a qualquer momento, lembre-se de que sua carteira precisa estar online para receber através da Lightning Network.
rate_counterpart: 'Por favor, qualifique sua contraparte:'
choose_order_for_dispute: 'Escolha o pedido para iniciar a disputa:'
cant_process_order: Este pedido não pode ser processado, verifique se o ID está correto.
cant_release_order: Este pedido não pode ser divulgado, o comprador não enviou uma fatura para onde pagar
no_id_related: Você não tem nenhum pedido associado a este ID.
Expand Down
1 change: 1 addition & 0 deletions locales/ru.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ waiting_seller_to_pay: 'Я отправил продавцу запрос, чт
sell_success: Ваша продажа сатоши была завершена после подтверждения оплаты @${buyerUsername}\n⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} Продавец разблокировал сатоши. Вы должны дождаться оплаты вашего счета, и для этого ваш кошелек должен оставаться онлайн.
rate_counterpart: Оцените вашего контрагента, пожалуйста
choose_order_for_dispute: 'Выберите заказ для начала спора:'
cant_process_order: Эта заявка не может быть обработана, убедитесь, что идентификатор правильный
cant_release_order: Эта заявка не может быть разблокирована, покупатель не выставил мне счет для получения сатоши.
no_id_related: У вас нет заказа, связанного с этим идентификатором
Expand Down
1 change: 1 addition & 0 deletions locales/uk.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ waiting_seller_to_pay: "Я відправив продавцеві запит,
sell_success: Ваш продаж сатоші було завершено після підтвердження оплати @${buyerUsername}\n⚡️🍊⚡️
funds_released: 🕐 @${sellerUsername} Продавець розблокував сатоші. Ви повинні дочекатися оплати Вашого рахунку, для цього Ваш гаманець повинен залишатися онлайн.
rate_counterpart: Будь ласка, оцініть Вашого контрагента
choose_order_for_dispute: 'Виберіть замовлення для початку спору:'
cant_process_order: Ця заявка не може бути оброблена, переконайтеся, будь ласка, що ідентифікатор вказано правильно
cant_release_order: Ця заявка не може бути розблокована, покупець не виставив мені рахунок для отримання сатоші.
no_id_related: У Вас немає ніякого замовлення, пов'язаного з цим ідентифікатором
Expand Down
Loading