feat: !pies command

This commit is contained in:
Krzysztof Rudnicki 2024-06-24 00:19:43 +02:00
parent 44f965c16b
commit bd3bb4a4cb

121
main.py
View File

@ -4,6 +4,8 @@ import websockets
import requests import requests
import base64 import base64
import json import json
from datetime import datetime, time, timedelta
# Set up environment variable for the phone number # Set up environment variable for the phone number
PHONE_NUMBER = os.getenv('PHONE_NUMBER', '1234567890') # Default to '1234567890' if not set PHONE_NUMBER = os.getenv('PHONE_NUMBER', '1234567890') # Default to '1234567890' if not set
@ -13,6 +15,33 @@ GROUP_ID = os.getenv('GROUP_ID', '')
GROUP_ID_SEND = os.getenv('GROUP_ID_SEND', '') GROUP_ID_SEND = os.getenv('GROUP_ID_SEND', '')
CAT_API = os.getenv('CAT_API', '') CAT_API = os.getenv('CAT_API', '')
def fetch_and_download_dog_image():
# Send request to The Cat API
response = requests.get("https://dog.ceo/api/breeds/image/random")
response.raise_for_status() # Ensure the request was successful
# Parse the response JSON to get the image URL
data = response.json()
image_url = data['message']
# Download the image
image_response = requests.get(image_url)
image_response.raise_for_status() # Ensure the request was successful
# Extract the image filename from the URL
image_filename = image_url.split("/")[-1]
with open(image_filename, 'wb') as image_file:
image_file.write(image_response.content)
# Convert the image to base64 encoded data
with open(image_filename, 'rb') as image_file:
base64_encoded_data = base64.b64encode(image_file.read()).decode('utf-8')
os.remove(image_filename)
return base64_encoded_data
def fetch_and_download_cat_image(): def fetch_and_download_cat_image():
# Send request to The Cat API # Send request to The Cat API
response = requests.get("https://api.thecatapi.com/v1/images/search") response = requests.get("https://api.thecatapi.com/v1/images/search")
@ -39,7 +68,7 @@ def fetch_and_download_cat_image():
os.remove(image_filename) os.remove(image_filename)
return base64_encoded_data return base64_encoded_data
def send_cat(quote_message): def send_cat():
data = { data = {
"base64_attachments": [fetch_and_download_cat_image()], "base64_attachments": [fetch_and_download_cat_image()],
"number": PHONE_NUMBER, "number": PHONE_NUMBER,
@ -52,6 +81,32 @@ def send_cat(quote_message):
print(f"Request failed with status code: {response.status_code}") print(f"Request failed with status code: {response.status_code}")
print(response.text) print(response.text)
def send_dog():
data = {
"base64_attachments": [fetch_and_download_dog_image()],
"number": PHONE_NUMBER,
"recipients": [GROUP_ID_SEND]
}
response = requests.post(SEND_URL, json=data)
if response.status_code == 200:
print("Request was successful.")
else:
print(f"Request failed with status code: {response.status_code}")
print(response.text)
def send_message(message_content):
data = {
"message": message_content,
"number": PHONE_NUMBER,
"recipients": [GROUP_ID_SEND]
}
response = requests.post(SEND_URL, json=data)
if response.status_code == 200:
print("Request was successful.")
else:
print(f"Request failed with status code: {response.status_code}")
print(response.text)
def message_message(inside_message): def message_message(inside_message):
message_value = inside_message.get('message') message_value = inside_message.get('message')
@ -60,9 +115,6 @@ def message_message(inside_message):
def message_group_id(inside_message): def message_group_id(inside_message):
return inside_message.get('groupInfo', {}).get('groupId', {}) return inside_message.get('groupInfo', {}).get('groupId', {})
def message_timestamp(inside_message):
def extract_message_content(message): def extract_message_content(message):
message_json = json.loads(message) message_json = json.loads(message)
inside_message = message_json.get('envelope', {}).get('dataMessage', {}) inside_message = message_json.get('envelope', {}).get('dataMessage', {})
@ -71,22 +123,67 @@ def extract_message_content(message):
return inside_message return inside_message
def extract_source_uuid(message):
#message_json = json.loads(message)
#inside_message = message_json.get('envelope', {}).get('sourceUuid', {})
return ""
def update_string_count(string, mapping):
if string in mapping:
mapping[string] += 1
else:
mapping[string] = 1
return mapping
command_map = { command_map = {
"!kot": lambda name: send_cat(name) "!kot": send_cat,
"!pies": send_dog
} }
async def listen_to_server(): def update_string_count(string, mapping):
uri = f"ws://localhost:9922/v1/receive/{PHONE_NUMBER}" if string in mapping:
mapping[string] += 1
else:
mapping[string] = 1
return mapping
USER_MESSAGE_COUNT = {}
async def count_messages(message_content, queue):
if message_content:
uuid = extract_source_uuid(message_content)
#USER_MESSAGE_COUNT = update_string_count(uuid, USER_MESSAGE_COUNT)
#await queue.put(USER_MESSAGE_COUNT)
async def scheduled_task(queue):
while True:
now = datetime.now()
target_time = datetime.combine(now.date(), time(21, 37))
if now > target_time:
target_time += timedelta(days=1)
wait_time = (target_time - now).total_seconds()
await asyncio.sleep(wait_time)
# Trigger your function here
message_count = await queue.get()
send_message(message_count)
queue.task_done()
async def listen_to_server(queue):
uri = f"ws://localhost:9922/v1/receive/{PHONE_NUMBER}?send_read_receipts=false"
async with websockets.connect(uri) as websocket: async with websockets.connect(uri) as websocket:
print(f"Connected to server at {uri}") print(f"Connected to server at {uri}")
try: try:
async for message in websocket: async for message in websocket:
message_content = extract_message_content(message) message_content = extract_message_content(message)
if message_group_id(message_content) == GROUP_ID: if message_group_id(message_content) == GROUP_ID:
await count_messages(message_content, queue)
message_value = message_message(message_content) message_value = message_message(message_content)
print("message_value: ", message_value)
if message_value in command_map: if message_value in command_map:
# Call the corresponding function # Call the corresponding function
command_map[message_value]() command_map[message_value]()
@ -95,5 +192,11 @@ async def listen_to_server():
except websockets.ConnectionClosed as e: except websockets.ConnectionClosed as e:
print(f"Connection closed: {e}") print(f"Connection closed: {e}")
async def main():
queue = asyncio.Queue()
task1 = asyncio.create_task(listen_to_server(queue))
# task2 = asyncio.create_task(scheduled_task(queue))
await asyncio.gather(task1)# task2)
if __name__ == "__main__": if __name__ == "__main__":
asyncio.run(listen_to_server()) asyncio.run(main())