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()