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:
Tim Wilson 2020-08-18 16:05:32 -06:00 committed by GitHub
parent c7321ed1ec
commit bd0faa4e19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

63
bot.py
View File

@ -1,6 +1,7 @@
""""
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
"""
@ -30,6 +31,8 @@ WHITELIST = [USER_IDS]
CHANNEL_IDS=[CHANNEL_IDS]
LOGO_URL="https://iyanovich.files.wordpress.com/2009/04/transmission-logo.png"
TSCLIENT_CONFIG={
'host': "10.0.1.2",
'port': 9091,
@ -457,12 +460,11 @@ async def a(context, *, content=""):
#
# return embed
torListLegend="• Legend:\ndownload  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):
states = ('downloading', 'seeding', 'stopped', 'finished','all')
stateEmoji = {i:j for i,j in zip(states,['🔻','🌱','','🏁','🔁'])}
errorStrs = ['','📡⚠️','📡‼️','🖥‼️']
errorStrs = ['','⚠️','🌐','🖥']
def torListLine(t):
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:
while i < len(torrents):
embed=discord.Embed(title=title,description=description,color=0xb51a00)
embed.set_author(name=author_name, icon_url=LOGO_URL)
for j in range(25):
embed.add_field(name=nameList[i],value=valList[i],inline=False)
i += 1
@ -497,14 +498,12 @@ def torList(torrents, author_name="Torrent Transfers",title=None,description=Non
break
if i >= len(torrents):
break
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
embeds.append(embed)
embeds[-1].set_footer(text=torListLegend)
else:
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_footer(text="📜 Symbol legend")
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))
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)
async def l(context, *, 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="{} 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.set_footer(text=topRatios+'\n• Legend:\ntotal  download  rate, ⬆total  upload  rate, ⏬total  downloaded, ⏫total  uploaded, 🔻downloading, 🌱seeding, 🏁finished, ⏸paused, ⚖total  seed  ratio')
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
embed.set_footer(text=topRatios+"\n📜 Symbol legend")
# await context.message.channel.send(embed=embed)
return embed,numInState
@ -614,14 +625,15 @@ def torSummary(torrents):
async def summary(context, *, content=""):
if await CommandPrecheck(context):
states = ('downloading', 'seeding', 'paused', 'finished','all')
stateEmoji = ['🔻','🌱','','🏁','🔃']
stateEmoji = ['🔻','🌱','','🏁','🔃','📜']
summary=torSummary(TSCLIENT.get_torrents())
msg = await context.message.channel.send(embed=summary[0])
for i in range(len(summary[1])):
if summary[1][i] > 0:
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):
return user == context.message.author and str(reaction.emoji) in stateEmoji
@ -631,8 +643,11 @@ async def summary(context, *, content=""):
except asyncio.TimeoutError:
pass
else:
if str(reaction.emoji) in stateEmoji[:-1]:
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)
async def s(context, *, content=""):
await summary(context, content=content)
@ -681,8 +696,7 @@ async def modify(context, *, content=""):
opEmoji = ['','▶️','','🗑']
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[-1].set_footer(text=torListLegend+"\n• Options:\n"+opStr)
embeds[-1].timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
# embeds[-1].set_footer(text=opStr)
else:
embed=discord.Embed(title="Modify transfers",color=0xb51a00)
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.set_author(name="All transfers will be affected!", icon_url=LOGO_URL)
embed.set_footer(text=opStr)
embed.timestamp = datetime.datetime.now(tz=pytz.timezone('America/Denver'))
embeds = [embed]
msgs = [await context.message.channel.send(embed=e) for e in embeds]
if not allOnly and len(torrents) == 0:
return
opEmoji.append('📜')
for i in opEmoji:
await msgs[-1].add_reaction(i)
@ -713,6 +728,9 @@ async def modify(context, *, content=""):
except asyncio.TimeoutError:
return
else:
if str(reaction.emoji) == opEmoji[-1]:
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)]
@ -753,6 +771,18 @@ async def modify(context, *, content=""):
async def m(context, *, 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.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="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='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)
await context.message.channel.send(embed=embed)