File size: 6,161 Bytes
78dea1a
db21dc3
434f798
db21dc3
78dea1a
b7eca85
 
 
4b7b722
56509cf
d3ba82c
 
 
09d6ac2
 
 
b8997d2
 
d3ba82c
b7eca85
 
b8997d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7eca85
 
78dea1a
 
 
b7eca85
75d2f81
b7eca85
b80bf81
09d6ac2
b80bf81
d3ba82c
78dea1a
 
 
b7eca85
78dea1a
 
 
 
b7eca85
9177836
e57e72d
b91f995
e57e72d
b91f995
 
 
 
 
 
b7eca85
b80bf81
 
 
 
d3ba82c
b80bf81
 
d3ba82c
37b0b26
90c7959
 
b80bf81
 
d3ba82c
b8997d2
b80bf81
952362b
 
5021c90
952362b
d3ba82c
b80bf81
 
0654423
90c7959
37b0b26
 
 
 
 
d589312
3c830fa
b80bf81
 
952362b
b80bf81
3c830fa
b80bf81
3c830fa
b80bf81
 
0654423
952362b
 
 
 
 
 
 
 
 
 
 
 
 
9d2cc98
0654423
9177836
a368445
b7eca85
 
7b3eccf
9e52f3a
b7eca85
 
 
 
0654423
d4ce55b
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
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):
        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 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()