110 lines
3.8 KiB
Python
110 lines
3.8 KiB
Python
"""
|
|
This plugin provides a command to fetch the current Bitcoin price.
|
|
"""
|
|
|
|
import logging
|
|
import requests
|
|
import simplematrixbotlib as botlib
|
|
|
|
BITCOIN_API_URL = "https://api.bitcointicker.co/trades/bitstamp/btcusd/60/"
|
|
|
|
|
|
async def handle_command(room, message, bot, prefix, config):
|
|
"""
|
|
Function to handle the !btc command.
|
|
|
|
Args:
|
|
room (Room): The Matrix room where the command was invoked.
|
|
message (RoomMessage): The message object containing the command.
|
|
bot (Bot): The bot object.
|
|
prefix (str): The command prefix.
|
|
config (dict): Configuration parameters.
|
|
|
|
Returns:
|
|
None
|
|
"""
|
|
match = botlib.MessageMatch(room, message, bot, prefix)
|
|
if match.is_not_from_this_bot() and match.prefix() and match.command("btc"):
|
|
logging.info("Received !btc command")
|
|
|
|
try:
|
|
# Fetch Bitcoin price data
|
|
headers = {
|
|
'Accept-Encoding': 'gzip, deflate',
|
|
'User-Agent': 'FunguyBot/1.0'
|
|
}
|
|
|
|
logging.info(f"Fetching Bitcoin price from {BITCOIN_API_URL}")
|
|
response = requests.get(BITCOIN_API_URL, headers=headers, timeout=10)
|
|
response.raise_for_status()
|
|
|
|
data = response.json()
|
|
|
|
if not data or len(data) == 0:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
"No Bitcoin price data available."
|
|
)
|
|
logging.warning("No Bitcoin price data returned from API")
|
|
return
|
|
|
|
# Get the most recent trade (last item in the array)
|
|
latest_trade = data[-1]
|
|
price = latest_trade.get('price')
|
|
|
|
if price is None:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
"Could not extract Bitcoin price from API response."
|
|
)
|
|
logging.error("Price field not found in API response")
|
|
return
|
|
|
|
# Convert to float and format with commas
|
|
try:
|
|
price_float = float(price)
|
|
price_formatted = f"${price_float:,.2f}"
|
|
except (ValueError, TypeError):
|
|
price_formatted = f"${price}"
|
|
|
|
# Optional: Get additional info if available
|
|
timestamp = latest_trade.get('timestamp', '')
|
|
volume = latest_trade.get('volume', '')
|
|
|
|
# Build the message
|
|
message_text = f"<strong>₿ BTC/USD</strong>"
|
|
message_text += f"<strong> Current Price:</strong> {price_formatted}"
|
|
|
|
message_text += ", <em>bitcointicker.co</em>"
|
|
|
|
await bot.api.send_markdown_message(room.room_id, message_text)
|
|
logging.info(f"Sent Bitcoin price: {price_formatted}")
|
|
|
|
except requests.exceptions.Timeout:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
"Request timed out. Bitcoin price API may be slow or unavailable."
|
|
)
|
|
logging.error("Bitcoin API timeout")
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
f"Error fetching Bitcoin price: {e}"
|
|
)
|
|
logging.error(f"Error fetching Bitcoin price: {e}")
|
|
|
|
except (KeyError, IndexError, ValueError) as e:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
"Error parsing Bitcoin price data."
|
|
)
|
|
logging.error(f"Error parsing Bitcoin API response: {e}", exc_info=True)
|
|
|
|
except Exception as e:
|
|
await bot.api.send_text_message(
|
|
room.room_id,
|
|
"An unexpected error occurred while fetching Bitcoin price."
|
|
)
|
|
logging.error(f"Unexpected error in Bitcoin plugin: {e}", exc_info=True)
|