Skip to content

Commit

Permalink
WIP1&2
Browse files Browse the repository at this point in the history
  • Loading branch information
Mersho committed Sep 4, 2023
1 parent 33221b4 commit 55b0de3
Show file tree
Hide file tree
Showing 15 changed files with 79 additions and 64 deletions.
16 changes: 9 additions & 7 deletions app.js → app.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
require('dotenv').config();
const { SocksProxyAgent } = require('socks-proxy-agent');
const { start } = require('./bot');
const mongoConnect = require('./db_connect');
import * as dotenv from "dotenv";
dotenv.config()
const SocksProxyAgent = require('socks-proxy-agent')
import { start } from "./bot/start";
import mongoConnect from './db_connect'
const { resubscribeInvoices } = require('./ln');
const logger = require('./logger');
const { delay } = require('./util');
Expand Down Expand Up @@ -30,12 +31,13 @@ const { delay } = require('./util');
telegram: {
agent,
},
};
} as any;
}
const bot = start(process.env.BOT_TOKEN, options);
const bot = start(String(process.env.BOT_TOKEN), options);
// Wait 1 seconds before try to resubscribe hold invoices
await delay(1000);
await resubscribeInvoices(bot);
})
.on('error', error => logger.error(`Error connecting to Mongo: ${error}`));
.on('error', (error: Error) => logger.error(`Error connecting to Mongo: ${error}`));
})();

7 changes: 4 additions & 3 deletions db_connect.js → db_connect.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const mongoose = require('mongoose');
import mongoose from "mongoose";
const logger = require('./logger');

// connect to database
Expand All @@ -12,12 +12,13 @@ if (!MONGO_URI) {
throw new Error('You must provide a MongoDB URI');
}
logger.info(`Connecting to: ${MONGO_URI}`);
// TODO: Update mongoose to latest version
const connect = () => {
mongoose.connect(MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
} as any); // older version of mongoose that does not have the ConnectOptions type defined.
return mongoose;
};

module.exports = connect;
export default connect;
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ const calculateEarnings = async () => {
for (const order of orders) {
const amount = order.amount;
const fee = order.fee;
const botFee = order.bot_fee || parseFloat(process.env.MAX_FEE);
const botFee = order.bot_fee || Number(process.env.MAX_FEE);
const communityFeePercent =
order.community_fee || parseFloat(process.env.FEE_PERCENT);
order.community_fee || Number(process.env.FEE_PERCENT);
const maxFee = amount * botFee;
const communityFee = fee - maxFee * communityFeePercent;
const earnings = earningsMap.get(order.community_id) || [0, 0];
Expand All @@ -36,7 +36,7 @@ const calculateEarnings = async () => {
);
}
} catch (error) {
const message = error.toString();
const message = String(error);
logger.error(`calculateEarnings catch error: ${message}`);
}
};
Expand Down
9 changes: 6 additions & 3 deletions jobs/cancel_orders.js → jobs/cancel_orders.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import { Telegraf } from "telegraf";
import { MainContext } from "../bot/start";

const { User, Order } = require('../models');
const { cancelShowHoldInvoice, cancelAddInvoice } = require('../bot/commands');
const messages = require('../bot/messages');
const { getUserI18nContext, holdInvoiceExpirationInSecs } = require('../util');
const logger = require('../logger');

const cancelOrders = async bot => {
const cancelOrders = async (bot: Telegraf<MainContext>) => {
try {
const holdInvoiceTime = new Date();
holdInvoiceTime.setSeconds(
holdInvoiceTime.getSeconds() -
parseInt(process.env.HOLD_INVOICE_EXPIRATION_WINDOW)
Number(process.env.HOLD_INVOICE_EXPIRATION_WINDOW)
);
// We get the orders where the seller didn't pay the hold invoice before expired
// or where the buyer didn't add the invoice
Expand Down Expand Up @@ -70,7 +73,7 @@ const cancelOrders = async bot => {
// Now we cancel orders expired
// ==============================
orderTime = new Date();
let orderExpirationTime = parseInt(
let orderExpirationTime = Number(
process.env.ORDER_PUBLISHED_EXPIRATION_WINDOW
);
orderExpirationTime = orderExpirationTime + orderExpirationTime * 0.2;
Expand Down
9 changes: 6 additions & 3 deletions jobs/communities.js → jobs/communities.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { Telegraf } from "telegraf";
import { MainContext } from "../bot/start";

const { Order, Community } = require('../models');
const logger = require('../logger');

const deleteCommunity = async bot => {
const deleteCommunity = async (bot: Telegraf<MainContext>) => {
try {
const communities = await Community.find();
for (const community of communities) {
// Delete communities with COMMUNITY_TTL days without a successful order
const days = 86400 * parseInt(process.env.COMMUNITY_TTL);
const days = 86400 * Number(process.env.COMMUNITY_TTL);
const time = new Date();
time.setSeconds(time.getSeconds() - days);
// If is a new community we don't do anything
Expand All @@ -26,7 +29,7 @@ const deleteCommunity = async bot => {
}
}
} catch (error) {
const message = error.toString();
const message = String(error);
logger.error(`deleteCommunity catch error: ${message}`);
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import { Telegraf } from "telegraf";
import { MainContext } from "../bot/start";

const { Order } = require('../models');
const { deleteOrderFromChannel } = require('../util');
const logger = require('../logger');

const deleteOrders = async bot => {
const deleteOrders = async (bot: Telegraf<MainContext>) => {
try {
const windowTime = new Date();
windowTime.setSeconds(
windowTime.getSeconds() -
parseInt(process.env.ORDER_PUBLISHED_EXPIRATION_WINDOW)
Number(process.env.ORDER_PUBLISHED_EXPIRATION_WINDOW)
);
// We get the pending orders where time is expired
const pendingOrders = await Order.find({
Expand All @@ -25,7 +28,7 @@ const deleteOrders = async bot => {
await deleteOrderFromChannel(orderCloned, bot.telegram);
}
} catch (error) {
const message = error.toString();
const message = String(error);
logger.error(`deleteOrders catch error: ${message}`);
}
};
Expand Down
7 changes: 5 additions & 2 deletions jobs/node_info.js → jobs/node_info.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import { Telegraf } from "telegraf";
import { MainContext } from "../bot/start";

const { Config } = require('../models');
const { getInfo } = require('../ln');
const logger = require('../logger');

const info = async bot => {
const info = async (bot: Telegraf<MainContext>) => {
try {
const config = await Config.findOne({});
const info = await getInfo();
Expand All @@ -12,7 +15,7 @@ const info = async bot => {
config.node_uri = info.uris[0];
await config.save();
} catch (error) {
const message = error.toString();
const message = String(error);
logger.error(`node info catch error: ${message}`);
}
};
Expand Down
8 changes: 4 additions & 4 deletions ln/connect.js → ln/connect.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const fs = require('fs');
const path = require('path');
const lightning = require('lightning');
import * as fs from 'fs';
import path = require('path');
import * as lightning from "lightning";
const logger = require('../logger');

const { authenticatedLndGrpc } = lightning;
Expand Down Expand Up @@ -47,4 +47,4 @@ const { lnd } = authenticatedLndGrpc({
socket,
});

module.exports = lnd;
export default lnd;
20 changes: 10 additions & 10 deletions ln/hold_invoice.js → ln/hold_invoice.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
const { createHash, randomBytes } = require('crypto');
const lightning = require('lightning');
const lnd = require('./connect');
import { randomBytes, createHash } from 'crypto';
import * as lightning from "lightning";
import lnd from './connect'
const logger = require('../logger');

const createHoldInvoice = async ({ description, amount }) => {
const createHoldInvoice = async (description: string, amount: number ) => {
try {
const randomSecret = () => randomBytes(32);
const sha256 = buffer => createHash('sha256').update(buffer).digest('hex');
const sha256 = (buffer: Buffer): string => createHash('sha256').update(buffer).digest('hex');
// We create a random secret
const secret = randomSecret();
const expiresAt = new Date();
expiresAt.setSeconds(expiresAt.getSeconds() + 3600);

const hash = sha256(secret);
const cltv_delta = parseInt(process.env.HOLD_INVOICE_CLTV_DELTA);
const cltv_delta = Number(process.env.HOLD_INVOICE_CLTV_DELTA);
const { request, id } = await lightning.createHodlInvoice({
cltv_delta,
lnd,
description,
id: hash,
tokens: amount,
expires_at: expiresAt,
expires_at: expiresAt.toISOString(),
});

// We sent back the response hash (id) to be used on testing
Expand All @@ -30,23 +30,23 @@ const createHoldInvoice = async ({ description, amount }) => {
}
};

const settleHoldInvoice = async ({ secret }) => {
const settleHoldInvoice = async ( secret: string ) => {
try {
await lightning.settleHodlInvoice({ lnd, secret });
} catch (error) {
logger.error(error);
}
};

const cancelHoldInvoice = async ({ hash }) => {
const cancelHoldInvoice = async ( hash: string ) => {
try {
await lightning.cancelHodlInvoice({ lnd, id: hash });
} catch (error) {
logger.error(error);
}
};

const getInvoice = async ({ hash }) => {
const getInvoice = async ( hash: string ) => {
try {
return await lightning.getInvoice({ lnd, id: hash });
} catch (error) {
Expand Down
8 changes: 3 additions & 5 deletions ln/info.js → ln/info.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
const lightning = require('lightning');
const lnd = require('./connect');
import * as lightning from "lightning";
import lnd from './connect'
const logger = require('../logger');

const getInfo = async () => {
export const getInfo = async () => {
try {
return await lightning.getWalletInfo({ lnd });
} catch (error) {
logger.error(error);
}
};

module.exports = { getInfo };
12 changes: 7 additions & 5 deletions ln/resubscribe_invoices.js → ln/resubscribe_invoices.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
const { getInvoices } = require('lightning');
const lnd = require('./connect');
import { Telegraf } from 'telegraf';
import { MainContext } from "../bot/start";
import { getInvoices, GetInvoicesResult } from 'lightning';
import lnd from './connect';
const subscribeInvoice = require('./subscribe_invoice');
const { Order } = require('../models');
const logger = require('../logger');

const resubscribeInvoices = async bot => {
const resubscribeInvoices = async (bot: Telegraf<MainContext>) => {
try {
let invoicesReSubscribed = 0;
const isHeld = invoice => !!invoice.is_held;
const isHeld = (invoice: any) => !!invoice.is_held;
const unconfirmedInvoices = (
await getInvoices({
lnd,
Expand All @@ -29,7 +31,7 @@ const resubscribeInvoices = async bot => {
}
logger.info(`Invoices resubscribed: ${invoicesReSubscribed}`);
} catch (error) {
logger.error(`ResuscribeInvoice catch: ${error.toString()}`);
logger.error(`ResuscribeInvoice catch: ${String(error)}`);
return false;
}
};
Expand Down
8 changes: 5 additions & 3 deletions ln/subscribe_invoice.js → ln/subscribe_invoice.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
const { subscribeToInvoice } = require('lightning');
import { Telegraf } from "telegraf";
import { MainContext } from "../bot/start";
import {subscribeToInvoice} from 'lightning'
const { Order, User } = require('../models');
const { payToBuyer } = require('./pay_request');
const lnd = require('./connect');
import lnd from "./connect";
const messages = require('../bot/messages');
const ordersActions = require('../bot/ordersActions');
const { getUserI18nContext, getEmojiRate, decimalRound } = require('../util');
const logger = require('../logger');

const subscribeInvoice = async (bot, id, resub) => {
const subscribeInvoice = async (bot: Telegraf<MainContext>, id: string, resub: boolean) => {
try {
const sub = subscribeToInvoice({ id, lnd });
sub.on('invoice_updated', async invoice => {
Expand Down
13 changes: 5 additions & 8 deletions lnurl/lnurl-pay.js → lnurl/lnurl-pay.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
const axios = require('axios').default;
import axios from 'axios';
const logger = require('../logger');

// {
// pr: String, // bech32-serialized lightning invoice
// routes: [], // an empty array
// }
const resolvLightningAddress = async (address, amountMsat) => {
const resolvLightningAddress = async (address: string, amountMsat: number) => {
const [user, domain] = address.split('@');
const lnAddressQuery = `https://${domain}/.well-known/lnurlp/${user}`;

Expand All @@ -17,7 +17,7 @@ const resolvLightningAddress = async (address, amountMsat) => {
}

if (
(lnAddressRes.minSendable > amountMsat) |
(lnAddressRes.minSendable > amountMsat) ||
(lnAddressRes.maxSendable < amountMsat)
) {
logger.info('lnAddress invalid amount');
Expand All @@ -31,7 +31,7 @@ const resolvLightningAddress = async (address, amountMsat) => {
return res;
};

const existLightningAddress = async address => {
const existLightningAddress = async (address: string) => {
const [user, domain] = address.split('@');
const lnAddressQuery = `https://${domain}/.well-known/lnurlp/${user}`;

Expand All @@ -49,7 +49,4 @@ const existLightningAddress = async address => {
}
};

module.exports = {
resolvLightningAddress,
existLightningAddress,
};
export { resolvLightningAddress, existLightningAddress }
10 changes: 5 additions & 5 deletions logger.js → logger.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const winston = require('winston');
import * as winston from 'winston';

const level = process.env.LOG_LEVEL || 'notice';

Expand All @@ -9,9 +9,8 @@ const logger = winston.createLogger({
}),
winston.format.colorize(),
winston.format.printf(info => {
return `[${info.timestamp}] ${info.level}: ${info.message} ${
info.stack ? info.stack : ''
}`;
return `[${info.timestamp}] ${info.level}: ${info.message} ${info.stack ? info.stack : ''
}`;
})
),
levels: winston.config.syslog.levels,
Expand All @@ -24,4 +23,5 @@ const logger = winston.createLogger({
exitOnError: false,
});

module.exports = logger;

export default logger;
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"compilerOptions": {
"strict": true,
"downlevelIteration": true,
}
}

0 comments on commit 55b0de3

Please sign in to comment.