mirror of
https://github.com/NohamR/TransmissionBot.git
synced 2025-05-24 14:22:00 +00:00
Update bot.py
remove symbol legends from typical output and put in special `legend` command that's also accessible by reacting to other output embeds.
This commit is contained in:
parent
c7321ed1ec
commit
bd0faa4e19
133
bot.py
133
bot.py
@ -1,6 +1,7 @@
|
|||||||
""""
|
""""
|
||||||
Copyright © twilsonco 2020
|
Copyright © twilsonco 2020
|
||||||
Description: This is a discord bot to manage torrent transfers through the Transmission transmissionrpc python library.
|
Description:
|
||||||
|
This is a discord bot to manage torrent transfers through the Transmission transmissionrpc python library.
|
||||||
|
|
||||||
Version: 1.0
|
Version: 1.0
|
||||||
"""
|
"""
|
||||||
@ -30,6 +31,8 @@ WHITELIST = [USER_IDS]
|
|||||||
CHANNEL_IDS=[CHANNEL_IDS]
|
CHANNEL_IDS=[CHANNEL_IDS]
|
||||||
LOGO_URL="https://iyanovich.files.wordpress.com/2009/04/transmission-logo.png"
|
LOGO_URL="https://iyanovich.files.wordpress.com/2009/04/transmission-logo.png"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TSCLIENT_CONFIG={
|
TSCLIENT_CONFIG={
|
||||||
'host': "10.0.1.2",
|
'host': "10.0.1.2",
|
||||||
'port': 9091,
|
'port': 9091,
|
||||||
@ -457,12 +460,11 @@ async def a(context, *, content=""):
|
|||||||
#
|
#
|
||||||
# return embed
|
# return embed
|
||||||
|
|
||||||
torListLegend="• Legend:\n⬇️download rate, ⬆️upload rate, ⚖️seed ratio, 🔻downloading, 🌱seeding, 🏁finished, ⏸paused\n• Error:\n✅none, ⚠️tracker warning, ☄️tracker error, 🔥local error\n• Info:\n🐢stalled, 🐇running, 🔒private, 🔓public "
|
|
||||||
|
|
||||||
def torList(torrents, author_name="Torrent Transfers",title=None,description=None):
|
def torList(torrents, author_name="Torrent Transfers",title=None,description=None):
|
||||||
states = ('downloading', 'seeding', 'stopped', 'finished','all')
|
states = ('downloading', 'seeding', 'stopped', 'finished','all')
|
||||||
stateEmoji = {i:j for i,j in zip(states,['🔻','🌱','⏸','🏁','🔁'])}
|
stateEmoji = {i:j for i,j in zip(states,['🔻','🌱','⏸','🏁','🔁'])}
|
||||||
errorStrs = ['✅','📡⚠️','📡‼️','🖥‼️']
|
errorStrs = ['✅','⚠️','🌐','🖥']
|
||||||
|
|
||||||
def torListLine(t):
|
def torListLine(t):
|
||||||
down = humanbytes(t.progress * 0.01 * t.totalSize)
|
down = humanbytes(t.progress * 0.01 * t.totalSize)
|
||||||
@ -487,7 +489,6 @@ def torList(torrents, author_name="Torrent Transfers",title=None,description=Non
|
|||||||
if len(torrents) > 0:
|
if len(torrents) > 0:
|
||||||
while i < len(torrents):
|
while i < len(torrents):
|
||||||
embed=discord.Embed(title=title,description=description,color=0xb51a00)
|
embed=discord.Embed(title=title,description=description,color=0xb51a00)
|
||||||
embed.set_author(name=author_name, icon_url=LOGO_URL)
|
|
||||||
for j in range(25):
|
for j in range(25):
|
||||||
embed.add_field(name=nameList[i],value=valList[i],inline=False)
|
embed.add_field(name=nameList[i],value=valList[i],inline=False)
|
||||||
i += 1
|
i += 1
|
||||||
@ -497,14 +498,12 @@ def torList(torrents, author_name="Torrent Transfers",title=None,description=Non
|
|||||||
break
|
break
|
||||||
if i >= len(torrents):
|
if i >= len(torrents):
|
||||||
break
|
break
|
||||||
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
|
|
||||||
embeds.append(embed)
|
embeds.append(embed)
|
||||||
|
|
||||||
embeds[-1].set_footer(text=torListLegend)
|
|
||||||
else:
|
else:
|
||||||
embeds.append(discord.Embed(title=title, description="No matching transfers found!", color=0xb51a00))
|
embeds.append(discord.Embed(title=title, description="No matching transfers found!", color=0xb51a00))
|
||||||
embeds[-1].set_author(name=author_name, icon_url=LOGO_URL)
|
|
||||||
embeds[-1].timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
|
embeds[-1].set_author(name=author_name, icon_url=LOGO_URL)
|
||||||
|
embeds[-1].set_footer(text="📜 Symbol legend")
|
||||||
|
|
||||||
return embeds
|
return embeds
|
||||||
|
|
||||||
@ -566,7 +565,20 @@ async def list(context, *, content=""):
|
|||||||
embeds = torList(torrents, title="{} transfer{} matching '`{}`'".format(len(torrents),'' if len(torrents)==1 else 's',content))
|
embeds = torList(torrents, title="{} transfer{} matching '`{}`'".format(len(torrents),'' if len(torrents)==1 else 's',content))
|
||||||
|
|
||||||
for e in embeds:
|
for e in embeds:
|
||||||
await context.message.channel.send(embed=e)
|
msg = await context.message.channel.send(embed=e)
|
||||||
|
|
||||||
|
await msg.add_reaction('📜')
|
||||||
|
|
||||||
|
def check(reaction, user):
|
||||||
|
return user == context.message.author and str(reaction.emoji) == '📜'
|
||||||
|
|
||||||
|
try:
|
||||||
|
reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
if str(reaction.emoji) == '📜':
|
||||||
|
await legend(context)
|
||||||
@client.command(name='l', pass_context=True)
|
@client.command(name='l', pass_context=True)
|
||||||
async def l(context, *, content=""):
|
async def l(context, *, content=""):
|
||||||
await list(context, content=content)
|
await list(context, content=content)
|
||||||
@ -605,8 +617,7 @@ def torSummary(torrents):
|
|||||||
embed.add_field(name="⬇️ {}/s".format(totDownRate), value="⬆️ {}/s".format(totUpRate), inline=False)
|
embed.add_field(name="⬇️ {}/s".format(totDownRate), value="⬆️ {}/s".format(totUpRate), inline=False)
|
||||||
embed.add_field(name="⏬ {} of {}".format(totDown,totSize), value="⏫ {} ⚖️ {}".format(totUp,totRatio), inline=False)
|
embed.add_field(name="⏬ {} of {}".format(totDown,totSize), value="⏫ {} ⚖️ {}".format(totUp,totRatio), inline=False)
|
||||||
embed.add_field(name="🔁 {} transfer{} total".format(numTot,"" if numTot == 0 else "s"), value="🔻 {} 🌱 {} 🏁 {} ⏸ {}".format(numInState[0],numInState[1],numInState[3],numInState[2]), inline=False)
|
embed.add_field(name="🔁 {} transfer{} total".format(numTot,"" if numTot == 0 else "s"), value="🔻 {} 🌱 {} 🏁 {} ⏸ {}".format(numInState[0],numInState[1],numInState[3],numInState[2]), inline=False)
|
||||||
embed.set_footer(text=topRatios+'\n• Legend:\n⬇️total download rate, ⬆️total upload rate, ⏬total downloaded, ⏫total uploaded, 🔻downloading, 🌱seeding, 🏁finished, ⏸paused, ⚖️total seed ratio')
|
embed.set_footer(text=topRatios+"\n📜 Symbol legend")
|
||||||
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
|
|
||||||
# await context.message.channel.send(embed=embed)
|
# await context.message.channel.send(embed=embed)
|
||||||
return embed,numInState
|
return embed,numInState
|
||||||
|
|
||||||
@ -614,14 +625,15 @@ def torSummary(torrents):
|
|||||||
async def summary(context, *, content=""):
|
async def summary(context, *, content=""):
|
||||||
if await CommandPrecheck(context):
|
if await CommandPrecheck(context):
|
||||||
states = ('downloading', 'seeding', 'paused', 'finished','all')
|
states = ('downloading', 'seeding', 'paused', 'finished','all')
|
||||||
stateEmoji = ['🔻','🌱','⏸','🏁','🔃']
|
stateEmoji = ['🔻','🌱','⏸','🏁','🔃','📜']
|
||||||
|
|
||||||
summary=torSummary(TSCLIENT.get_torrents())
|
summary=torSummary(TSCLIENT.get_torrents())
|
||||||
msg = await context.message.channel.send(embed=summary[0])
|
msg = await context.message.channel.send(embed=summary[0])
|
||||||
for i in range(len(summary[1])):
|
for i in range(len(summary[1])):
|
||||||
if summary[1][i] > 0:
|
if summary[1][i] > 0:
|
||||||
await msg.add_reaction(stateEmoji[i])
|
await msg.add_reaction(stateEmoji[i])
|
||||||
await msg.add_reaction(stateEmoji[-1])
|
for i in stateEmoji[-2:]:
|
||||||
|
await msg.add_reaction(i)
|
||||||
|
|
||||||
def check(reaction, user):
|
def check(reaction, user):
|
||||||
return user == context.message.author and str(reaction.emoji) in stateEmoji
|
return user == context.message.author and str(reaction.emoji) in stateEmoji
|
||||||
@ -631,8 +643,11 @@ async def summary(context, *, content=""):
|
|||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
cmds = {i:j for i,j in zip(stateEmoji,('--filter downloading', '--filter seeding', '--filter stopped', '--filter finished', ''))}
|
if str(reaction.emoji) in stateEmoji[:-1]:
|
||||||
await list(context, content=cmds[str(reaction.emoji)])
|
cmds = {i:j for i,j in zip(stateEmoji,('--filter downloading', '--filter seeding', '--filter stopped', '--filter finished', ''))}
|
||||||
|
await list(context, content=cmds[str(reaction.emoji)])
|
||||||
|
elif str(reaction.emoji) == stateEmoji[-1]:
|
||||||
|
await legend(context)
|
||||||
@client.command(name='s', pass_context=True)
|
@client.command(name='s', pass_context=True)
|
||||||
async def s(context, *, content=""):
|
async def s(context, *, content=""):
|
||||||
await summary(context, content=content)
|
await summary(context, content=content)
|
||||||
@ -681,8 +696,7 @@ async def modify(context, *, content=""):
|
|||||||
opEmoji = ['⏸','▶️','❌','🗑']
|
opEmoji = ['⏸','▶️','❌','🗑']
|
||||||
opStr = "⏸pause ▶️resume ❌remove 🗑remove and delete"
|
opStr = "⏸pause ▶️resume ❌remove 🗑remove and delete"
|
||||||
embeds = torList(torrents,author_name="Click a reaction to choose modification".format(len(torrents), '' if len(torrents)==1 else 's'),title="{} transfer{} matching '`{}`' will be modified".format(len(torrents), '' if len(torrents)==1 else 's', content))
|
embeds = torList(torrents,author_name="Click a reaction to choose modification".format(len(torrents), '' if len(torrents)==1 else 's'),title="{} transfer{} matching '`{}`' will be modified".format(len(torrents), '' if len(torrents)==1 else 's', content))
|
||||||
embeds[-1].set_footer(text=torListLegend+"\n• Options:\n"+opStr)
|
# embeds[-1].set_footer(text=opStr)
|
||||||
embeds[-1].timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
|
|
||||||
else:
|
else:
|
||||||
embed=discord.Embed(title="Modify transfers",color=0xb51a00)
|
embed=discord.Embed(title="Modify transfers",color=0xb51a00)
|
||||||
embed.set_author(name="No matching transfers found!", icon_url=LOGO_URL)
|
embed.set_author(name="No matching transfers found!", icon_url=LOGO_URL)
|
||||||
@ -695,13 +709,14 @@ async def modify(context, *, content=""):
|
|||||||
embed=discord.Embed(title="React to choose modification",color=0xb51a00)
|
embed=discord.Embed(title="React to choose modification",color=0xb51a00)
|
||||||
embed.set_author(name="All transfers will be affected!", icon_url=LOGO_URL)
|
embed.set_author(name="All transfers will be affected!", icon_url=LOGO_URL)
|
||||||
embed.set_footer(text=opStr)
|
embed.set_footer(text=opStr)
|
||||||
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
|
|
||||||
embeds = [embed]
|
embeds = [embed]
|
||||||
msgs = [await context.message.channel.send(embed=e) for e in embeds]
|
msgs = [await context.message.channel.send(embed=e) for e in embeds]
|
||||||
|
|
||||||
if not allOnly and len(torrents) == 0:
|
if not allOnly and len(torrents) == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
opEmoji.append('📜')
|
||||||
|
|
||||||
for i in opEmoji:
|
for i in opEmoji:
|
||||||
await msgs[-1].add_reaction(i)
|
await msgs[-1].add_reaction(i)
|
||||||
|
|
||||||
@ -713,46 +728,61 @@ async def modify(context, *, content=""):
|
|||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
cmds = {i:j for i,j in zip(opEmoji,ops)}
|
if str(reaction.emoji) == opEmoji[-1]:
|
||||||
cmd = cmds[str(reaction.emoji)]
|
await legend(context)
|
||||||
|
elif str(reaction.emoji) in opEmoji[:-1]:
|
||||||
|
cmds = {i:j for i,j in zip(opEmoji,ops)}
|
||||||
|
cmd = cmds[str(reaction.emoji)]
|
||||||
|
|
||||||
doContinue = True
|
doContinue = True
|
||||||
if "remove" in cmds[str(reaction.emoji)]:
|
if "remove" in cmds[str(reaction.emoji)]:
|
||||||
embed=discord.Embed(title="Are you sure you wish to remove{} {} transfer{}?".format(' and DELETE' if 'delete' in cmds[str(reaction.emoji)] else '', len(torrents), '' if len(torrents)==1 else 's'),description="**This action is irreversible!**",color=0xb51a00)
|
embed=discord.Embed(title="Are you sure you wish to remove{} {} transfer{}?".format(' and DELETE' if 'delete' in cmds[str(reaction.emoji)] else '', len(torrents), '' if len(torrents)==1 else 's'),description="**This action is irreversible!**",color=0xb51a00)
|
||||||
embed.set_footer(text="react ✅ to continue or ❌ to cancel")
|
embed.set_footer(text="react ✅ to continue or ❌ to cancel")
|
||||||
msg = await context.message.channel.send(embed=embed)
|
msg = await context.message.channel.send(embed=embed)
|
||||||
|
|
||||||
for i in ['✅','❌']:
|
for i in ['✅','❌']:
|
||||||
await msg.add_reaction(i)
|
await msg.add_reaction(i)
|
||||||
|
|
||||||
def check1(reaction, user):
|
def check1(reaction, user):
|
||||||
return user == context.message.author and str(reaction.emoji) in ['✅','❌']
|
return user == context.message.author and str(reaction.emoji) in ['✅','❌']
|
||||||
try:
|
try:
|
||||||
reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check1)
|
reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check1)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
doContinue = False
|
doContinue = False
|
||||||
|
else:
|
||||||
|
doContinue = str(reaction.emoji) == '✅'
|
||||||
|
if doContinue:
|
||||||
|
if "pause" in cmd:
|
||||||
|
stop_torrents(torrents)
|
||||||
|
elif "resume" in cmd:
|
||||||
|
resume_torrents(torrents)
|
||||||
|
else:
|
||||||
|
remove_torrents(torrents,delete_files="delete" in cmd)
|
||||||
|
|
||||||
|
ops = ["pause","resume","remove","removedelete","pauseall","resumeall"]
|
||||||
|
opNames = ["paused","resumed","removed","removed and deleted","paused","resumed"]
|
||||||
|
opEmoji = ["⏸","▶️","❌","🗑","⏸","▶️"]
|
||||||
|
ops = {i:j for i,j in zip(ops,opNames)}
|
||||||
|
opEmoji = {i:j for i,j in zip(ops,opEmoji)}
|
||||||
|
await context.message.channel.send("{} Transfer{} {}".format(str(reaction.emoji),'s' if allOnly or len(torrents) > 1 else '', ops[cmd]))
|
||||||
else:
|
else:
|
||||||
doContinue = str(reaction.emoji) == '✅'
|
await context.message.channel.send("❌ Cancelled!")
|
||||||
if doContinue:
|
|
||||||
if "pause" in cmd:
|
|
||||||
stop_torrents(torrents)
|
|
||||||
elif "resume" in cmd:
|
|
||||||
resume_torrents(torrents)
|
|
||||||
else:
|
|
||||||
remove_torrents(torrents,delete_files="delete" in cmd)
|
|
||||||
|
|
||||||
ops = ["pause","resume","remove","removedelete","pauseall","resumeall"]
|
|
||||||
opNames = ["paused","resumed","removed","removed and deleted","paused","resumed"]
|
|
||||||
opEmoji = ["⏸","▶️","❌","🗑","⏸","▶️"]
|
|
||||||
ops = {i:j for i,j in zip(ops,opNames)}
|
|
||||||
opEmoji = {i:j for i,j in zip(ops,opEmoji)}
|
|
||||||
await context.message.channel.send("{} Transfer{} {}".format(str(reaction.emoji),'s' if allOnly or len(torrents) > 1 else '', ops[cmd]))
|
|
||||||
else:
|
|
||||||
await context.message.channel.send("❌ Cancelled!")
|
|
||||||
@client.command(name='m', pass_context=True)
|
@client.command(name='m', pass_context=True)
|
||||||
async def m(context, *, content=""):
|
async def m(context, *, content=""):
|
||||||
await modify(context, content=content)
|
await modify(context, content=content)
|
||||||
|
|
||||||
|
@client.command(name='legend', pass_context=True)
|
||||||
|
async def legend(context):
|
||||||
|
embed = discord.Embed(title='Symbol legend', color=0xb51a00)
|
||||||
|
embed.add_field(name="Status", value="🔻—downloading\n🌱—seeding\n🏁—finished\n⏸—paused\n🔁—any", inline=True)
|
||||||
|
embed.add_field(name="Error", value="✅—none\n⚠️—tracker warning\n🌐—tracker error\n🖥—local error", inline=True)
|
||||||
|
embed.add_field(name="Metrics", value="⬇️—(total) download rate\n⬆️—(total) upload rate\n⏬—total downloaded\n⏫—total uploaded\n⚖️—seed ratio", inline=True)
|
||||||
|
embed.add_field(name="Timeout", value="🐢—stalled\n🐇—running", inline=True)
|
||||||
|
embed.add_field(name="Tracker", value="🔒—private\n🔓—public", inline=True)
|
||||||
|
embed.add_field(name="Modifications", value="⏸—pause\n▶️—resume\n❌—remove\n🗑—remove and delete", inline=True)
|
||||||
|
await context.message.channel.send(embed=embed)
|
||||||
|
return
|
||||||
|
|
||||||
client.remove_command('help')
|
client.remove_command('help')
|
||||||
|
|
||||||
@client.command(name='help', description='Help HUD.', brief='HELPOOOO!!!', pass_context=True)
|
@client.command(name='help', description='Help HUD.', brief='HELPOOOO!!!', pass_context=True)
|
||||||
@ -790,6 +820,7 @@ async def help(context, *, content=""):
|
|||||||
embed.add_field(name="List torrent transfers", value="*list current transfers with sorting, filtering, and search options*\n*ex.* `{0}list [OPTIONS]` or `{0}l [OPTIONS]`".format(BOT_PREFIX), inline=False)
|
embed.add_field(name="List torrent transfers", value="*list current transfers with sorting, filtering, and search options*\n*ex.* `{0}list [OPTIONS]` or `{0}l [OPTIONS]`".format(BOT_PREFIX), inline=False)
|
||||||
embed.add_field(name="Add new torrent transfers", value="*add one or more specified torrents by magnet link or url to torrent file*\n*ex.* `{0}add TORRENT ...` or `{0}a TORRENT ...`".format(BOT_PREFIX), inline=False)
|
embed.add_field(name="Add new torrent transfers", value="*add one or more specified torrents by magnet link or url to torrent file*\n*ex.* `{0}add TORRENT ...` or `{0}a TORRENT ...`".format(BOT_PREFIX), inline=False)
|
||||||
embed.add_field(name="Modify existing transfers", value="*pause, resume, remove, or remove and delete specified transfers*\n*ex.* `{0}modify [TORRENT]` or `{0}m [TORRENT]`".format(BOT_PREFIX), inline=False)
|
embed.add_field(name="Modify existing transfers", value="*pause, resume, remove, or remove and delete specified transfers*\n*ex.* `{0}modify [TORRENT]` or `{0}m [TORRENT]`".format(BOT_PREFIX), inline=False)
|
||||||
|
embed.add_field(name='Show legend', value='*prints legend showing the meaning of symbols used in the output of other commands*\n*ex.* `{0}legend`'.format(BOT_PREFIX), inline=False)
|
||||||
embed.add_field(name='Help - Gives this menu', value='*with optional details of specified command*\n*ex.* `{0}help` or `{0}help COMMAND`'.format(BOT_PREFIX), inline=False)
|
embed.add_field(name='Help - Gives this menu', value='*with optional details of specified command*\n*ex.* `{0}help` or `{0}help COMMAND`'.format(BOT_PREFIX), inline=False)
|
||||||
|
|
||||||
await context.message.channel.send(embed=embed)
|
await context.message.channel.send(embed=embed)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user