|
import discord |
|
import logging |
|
import os |
|
from huggingface_hub import InferenceClient |
|
import requests |
|
import asyncio |
|
import subprocess |
|
|
|
|
|
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(name)s:%(message)s', handlers=[logging.StreamHandler()]) |
|
|
|
|
|
intents = discord.Intents.default() |
|
intents.message_content = True |
|
intents.messages = True |
|
intents.guilds = True |
|
intents.guild_messages = True |
|
|
|
|
|
hf_client = InferenceClient("CohereForAI/c4ai-command-r-plus", token=os.getenv("HF_TOKEN")) |
|
|
|
|
|
PEXELS_API_KEY = "5woz23MGx1QrSY0WHFb0BRi29JvbXPu97Hg0xnklYgHUI8G0w23FKH62" |
|
PEXELS_VIDEO_API_URL = "https://api.pexels.com/videos/search" |
|
|
|
|
|
SPECIFIC_CHANNEL_ID = int(os.getenv("DISCORD_CHANNEL_ID")) |
|
|
|
|
|
conversation_history = [] |
|
|
|
class MyClient(discord.Client): |
|
def __init__(self, *args, **kwargs): |
|
super().__init__(*args, **kwargs) |
|
self.is_processing = False |
|
|
|
async def on_ready(self): |
|
logging.info(f'{self.user}λ‘ λ‘κ·ΈμΈλμμ΅λλ€!') |
|
subprocess.Popen(["python", "web.py"]) |
|
logging.info("Web.py server has been started.") |
|
|
|
|
|
channel = self.get_channel(SPECIFIC_CHANNEL_ID) |
|
if channel: |
|
await channel.send("μ°Ύκ³ μΆμ λΉλμ€μ λν μ€λͺ
μ ν λ¬Έμ₯ λ¨μλ‘ μ
λ ₯νμΈμ. μ) λ°λ€μμ μννλ μ¬λ") |
|
|
|
async def on_message(self, message): |
|
if message.author == self.user: |
|
return |
|
if not self.is_message_in_specific_channel(message): |
|
return |
|
if self.is_processing: |
|
return |
|
self.is_processing = True |
|
try: |
|
|
|
keywords = await extract_keywords(message) |
|
if keywords: |
|
|
|
video_urls = await search_videos(keywords) |
|
if video_urls: |
|
|
|
await create_thread_and_send_videos(message, keywords, video_urls) |
|
else: |
|
await message.channel.send(f"**{keywords}**μ λν κ³ ν΄μλ λΉλμ€λ₯Ό μ°Ύμ μ μμ΅λλ€.") |
|
else: |
|
await message.channel.send("ν€μλλ₯Ό μΆμΆν μ μμ΅λλ€.") |
|
finally: |
|
self.is_processing = False |
|
|
|
def is_message_in_specific_channel(self, message): |
|
|
|
return message.channel.id == SPECIFIC_CHANNEL_ID or ( |
|
isinstance(message.channel, discord.Thread) and message.channel.parent_id == SPECIFIC_CHANNEL_ID |
|
) |
|
|
|
async def extract_keywords(message): |
|
user_input = message.content |
|
system_prompt = "λ€μ λ¬Έμ₯μ μλ―Έμ λ§λ μλ¬Έ ν€μλλ₯Ό μΆμΆνμΈμ: " |
|
|
|
logging.debug(f'Extracting keywords from user input: {user_input}') |
|
|
|
messages = [{"role": "system", "content": system_prompt + user_input}] |
|
logging.debug(f'Messages to be sent to the model: {messages}') |
|
|
|
loop = asyncio.get_event_loop() |
|
response = await loop.run_in_executor(None, lambda: hf_client.chat_completion( |
|
messages, max_tokens=10, temperature=0.7, top_p=0.85)) |
|
|
|
|
|
if response.choices and response.choices[0].message: |
|
keywords = response.choices[0].message['content'].strip() |
|
else: |
|
keywords = "" |
|
logging.debug(f'Extracted keywords: {keywords}') |
|
return keywords |
|
|
|
async def search_videos(keywords): |
|
headers = { |
|
"Authorization": PEXELS_API_KEY |
|
} |
|
params = { |
|
"query": keywords, |
|
"per_page": 40 |
|
} |
|
response = requests.get(PEXELS_VIDEO_API_URL, headers=headers, params=params) |
|
if response.status_code == 200: |
|
data = response.json() |
|
return [video['video_files'][0]['link'] for video in data['videos']] |
|
return None |
|
|
|
async def create_thread_and_send_videos(message, keywords, video_urls): |
|
|
|
thread = await message.channel.create_thread(name=f"{message.author.name}μ κ²μ κ²°κ³Ό", message=message) |
|
message_content = f"**{keywords}**μ λν κ³ ν΄μλ λΉλμ€ {len(video_urls)}κ°λ₯Ό μ°Ύμμ΅λλ€:" |
|
await thread.send(message_content) |
|
for url in video_urls: |
|
await thread.send(url) |
|
|
|
if __name__ == "__main__": |
|
discord_client = MyClient(intents=intents) |
|
discord_client.run(os.getenv('DISCORD_TOKEN')) |
|
|