lunarflu's picture
lunarflu HF staff
New forum thread started in {thread.parent.name}
5021c90 verified
raw
history blame
6.11 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')
# 1259415803879751700 = test forum
# 1019883044724822016 = ask for help
ASK_FOR_HELP_CHANNEL_ID = 1019883044724822016
GRADIO_CHANNEL_ID = 1025174734427656283
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
("gradio",): "<@U02NMK75F1V>", # abubakar abid
("argilla",): "<@U076MF65WEM>", # sara han diaz lorenzo
("distilabel",): "<@U076MF65WEM>", # sara han diaz lorenzo
("argilla",): "<@U0765RENPNZ>", # sara han diaz lorenzo
("distilabel",): "<@U0765RENPNZ>", # sara han diaz lorenzo
("dataset", "feedback"): "<@U0768RCHCRY>", # ben burtenshaw
}
intents = discord.Intents.all()
intents.messages = True
bot = commands.Bot(command_prefix='!', intents=intents)
slack_client = WebClient(token=SLACK_BOT_TOKEN)
thread_mapping = {}
@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):
print("1")
discord_thread_id = message.channel.id
print("2")
# 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:
print("3")
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, message.author, 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 in {ASK_FOR_HELP_CHANNEL_ID, GRADIO_CHANNEL_ID}:
print("4")
discord_thread_id = thread.id
slack_thread_ts = post_to_slack_create_thread(
SLACK_CHANNEL_ID,
f"New forum thread started in {thread.parent.name} by {thread.owner}: *{thread.name}*\n"
f"{thread.jump_url}"
)
print("5")
if slack_thread_ts:
thread_mapping[discord_thread_id] = slack_thread_ts
def post_to_slack_forum_version(channel, text, author, thread_ts=None):
print("6")
text = f"{author}" + ": " + text
try:
response = slack_client.chat_postMessage(
channel=channel,
text=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
def post_to_slack_create_thread(channel, text, thread_ts=None):
print("6")
try:
response = slack_client.chat_postMessage(
channel=channel,
text=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()