Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 7,045 Bytes
78dea1a db21dc3 434f798 db21dc3 78dea1a b7eca85 ad9d692 8dd1108 ad9d692 b7eca85 4b7b722 56509cf d3ba82c 09d6ac2 ad9d692 09d6ac2 b8997d2 d3ba82c b7eca85 b8997d2 b7eca85 ad9d692 78dea1a b7eca85 75d2f81 b7eca85 b80bf81 09d6ac2 b80bf81 d3ba82c 78dea1a b7eca85 78dea1a b7eca85 9177836 e57e72d b91f995 ad9d692 b7eca85 b80bf81 d3ba82c b80bf81 d3ba82c 37b0b26 90c7959 b80bf81 d3ba82c b8997d2 b80bf81 952362b 5021c90 952362b d3ba82c b80bf81 0654423 90c7959 37b0b26 6fca786 d589312 3c830fa b80bf81 952362b b80bf81 3c830fa b80bf81 3c830fa b80bf81 0654423 952362b ad9d692 0654423 ad9d692 9177836 a368445 b7eca85 7b3eccf 9e52f3a b7eca85 0654423 d4ce55b 423608d 042175b db21dc3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
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
import aiojobs
import asyncio
from datetime import datetime, timedelta
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')
SLACK_CHANNEL_ID_TEST = 'C07B4KNU5BQ'
# 1259415803879751700 = test forum
# 1019883044724822016 = ask for help
ASK_FOR_HELP_CHANNEL_ID = 1019883044724822016
GRADIO_CHANNEL_ID = 1025174734427656283
TRIGGERS = {
("discord bot",): "<@U051DB2754M>", # adam
("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
}
daily_pings = []
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 all(word in content for word in trigger):
daily_pings.append({
'author': str(message.author),
'content': message.content,
'channel': message.channel.name,
'url': message.jump_url,
'mention': slack_mention,
'trigger': 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(message, 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}:
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}"
)
if slack_thread_ts:
thread_mapping[discord_thread_id] = slack_thread_ts
def post_to_slack_forum_version(message, channel, text, author, thread_ts=None):
if message.attachments:
for attachment in message.attachments:
attachment_url = attachment.url
text += f"\nAttachment: {attachment_url}"
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):
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 collect_pings():
await bot.wait_until_ready()
while not bot.is_closed():
await aiojobs.create_scheduler().spawn(send_daily_pings())
await asyncio.sleep(60)
async def send_daily_pings():
global daily_pings
if daily_pings:
# combine into one message
combined_message = '\n'.join(f"{ping['author']} in #{ping['channel']} said: {ping['content']} (link: {ping['url']})" for ping in daily_pings)
await post_to_slack(None, combined_message, SLACK_CHANNEL_ID_TEST, None, None, None)
daily_pings = [] # reset after posting
# pings -------------------------------------------------------------------------------------------
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
async def run_bot():
async with bot:
bot.loop.create_task(collect_pings())
bot.run(DISCORD_TOKEN)
def start_bot_thread():
asyncio.run(run_bot())
threading.Thread(target=start_bot_thread).start()
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
|