lunarflu's picture
lunarflu HF Staff
added author names to thread replies
e93ef71 verified
raw
history blame
5.05 kB
import discord
import threading
import os
import gradio as gr
from discord.ext import commands
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
DISCORD_TOKEN = os.getenv('DISCORD_TOKEN')
SLACK_BOT_TOKEN = os.getenv('BOT_USER_OAUTH_TOKEN_HF')
# real = os.getenv('SLACK_CHANNEL_ID_HF')
# test = 'C07B4KNU5BQ'
SLACK_CHANNEL_ID = os.getenv('SLACK_CHANNEL_ID_HF')
TRIGGERS = {
"discord bot": "<@U051DB2754M>", # Adam
"text to speech": "<@U039C2GANMV>", # VB
"tts": "<@U039C2GANMV>", # VB
"asr": "<@U039C2GANMV>", # VB
"musicgen": "<@U039C2GANMV>", # VB
"whisper": "<@U039C2GANMV>", # VB
"speech recognition": "<@U039C2GANMV>", # VB
"bark": "<@U039C2GANMV>", # VB
"autotrain": "<@U01E3LEC2N7>", # abhishek
"auto train": "<@U01E3LEC2N7>", # abhishek
"competition": "<@U01E3LEC2N7>", # abhishek
"competitions": "<@U01E3LEC2N7>", # abhishek
"sentence-transformers": "<@U04E4DNPWG7>", # tom aarsen
"sentence_transformers": "<@U04E4DNPWG7>", # tom aarsen
"setfit": "<@U04E4DNPWG7>", # tom aarsen
"sentence transformers": "<@U04E4DNPWG7>", # tom aarsen
"argilla": "<@U076B8C7G3E>", # david berenstein
"distilabel": "<@U076B8C7G3E>", # david berenstein
"argilla": "<@U0766H30T7F>", # natalia elvira
"dataset": "<@U0766H30T7F>", # natalia elvira
"docs": "<@U02DATT4C5B>", # steven liu
"documentation": "<@U02DATT4C5B>", # steven liu
}
intents = discord.Intents.all()
intents.messages = True
bot = commands.Bot(command_prefix='!', intents=intents)
slack_client = WebClient(token=SLACK_BOT_TOKEN)
thread_mapping = {}
# 1259415803879751700 = test forum
# 1019883044724822016 = ask for help
FORUM_CHANNEL_ID = 1259415803879751700
@bot.event
async def on_ready():
print(f'Logged in as {bot.user}')
@bot.event
async def on_message(message):
if message.author == bot.user:
return
# notification bot
huggingfolks_role = discord.utils.get(message.guild.roles, id=897376942817419265)
bots_role = discord.utils.get(message.guild.roles, id=1258328471609016341)
if huggingfolks_role not in message.author.roles: # no need for ping if we're already discussing
if bots_role not in message.author.roles: # bots shouldn't trigger pings for this
content = message.content.lower()
for trigger, slack_mention in TRIGGERS.items():
if trigger in content:
await post_to_slack(message.author, message.content, message.channel.name, message.jump_url, slack_mention, trigger)
break
# Check if the message is in a thread
if isinstance(message.channel, discord.Thread):
discord_thread_id = message.channel.id
# Check if there's an existing Slack thread for this Discord thread
# (the only Slack threads created should be for forum channel threads, not just any thread)
if discord_thread_id in thread_mapping:
slack_thread_ts = thread_mapping[discord_thread_id]
# post to slack only if thread already exists
post_to_slack_forum_version(SLACK_CHANNEL_ID, message.content, thread_ts=slack_thread_ts)
@bot.event
async def on_thread_create(thread):
# (discord) must be the child thread of the CORRECT forum channel(s) (not just any thread, or any forum channel)
if isinstance(thread.parent, discord.ForumChannel) and thread.parent.id == FORUM_CHANNEL_ID:
discord_thread_id = thread.id
slack_thread_ts = post_to_slack_forum_version(
SLACK_CHANNEL_ID,
f"New forum thread started in #ask-for-help by {thread.owner}: *{thread.name}*\n"
f"{thread.jump_url}",
thread.author
)
if slack_thread_ts:
thread_mapping[discord_thread_id] = slack_thread_ts
def post_to_slack_forum_version(channel, text, author, thread_ts=None):
try:
response = slack_client.chat_postMessage(
channel=channel,
text=author + ": " + text,
thread_ts=thread_ts
)
return response['ts'] # Return the Slack message timestamp (thread ID)
except SlackApiError as e:
print(f"Error posting to Slack: {e.response['error']}")
return None
#----------------------------------------------------------------------------------------------
async def post_to_slack(author, content, channel, url, slack_mention, trigger):
try:
response = slack_client.chat_postMessage(
channel=SLACK_CHANNEL_ID,
text=f"{slack_mention} (for the keyword -> '{trigger}')\nFrom {author} in channel #{channel}: {content}\n{url}"
)
except SlackApiError as e:
print(f"Error posting to Slack: {e.response['error']}")
# runs discord bot in thread = helps avoid blocking calls
def run_bot():
bot.run(DISCORD_TOKEN)
threading.Thread(target=run_bot).start()
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()