DiscordBot / bot_main.py
MKE0108's picture
Update bot_main.py
fb727e8 verified
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"])