-
Notifications
You must be signed in to change notification settings - Fork 1
/
bot.js
121 lines (104 loc) · 4.19 KB
/
bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const logger = require('winston')
const Discord = require('discord.js')
const { ethers } = require('ethers')
const { ContractRegistry, ChainContract, APIClient } = require('@umb-network/toolbox')
//
// Inintialisation
//
require('dotenv').config()
const {
UMBRELLA_API_URL,
UMBRELLA_API_KEY,
UMBRELLA_REGISTRY_CONTRACT_ADDRESS,
BLOCKCHAIN_PROVIDER_URL,
} = process.env
logger.remove(logger.transports.Console)
logger.add(new logger.transports.Console, { colorize: true })
logger.level = 'debug'
//
// Initialize Discord Bot
//
const client = new Discord.Client()
client.on('ready', function (evt) {
logger.info('Connected')
logger.info('Logged in as: ' + client.user.username)
getPriceData()
setInterval(getPriceData, 30000) // Get new data every 30 secs
})
client.on("message", message => {
logger.info("message: ", message.content)
if (message.content === '!tickers' || message.content === '!ticker') {
if (Object.keys(priceData).length > 0) {
let supportedTickers = Object.keys(priceData).map(ticker => ticker).join(', ')
message.reply(`\n\nSupported tickers:\n\n ${supportedTickers}`)
}
}
else if (message.content && message.content[0] === '!' && message.content.length > 1) {
const symbol = message.content.replace("!", "").toUpperCase()
const price = priceData && priceData[symbol]
if (price) {
message.reply(`Changed bot price to ${symbol}`)
client.user.setActivity(`${symbol} $${price}`, { type: 'WATCHING' })
.then(presence => console.log(`Activity set to ${presence.activities[0].name}`))
.catch(error => {
logger.error(error)
message.reply(`Error changing activity`)
})
} else {
message.reply(`Ticker not supported. Let us know if you want ${symbol} included 😉`)
}
}
})
//
// Fetch Price Data
//
let apiClient = undefined
let priceData = {}
async function setApiClient() {
const provider = new ethers.providers.JsonRpcProvider(BLOCKCHAIN_PROVIDER_URL)
const contractRegistry = new ContractRegistry(provider, UMBRELLA_REGISTRY_CONTRACT_ADDRESS)
const chainContractAddress = await contractRegistry.getAddress('Chain')
const chainContract = new ChainContract(provider, chainContractAddress)
apiClient = new APIClient({
baseURL: UMBRELLA_API_URL,
chainContract,
apiKey: UMBRELLA_API_KEY,
})
getPriceData()
}
async function getPriceData() {
if (apiClient === undefined) {
await setApiClient()
}
else if (apiClient && BLOCKCHAIN_PROVIDER_URL && UMBRELLA_REGISTRY_CONTRACT_ADDRESS && UMBRELLA_API_KEY) {
logger.info("Fetching price data...")
const getNewestBlockResult = await apiClient.getNewestBlock()
const getLeavesOfBlockResult = await apiClient.getLeavesOfBlock(getNewestBlockResult.blockId);
let formattedResult = []
for (let i=0; i<getLeavesOfBlockResult.length; i++) {
const ticker = getLeavesOfBlockResult[i]
// Store only USD values
if (ticker.key.includes('-USD')) {
formattedResult.push({
symbol: ticker.key.replace('-USD', ''),
value: ticker.value && parseFloat(ethers.utils.formatEther( ticker.value ))
})
}
}
formattedResult
.map( j => {
priceData[j.symbol] = j.value
})
logger.info(priceData)
// Set default ticker to BTC if none is found
if (client.user.presence && client.user.presence.activities && client.user.presence.activities.length === 0) {
client.user.setActivity(`BTC $${priceData['BTC']}`, { type: 'WATCHING' })
.then(presence => console.log(`Activity set to ${presence.activities[0].name}`))
.catch(error => {
logger.error(error)
message.reply(`Error changing activity`)
})
}
}
}
client.login(process.env.DISCORD_BOT_TOKEN)