implemented completed deposit (3 confirmations) notifications
This commit is contained in:
parent
929c1ea9ae
commit
2395ad3b66
3 changed files with 57 additions and 3 deletions
43
app.js
43
app.js
|
@ -28,6 +28,7 @@ const messageTemplates = {};
|
||||||
const templateNames = [
|
const templateNames = [
|
||||||
'onbalance',
|
'onbalance',
|
||||||
'ondeposit',
|
'ondeposit',
|
||||||
|
'ondeposit.completed',
|
||||||
'ongild',
|
'ongild',
|
||||||
'ongild.insufficientfunds',
|
'ongild.insufficientfunds',
|
||||||
'onsendtip',
|
'onsendtip',
|
||||||
|
@ -148,6 +149,41 @@ const createOrGetUserId = (username, callback) => {
|
||||||
], callback);
|
], callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const processCompletedDeposits = (callback) => {
|
||||||
|
async.waterfall([
|
||||||
|
(cb) => {
|
||||||
|
db.query('SELECT C.DepositId, D.Amount, U.Username, U.Balance FROM CompletedDepositConfirmations C JOIN Deposits D ON D.Id = C.DepositId JOIN Users U ON U.Id = C.UserId', cb);
|
||||||
|
},
|
||||||
|
(res, fields, cb) => {
|
||||||
|
if (res.length > 0) {
|
||||||
|
return async.eachSeries(res, (completedDeposit, ecb) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
sendPMUsingTemplate('ondeposit.complete', { amount: completedDeposit.Amount, balance: completedDeposit.Balance },
|
||||||
|
'Deposit completed!', completedDeposit.Username, (err) => {
|
||||||
|
if (err) {
|
||||||
|
return ecb(err, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the entry from the DB
|
||||||
|
return db.query('DELETE FROM CompletedDepositConfirmations WHERE DepositId = ?', [C.DepositId], (ierr) => {
|
||||||
|
if (ierr) {
|
||||||
|
return ecb(ierr, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// success
|
||||||
|
return ecb(null, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, 2000); // Wait 2 seconds between each request (if there are multiple to send)
|
||||||
|
// TODO: Implement inserting messages into a pending message queue instead
|
||||||
|
}, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cb(null, null);
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
};
|
||||||
|
|
||||||
const getBalance = (userId, callback) => {
|
const getBalance = (userId, callback) => {
|
||||||
db.query('SELECT Balance FROM Users WHERE Id = ?', [userId], (err, res) => {
|
db.query('SELECT Balance FROM Users WHERE Id = ?', [userId], (err, res) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -953,7 +989,7 @@ const processMessage = function(message, callback) {
|
||||||
const runBot = () => {
|
const runBot = () => {
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
(cb) => {
|
(cb) => {
|
||||||
if (!accessTokenTime || moment.duration(moment().diff(accessTokenTime)).asMinutes() >= 55) {
|
if (!accessTokenTime || moment.duration(moment().diff(accessTokenTime)).asMinutes() >= 59) {
|
||||||
// remove old or expired tokens
|
// remove old or expired tokens
|
||||||
// TODO: Implement refreshToken
|
// TODO: Implement refreshToken
|
||||||
if (fs.existsSync(config.accessTokenPath)) {
|
if (fs.existsSync(config.accessTokenPath)) {
|
||||||
|
@ -975,7 +1011,10 @@ const runBot = () => {
|
||||||
},
|
},
|
||||||
(token, cb) => {
|
(token, cb) => {
|
||||||
globalAccessToken = token;
|
globalAccessToken = token;
|
||||||
retrieveUnreadMessages(token, cb);
|
processCompletedDeposits(cb);
|
||||||
|
},
|
||||||
|
(success, cb) => {
|
||||||
|
retrieveUnreadMessages(globalAccessToken, cb);
|
||||||
},
|
},
|
||||||
(unread, cb) => {
|
(unread, cb) => {
|
||||||
async.eachSeries(unread, (message, ecb) => {
|
async.eachSeries(unread, (message, ecb) => {
|
||||||
|
|
13
sql/ddl.sql
13
sql/ddl.sql
|
@ -52,6 +52,15 @@ CREATE TABLE PendingMessageQueue
|
||||||
PRIMARY KEY `PK_PendingMessageId` (`Id`)
|
PRIMARY KEY `PK_PendingMessageId` (`Id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
||||||
|
|
||||||
|
CREATE TABLE CompletedDepositConfirmations
|
||||||
|
(
|
||||||
|
`DepositId` BIGINT UNSIGNED NOT NULL,
|
||||||
|
`UserId` BIGINT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY `PK_DepositConfirmationId` (`DepositId`),
|
||||||
|
FOREIGN KEY `FK_CompletedDepositConfirmation` (`DepositId`) REFERENCES `Deposits` (`Id`),
|
||||||
|
FOREIGN KEY `FK_CompletedDepositUser` (`UserId`) REFERENCES `Users` (`Id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
||||||
|
|
||||||
CREATE TABLE Deposits
|
CREATE TABLE Deposits
|
||||||
(
|
(
|
||||||
`Id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
`Id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
@ -86,6 +95,7 @@ FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
IF NEW.Confirmations >= 3 THEN
|
IF NEW.Confirmations >= 3 THEN
|
||||||
UPDATE Users U SET U.Balance = U.Balance + NEW.Amount WHERE U.Id = NEW.UserId;
|
UPDATE Users U SET U.Balance = U.Balance + NEW.Amount WHERE U.Id = NEW.UserId;
|
||||||
|
INSERT INTO CompletedDepositConfirmations (DepositId, UserId) VALUES (NEW.Id, NEW.UserId);
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
@ -94,7 +104,8 @@ CREATE TRIGGER `Trg_OnDepositUpdated`
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
IF OLD.Confirmations < 3 AND NEW.Confirmations >= 3 THEN
|
IF OLD.Confirmations < 3 AND NEW.Confirmations >= 3 THEN
|
||||||
UPDATE Users U SET U.Balance = U.Balance + NEW.Amount WHERE U.Id = NEW.UserId;
|
UPDATE Users U SET U.Balance = U.Balance + OLD.Amount WHERE U.Id = OLD.UserId;
|
||||||
|
INSERT INTO CompletedDepositConfirmations (DepositId, UserId) VALUES (OLD.Id, OLD.UserId);
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
4
templates/ondeposit.completed.txt
Normal file
4
templates/ondeposit.completed.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
Great news! Your **{amount} LBC** deposit was completed successfully with 3 confirmations. Your new balance is **{balance} LBC**.
|
||||||
|
|
||||||
|
----
|
||||||
|
[^How ^to ^use]({how_to_use_url}) ^• [^What ^is ^LBRY?](https://lbry.io/faq/what-is-lbry) ^• ^r/lbry
|
Loading…
Reference in a new issue