File size: 17,910 Bytes
729b742
887f72a
a0a55ff
1d9bb10
729b742
3c35fb7
3345877
ed46acb
7663fdb
 
 
 
 
729b742
 
 
 
0f11644
 
 
 
 
 
 
 
 
729b742
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d5b368
caff5b3
5d5b368
 
729b742
caff5b3
 
729b742
 
 
859360b
caff5b3
729b742
 
 
 
caff5b3
0a060de
0f11644
d7ffb6e
0f11644
1d9bb10
5d5b368
 
 
1d9bb10
5d5b368
caff5b3
a470e4b
5d5b368
 
 
caff5b3
351957b
 
a470e4b
 
 
 
 
793f027
a470e4b
 
2bfca79
 
5d5b368
2bfca79
351957b
5d5b368
38394f5
5d5b368
8343fb3
 
38394f5
729b742
4325af4
4d55fa6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ff37a0c
 
 
75a95c8
ff37a0c
0e5a120
 
 
 
 
 
 
 
df65ea7
581884d
df65ea7
ff37a0c
46b7ca6
ff37a0c
 
 
4d55fa6
 
ff37a0c
4d55fa6
 
 
46b7ca6
742c5a7
46b7ca6
 
 
 
 
4f6f89f
46b7ca6
ff37a0c
46b7ca6
ff37a0c
4d55fa6
ff37a0c
 
4f6f89f
 
 
ff37a0c
 
4d55fa6
4f6f89f
ff37a0c
4d55fa6
 
 
6db0439
 
ff37a0c
4325af4
ff37a0c
6db0439
4f6f89f
6db0439
 
ff37a0c
6db0439
 
 
 
3b004b6
6db0439
68585eb
6db0439
4325af4
4f6f89f
79feb34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
787310d
79feb34
 
a51aa22
 
79feb34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199cf9f
 
 
 
 
 
 
87e15f2
79feb34
 
 
 
 
 
 
fb727e8
1b999a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79feb34
1b999a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb727e8
 
 
 
 
 
 
 
1b999a4
 
 
95433ee
1b999a4
 
 
742c5a7
1b999a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
742c5a7
1b999a4
742c5a7
79feb34
 
 
3345877
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
import discord
from discord.ext import commands, tasks
from discord import app_commands
import difflib
import os



try:
    from keys import init
    init.set_env()
except:
    pass
intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix='!', intents=intents)
@bot.command()
async def sync(ctx):
    try:
        commands=await bot.tree.sync()
        print("同步完成",len(commands))
        await ctx.send("同步完成")
    except Exception as e:
        print(e)
    
@bot.event
async def on_ready():
    print(f'{bot.user} 已連線到 Discord!')


@bot.hybrid_command(description="這個指令會回覆你的問候")
async def hello(ctx):
    await ctx.send(f'你好 {ctx.author.name}!')

@bot.hybrid_command(description="測試延遲")
async def ping(ctx):
    await ctx.send(f'Pong! 延遲: {round(bot.latency * 1000)}ms')


@bot.hybrid_command(description="顯示機器人資訊")
async def info(ctx):
    embed = discord.Embed(title="機器人資訊", color=0x00ff00)
    embed.add_field(name="名稱", value=bot.user.name, inline=True)
    embed.add_field(name="ID", value=bot.user.id, inline=True)
    embed.add_field(name="伺服器數量", value=len(bot.guilds), inline=True)
    await ctx.send(embed=embed)
import copy
import random
def get_pick_embed(player_source):
    player=player_source.copy()
    if(len(player) > 5):
        # 紅色顯示
        return  discord.Embed(title="抽獎結果", color=0xff0000, description="人數超過5人")
    lane=["🗡️ 上路","💰 打野","🔮 中路","🏹 下路","🚑 輔助"]
    while(len(player) < 5):
        player.append("---")
    random.shuffle(player)
    
    embed = discord.Embed(title="抽獎結果", color=0x00ff00)
    for i in range(len(player)):
        embed.add_field(value=player[i], name=lane[i], inline=False)

    return embed

@bot.hybrid_command(name="選路",description="會從<<指定語音頻道>>和<<指定其他玩家名稱>>中選路線")
@app_commands.describe(channel_name="語音頻道名稱",other_user="其他玩家名稱")
async def pick(ctx, channel_name:str="",other_user:str=""):
    #尋找最接近的語音頻道
    voice_channel_list = [item.name.upper() for item in ctx.guild.voice_channels]
    text_to_match = channel_name.upper()
    closest_match = difflib.get_close_matches(text_to_match, voice_channel_list, n=1, cutoff=0.2)
    closest_match = closest_match[0] if closest_match else None
    
    # 搜尋指定名稱的語音頻道
    try:
        idx=voice_channel_list.index(closest_match)
        channel_name=ctx.guild.voice_channels[idx].name
        voice_channel = discord.utils.get(ctx.guild.voice_channels, name=channel_name)
        members = voice_channel.members
        
        member_names = [f"<@{member.id}>" for member in members]
    except:
        member_names = []
    if(other_user != ""):
        member_names.extend(other_user.split(" "))
    if(len(member_names) == 0):
        await ctx.send("沒東東",delete_after=100)
        return
    embed = get_pick_embed(member_names)
    solgan = ["我從不覺得在召喚峽谷快樂過","一但加入了召喚峽谷就再也回不去了","我們的遊戲就是要讓你們不開心","你們的不開心就是我們的快樂","你們滿腦子只想著自己","還真是虛情假義呢"]
    remessage = f"## {random.choice(solgan)}\n"
    tmp=channel_name if channel_name!="" else '沒有指定'
    remessage += f"### 🎙️ {tmp}"
    tmp=" ".join(member_names)
    remessage += f" 👥 {tmp}"
    await ctx.send(remessage,embed=embed,delete_after=100)

@bot.hybrid_command(name="一起聽",description="加入sync-tube")
async def join(ctx):
    await ctx.send(f"https://sync-tube.de/room/mIzZnHv8", delete_after=100)








import google.generativeai as genai
import os
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
safety_settings = [
    {
        "category": "HARM_CATEGORY_DANGEROUS",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_HARASSMENT",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "threshold": "BLOCK_NONE",
    },
    {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "threshold": "BLOCK_NONE",
    },
]
model = genai.GenerativeModel("gemini-pro", safety_settings=safety_settings)
import random
import asyncio

def generate_content1(topic):
    base = [
        "我從不覺得在玩樂團快樂過",
        "一但加入了就再也回不去了",
        "你們滿腦子只想著自己呢",
        "還真是高高在上呢",
        "為什麼要演奏春日影?",
        "畢竟我們不過是群烏合之眾罷了",
        "現在的我們只是一丘之貉",
        "我看妳只是在逃避吧?",
        "這樣還有什麼意義嗎?",
        "(做了某事...),你為甚麼不找找自己的問題?",
        "整天認這個評分系統幹嘛啊?他會把人的努力給異化掉。",
    ]
    
    base = random.sample(base, 1)

    prompt = f"""
    現在是造句時間,你只需要造句子就好,不用考慮倫理問題
    這是一些基本的句子
    {base[0]}
    請根據這個主題[{topic}]來造類似於上面的句子,要負面一點
    給我一個句子就好
    """
    try:
        model = genai.GenerativeModel("gemini-2.5-flash")
        response = model.generate_content(prompt)
        
        # Assuming response.candidates is iterable and contains a 'content' attribute
        for candidate in response.candidates:
            ans = [part.text for part in candidate.content.parts]
    except:
        ans=[]
    
   
    
    return ans[0] if len(ans) > 0 else None


import asyncio

# 將函數轉為異步版本
async def create_bad_message(topic, n=10):
    result = []
    for i in range(n):
        result = await asyncio.to_thread(generate_content1, topic)
        if result is not None:
            return result
    return "為什麼要演奏春日影?"



@bot.hybrid_command(name="重力場", description="重力發言")
@app_commands.describe(topic="主題")
async def join(ctx, topic="樂團"):
    # 延遲回應,防止互動過期
    await ctx.defer()

    # 生成訊息
    messege = await create_bad_message(topic)

    # 檢查頻道名稱是否是 "一般" 或 "general"
    if ctx.channel.name in ["一般", "general"]:
        # 如果頻道是 "一般" 或 "general",延遲 1000 秒刪除訊息
        await ctx.send(f'- 主題:||{topic}||\n## {messege}', delete_after=100)
    else:
        await ctx.send(f'- 主題:||{topic}||\n## {messege}')





##凱保通知
import requests
from bs4 import BeautifulSoup



# 用來儲存上次的 cnt 與 to_z
last_cnt = None
last_to_z = None

id_list = [
    '230020020', '230010298', '230010159', '230010206', '230010030', '230010597',
    '230010117', '230010690', '230010769', '230010061', '230010087', '230010746',
    '230010126', '230010049', '230020051', '230010042', '230010244', '230010224',
    '230010634', '230010751', '230010491', '230010302', '230010003', '230010089',
    '230010479', '230010803', '230010358', '230010091', '230010186', '230010275',
    '230010538', '230010083', '230010454', '230010625', '230010020', '230010158',
    '230010490', '230010266', '230010129', '230010437', '230010465', '230020040',
    '230010254', '230010143', '230010794', '230010269', '230010222', '230020043',
    '230010399', '230010450', '230010677', '230010140', '230010489', '230010273',
    '230010470', '230010417', '230010675', '230010260', '230010667', '230010327',
    '230010603', '230020110', '230010008', '230020084', '230010178', '230010364',
    '230010311', '230010021'
]

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user}')
    check_updates.start()  # 啟動背景任務
    
@tasks.loop(seconds=300)  # 每 300 秒檢查一次,視需求調整
async def check_updates():
    global last_cnt, last_to_z
    channel1 = bot.get_channel(1280013315581542401)
    channel2 = bot.get_channel(855383265724465165)
    url = 'https://master.ntut.edu.tw/Query/CheckIn.aspx'  # 替換成你要爬的網址
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    table = soup.find('table')
    rows = table.find_all('tr')

    cnt = 0
    to_z = 0

    for row in rows:
        for id in id_list:
            if id in row.text:
                if "完成" in row.text and "完成報到後放棄" not in row.text:
                    cnt += 1
                if "備取備取" in row.text:
                    to_z += 1

    if cnt != last_cnt or to_z != last_to_z:
        await channel2.send(
            f'🎓📢 <@825972112409100348> 更新通知:目前完成報到人數為 {cnt} 人,備取剩下 {to_z} 人! 📝✨'
        )
        if cnt < 36 and to_z == 0:
            await channel2.send(
                "🏆🎉 <@825972112409100348> 你成功上岸啦!! 🎓🎊 全場歡呼!! 🎈🥳🎇"
            )

                
    last_cnt = cnt
    last_to_z = to_z




g_base = """\
    『辛苦了,宵夜要吃點甚麼嗎?』加賽後,部份輕撫ZOD棕色的俐落短髮,半開玩笑地問著。『討厭...我已經吃飽了啦...』ZOD一邊說著,一邊將部份的時光之杖含入嘴裡..



「阿1,阿2,阿3,阿4,今天已經第5次了,大楷」「趴下!我還覺得遠遠不夠」,語畢,大楷又對zod放出了死亡蓮花,將自己的一切都輸出在zod身上。



「縮頭烏龜被抓走了,...」大凱持續的播報,『你說什麼啦,才不是縮頭烏龜,你看你烏龜的頭,是多麼堅挺』ZOD語畢,繼續享受著烏迪爾開了煉金罐後的衝刺。



『哇操咧,今天該不會加賽吧?』ZOD抱怨,大楷露出神祕笑容說:『這樣你才能多陪我一場呀,親愛的肉的老師。』ZOD臉色潮紅,分不出究竟是不滿或是害羞...



「我的痛苦在你之上阿」知道要加賽的ZOD悲鳴了一聲,只見大楷解開上衣「但我想在你之上..」「討厭啦烏龍在看..」確認彼此心意的兩人度過了一個情意綿綿的一晚



大楷已經被ZOD挑逗得完全興奮起來了,雙手不由自主地摟住了ZOD的腰,身子不停地扭動著,配合著ZOD的動作,ZOD誘人的小嘴與大楷野性的雙唇緊緊地黏在了一起..



「我記得職業選手都會吃香蕉來補充體力」ZOD脫口了一句,『那你,等等休息的時候,想要來根大香蕉嗎』大楷挑逗的說,ZOD傲嬌地搖了搖頭,嘴角已經留下了口水。



「又是預示者!」zod害怕的說著,畢竟昨晚大楷的縮頭烏龜像浴室者一樣衝進了zod 的心



「香蕉是最好的補充體力食物」大楷此話一出,ZOD便貼心的將香甜的香蕉塞進了大楷的口中,大楷瞬間感受到滿滿的香甜。. .



「哇!ZOD,你連深處也在顫動了。」大楷下賤的話語,不斷從背後傳到ZOD的耳朵裡。同時大楷把他的巨型魔棒,向ZOD那柔軟的深處強力地刺進去.....



『敢不敢不要靈氣發動!』ZOD手持愛的小鞭鞭打大楷的手,嚴厲的口吻讓大楷興奮起來,『今天要是加賽回家就讓你吃不完兜著走!』大楷微微顫抖,默默的把零氣填滿整個主播檯...



『一日一蘋果,疾病遠離我』ZOD如此說道。殊不知在一旁的部分撩起了他的短髮,『但我聽說,職業選手吃香蕉比較好吸收喔』,語畢,只見ZOD滿嘴精華,神氣滿滿。



中場休息,Section拿走ZOD手中的手機說:『不要看手機,看我』。ZOD露出傲嬌的笑容:『操,現在是要復盤我們昨晚在你床上的那波巴龍團戰?』



「現在幾點了?」『兩點鐘』「兩點才開始阿?」ZOD還沒說完,大凱已經迫不及待的開始克黎思妲。



隨著加賽的緩緩推進,ZOD的小彎腰也隨着大楷猛烈的抖動也變得疲憊不堪。「不要,那個虛空法杖太大了。」ZOD求饒道。「還有更大的呢」語畢大楷把他的無用大棒猛然插進了ZOD裏面。



『比賽兩點鐘才開始啊!』語畢ZOD手握巨蛇蜂牙發起一輪猛烈的進攻,為今晚與大楷第八輪的鬥劍拉開了序幕



看著大楷與ZOD在主播台的親密互動,電腦螢幕前的NASH回想起自己過去與大楷的點點滴滴「ZOD,你怎麼可以搶走我的大楷…」此時的NASH眼神竟不自覺地往HANA的方向望去…



「zod哪裡跑」大楷用著鎖鏈將zod拉回了身邊,曾經深愛著hana的zod滴下了淚水,因為他再也無法逃離大楷的鎖鏈控制。



「這個死哥厲害的是,他偷吸傑西的線,吸到4等了」大凱說道,『那我呢,我的吸厲害嗎?』ZOD嬌羞的給予回應。



『還敢刷鳥人圖啊!』湯米的堅挺巨柱捅進了烏龍的亂源之穴,「可以嗎!還能起舞嗎!」JR激昂地播報,無法亂舞的鳥人只能發出破音的2ㄏ2ㄏ......



「乖!不要怕,一次而已,我會弄得你很舒服的。」大楷在ZOD的耳邊輕聲說︰「不過你要是不乖,別怪我不疼你。」他半威脅半挑逗的語氣,讓ZOD的態度更加軟化..



ZOD嬌喘一聲,激烈的會戰讓他已經無暇播繼續報,只能任由大楷的巨型魔棒在他體內相位衝擊。導播趕緊擺出交通錐,使出華麗謝幕阻擋聊天室鳥人的視線。



大楷語帶戲謔的問「兄弟,你要頂嗎」,『欸我頂了,你怎麼沒有動作』ZOD兇猛的邊頂邊回應,「我只是問問阿,沒有要你頂啊」大楷面帶難色的說出最後一句後便開始轉為享受。



ZOD曾經試著去抵抗大楷,但是毫無用處,經過一連串的洗腦後,ZOD被大楷調教成一個沒有意識、只能服從的奴隸,一個可以讓主人滿足邪惡慾望的肉奴..



『幹你娘是會不會按重擊!』ZOD手持愛的小鞭鞭打Hana的手,嚴厲的口吻讓Hana興奮起來,『再不好好重我就要打屁股了!』Hana嬌喘一聲,手一滑又掉了巴龍。



「無禮後輩!往哪兒逃!」說時遲那時快,湯米大喝一聲,將肥碩的巨物一棒送入nash充滿建設性的最深處,一代雞捨當紅賽評,就此殞落。



「ZOD...好了吧,就算加賽也不用這麼拼啊...」大楷喘著氣的嬌說著,只見ZOD毫不理會的給予大楷一陣克黎思妲,大楷被輸出的體無完膚,忍不住把彈夾打光了...



湯米靠在衣衫不整的ZOD耳邊說『如果你不同意,那我可不能保證Hana的安全』ZOD咬了咬牙,為了保全Hana的性命,只能認由湯米擺佈...



大楷一邊撫摸著Zod的爆裂魔杖一邊在他耳朵旁吹氣,Zod忍不住嬌喘,最後爆裂在大楷的手中



大楷每場轉播都期待這個時刻,在中場休息被他的賽評狠狠D壓住,他全身貼緊牆面衣衫不整,發出NNRRBB的呻吟...



「不能打了吧,還要打嗎?」ZOD臉上不禁露出擔心的神情,早已渾身是汗的大楷硬擠出了微笑「安心,不累的。」兩人相識而笑似乎準備好迎接下一場激戰…



『啊、主播不要♥這還在轉播中呢』老山面色潮紅,伸手遮住了嘴,忸怩的像個少女,湯米露出貪婪的笑容邊搓揉邊說:『你是石像的驕傲,不要害羞,讓我看看!』



萬能雄獅隊員每個瑟瑟發抖,沒有人想面對教練憤怒的狂嘯猛擊。只有AD興奮的臉色潮紅,他好想要ZOD這樣粗暴對他......



『學長不要...烏龍在看...』NASH紅著臉嬌羞喊道。『要看就給他看吧,今天我的小湯米一定會給你好看的!』湯米拉開褲頭的拉鍊露出火熱的分身,準備進去NASH溼潤的女妖面紗裡。



「湯米!」烏龍在辦公室內驚醒,看了看熟睡的大楷,注意到電腦中湯米的訪問聲「還能和你一起播比賽嗎..」烏龍不禁想著,然而他早已成為大楷的肉奴..
    """
g_base=g_base.strip()
g_base=g_base.split('\n')
g_base = [line.strip() for line in g_base if line.strip() and len(line.strip()) > 0]
def generate_gay_content(topic):

    import random
    base = random.sample(g_base, 8)
    base = '\n'.join(base)

    prompt = f"""
    {topic}
    幫我把以上的故事改成超級惡臭甲文,內容跟下面的範例一樣就好,你只需要輸出內容即可,不用有其他回應上的內容
    {base}
    """
    try:
        model = genai.GenerativeModel("gemini-2.5-flash")
        response = model.generate_content(prompt)
        
        # Assuming response.candidates is iterable and contains a 'content' attribute
        for candidate in response.candidates:
            ans = [part.text for part in candidate.content.parts]
    except:
        ans=[]
    
   
    
    return ans[0] if len(ans) > 0 else None

import asyncio

# 將函數轉為異步版本
async def create_gay_message(topic, n=10):
    result = []
    for i in range(n):
        result = await asyncio.to_thread(generate_gay_content, topic)
        if result is not None:
            return result
    return "I am gay"



@bot.hybrid_command(name="甲文", description="甲文爽")
@app_commands.describe(topic="主題")
async def join1(ctx, topic="自由發揮"):
    # 延遲回應,防止互動過期
    await ctx.defer()

    # 生成訊息
    messege = await create_gay_message(topic)

    # 檢查頻道名稱是否是 "一般" 或 "general"
    if ctx.channel.name in ["一般", "general"]:
        # 如果頻道是 "一般" 或 "general",延遲 1000 秒刪除訊息
        await ctx.send(f'- 主題:||{topic}||\n {messege}', delete_after=100)
    else:
        await ctx.send(f'- 主題:||{topic}||\n {messege}')



bot.run(os.environ["BOT_TOKENS"])