Update discord message format

This commit is contained in:
Matthias 2022-06-11 12:02:41 +02:00
parent eb4adeab4d
commit f816c15e1e

View File

@ -1,61 +1,44 @@
import json
import logging import logging
from typing import Dict, Any from typing import Any, Dict
import requests
from freqtrade.constants import DATETIME_PRINT_FORMAT
from freqtrade.enums import RPCMessageType from freqtrade.enums import RPCMessageType
from freqtrade.rpc import RPCHandler, RPC from freqtrade.rpc import RPC
from freqtrade.rpc.webhook import Webhook
class Discord(RPCHandler): logger = logging.getLogger(__name__)
class Discord(Webhook):
def __init__(self, rpc: 'RPC', config: Dict[str, Any]): def __init__(self, rpc: 'RPC', config: Dict[str, Any]):
super().__init__(rpc, config) # super().__init__(rpc, config)
self.logger = logging.getLogger(__name__) self.rpc = rpc
self.config = config
self.strategy = config.get('strategy', '') self.strategy = config.get('strategy', '')
self.timeframe = config.get('timeframe', '') self.timeframe = config.get('timeframe', '')
self.config = config
def send_msg(self, msg: Dict[str, str]) -> None: self._url = self.config['discord']['webhook_url']
self._send_msg(msg) self._format = 'json'
self._retries = 1
self._retry_delay = 0.1
def _send_msg(self, msg): def cleanup(self) -> None:
""" """
msg = { Cleanup pending module resources.
'type': (RPCMessageType.EXIT_FILL if fill This will do nothing for webhooks, they will simply not be called anymore
else RPCMessageType.EXIT),
'trade_id': trade.id,
'exchange': trade.exchange.capitalize(),
'pair': trade.pair,
'leverage': trade.leverage,
'direction': 'Short' if trade.is_short else 'Long',
'gain': gain,
'limit': profit_rate,
'order_type': order_type,
'amount': trade.amount,
'open_rate': trade.open_rate,
'close_rate': trade.close_rate,
'current_rate': current_rate,
'profit_amount': profit_trade,
'profit_ratio': profit_ratio,
'buy_tag': trade.enter_tag,
'enter_tag': trade.enter_tag,
'sell_reason': trade.exit_reason, # Deprecated
'exit_reason': trade.exit_reason,
'open_date': trade.open_date,
'close_date': trade.close_date or datetime.utcnow(),
'stake_currency': self.config['stake_currency'],
'fiat_currency': self.config.get('fiat_display_currency', None),
}
""" """
self.logger.info(f"Sending discord message: {msg}") pass
def send_msg(self, msg) -> None:
logger.info(f"Sending discord message: {msg}")
# TODO: handle other message types # TODO: handle other message types
if msg['type'] == RPCMessageType.EXIT_FILL: if msg['type'] == RPCMessageType.EXIT_FILL:
profit_ratio = msg.get('profit_ratio') profit_ratio = msg.get('profit_ratio')
open_date = msg.get('open_date').strftime('%Y-%m-%d %H:%M:%S') open_date = msg.get('open_date').strftime(DATETIME_PRINT_FORMAT)
close_date = msg.get('close_date').strftime( close_date = msg.get('close_date').strftime(
'%Y-%m-%d %H:%M:%S') if msg.get('close_date') else '' DATETIME_PRINT_FORMAT) if msg.get('close_date') else ''
embeds = [{ embeds = [{
'title': '{} Trade: {}'.format( 'title': '{} Trade: {}'.format(
@ -63,7 +46,7 @@ class Discord(RPCHandler):
msg.get('pair')), msg.get('pair')),
'color': (0x00FF00 if profit_ratio > 0 else 0xFF0000), 'color': (0x00FF00 if profit_ratio > 0 else 0xFF0000),
'fields': [ 'fields': [
{'name': 'Trade ID', 'value': msg.get('id'), 'inline': True}, {'name': 'Trade ID', 'value': msg.get('trade_id'), 'inline': True},
{'name': 'Exchange', 'value': msg.get('exchange').capitalize(), 'inline': True}, {'name': 'Exchange', 'value': msg.get('exchange').capitalize(), 'inline': True},
{'name': 'Pair', 'value': msg.get('pair'), 'inline': True}, {'name': 'Pair', 'value': msg.get('pair'), 'inline': True},
{'name': 'Direction', 'value': 'Short' if msg.get( {'name': 'Direction', 'value': 'Short' if msg.get(
@ -75,11 +58,10 @@ class Discord(RPCHandler):
{'name': 'Open date', 'value': open_date, 'inline': True}, {'name': 'Open date', 'value': open_date, 'inline': True},
{'name': 'Close date', 'value': close_date, 'inline': True}, {'name': 'Close date', 'value': close_date, 'inline': True},
{'name': 'Profit', 'value': msg.get('profit_amount'), 'inline': True}, {'name': 'Profit', 'value': msg.get('profit_amount'), 'inline': True},
{'name': 'Profitability', 'value': '{:.2f}%'.format( {'name': 'Profitability', 'value': f'{profit_ratio:.2%}', 'inline': True},
profit_ratio * 100), 'inline': True},
{'name': 'Stake currency', 'value': msg.get('stake_currency'), 'inline': True}, {'name': 'Stake currency', 'value': msg.get('stake_currency'), 'inline': True},
{'name': 'Fiat currency', 'value': msg.get( {'name': 'Fiat currency', 'value': msg.get('fiat_display_currency'),
'fiat_display_currency'), 'inline': True}, 'inline': True},
{'name': 'Buy Tag', 'value': msg.get('enter_tag'), 'inline': True}, {'name': 'Buy Tag', 'value': msg.get('enter_tag'), 'inline': True},
{'name': 'Sell Reason', 'value': msg.get('exit_reason'), 'inline': True}, {'name': 'Sell Reason', 'value': msg.get('exit_reason'), 'inline': True},
{'name': 'Strategy', 'value': self.strategy, 'inline': True}, {'name': 'Strategy', 'value': self.strategy, 'inline': True},
@ -89,20 +71,9 @@ class Discord(RPCHandler):
# convert all value in fields to string for discord # convert all value in fields to string for discord
for embed in embeds: for embed in embeds:
for field in embed['fields']: for field in embed['fields']: # type: ignore
field['value'] = str(field['value']) field['value'] = str(field['value'])
# Send the message to discord channel # Send the message to discord channel
payload = { payload = {'embeds': embeds}
'embeds': embeds, self._send_msg(payload)
}
headers = {
'Content-Type': 'application/json',
}
try:
requests.post(
self.config['discord']['webhook_url'],
data=json.dumps(payload),
headers=headers)
except Exception as e:
self.logger.error(f"Failed to send discord message: {e}")