Added !server, !join and some general improvements

Audio's task now properly checks if the audio module is still loaded
Added !server to cogs.general for server info
Added !join <invite> (owner only) to make Red join other servers
settings.json now gets deleted if login fails
This commit is contained in:
Twentysix 2016-02-13 14:52:26 +01:00
parent a86389c9e8
commit dc0bf207b8
4 changed files with 87 additions and 39 deletions

View File

@ -41,7 +41,6 @@ class Audio:
self.playlist = []
self.current = -1 #current track index in self.playlist
self.downloader = {"DONE" : False, "TITLE" : False, "ID" : False, "URL" : False, "DURATION" : False, "DOWNLOADING" : False}
self.quit_manager = False
self.skip_votes = []
self.sing = ["https://www.youtube.com/watch?v=zGTkAVsrfg8", "https://www.youtube.com/watch?v=cGMWL8cOeAU",
@ -422,7 +421,7 @@ class Audio:
return False
async def queue_manager(self):
while not self.quit_manager:
while "Audio" in self.bot.cogs:
if self.queue and not self.music_player.is_playing():
new_link = self.queue[0]
self.queue.pop(0)
@ -453,10 +452,7 @@ class Audio:
async def incoming_messages(self, msg): # Workaround, need to fix
if msg.author.id != self.bot.user.id:
cmds = ("unload cogs.audio", "reload cogs.audio")
if msg.content in cmds:
self.quit_manager = True
if msg.channel.is_private and msg.attachments != []:
await self.transfer_playlist(msg)
if not msg.channel.is_private:

View File

@ -133,27 +133,47 @@ class General:
await self.bot.say("http://lmgtfy.com/?q=" + text)
@commands.command(no_pm=True, hidden=True)
async def hug(self, member : discord.Member = None):
async def hug(self, user : discord.Member = None):
"""Because everyone likes hugs"""
await self.bot.say("(っ´▽`)っ" + " *" + member.name + "*")
await self.bot.say("(っ´▽`)っ" + " *" + user.name + "*")
@commands.command(pass_context=True, no_pm=True)
async def info(self, ctx, member : discord.Member = None):
"""Shows member's information"""
async def info(self, ctx, user : discord.Member = None):
"""Shows users's informations"""
author = ctx.message.author
if not member:
member = author
if not user:
user = author
roles = []
for m in member.roles:
for m in user.roles:
if m.name != "@everyone":
roles.append('"' + m.name + '"') #.replace("@", "@\u200b")
if not roles: roles = ["None"]
data = "```\n"
data += "Name: " + member.name + "\n"
data += "ID: " + member.id + "\n"
data += "Joined: " + str(member.joined_at) + "\n"
data += "Name: " + user.name + "\n"
data += "ID: " + user.id + "\n"
data += "Joined: " + str(user.joined_at) + "\n"
data += "Roles: " + " ".join(roles) + "\n"
data += "Avatar: " + member.avatar_url + "\n"
data += "Avatar: " + user.avatar_url + "\n"
data += "```"
await self.bot.say(data)
@commands.command(pass_context=True, no_pm=True)
async def server(self, ctx):
"""Shows server's informations"""
server = ctx.message.server
online = str(len([m.status for m in server.members if str(m.status) == "online" or str(m.status) == "idle"]))
total = str(len(server.members))
data = "```\n"
data += "Name: " + server.name + "\n"
data += "ID: " + server.id + "\n"
data += "Region: " + server.region.name + "\n"
data += "Users: " + online + "/" + total + "\n"
data += "Channels: " + str(len(server.channels)) + "\n"
data += "Roles: " + str(len(server.roles)) + "\n"
data += "Created: " + str(server.owner.joined_at) + "\n"
data += "Owner: " + server.owner.name + "\n"
data += "Icon: " + str(server.icon_url) + "\n"
data += "```"
await self.bot.say(data)

View File

@ -2,7 +2,6 @@ import discord
from discord.ext import commands
from .utils import checks
from .utils.dataIO import fileIO
import __main__
import os
class Mod:

75
red.py
View File

@ -9,6 +9,7 @@ import copy
import glob
import os
import time
import sys
#
# Red, a Discord bot by Twentysix, based on discord.py and its command extension
@ -175,6 +176,18 @@ async def shutdown():
"""Shuts down Red"""
exit(1)
@bot.command()
@checks.is_owner()
async def join(invite_url : discord.Invite):
"""Joins new server"""
try:
await bot.accept_invite(invite_url)
await bot.say("Server joined.")
except discord.NotFound:
await bot.say("The invite was invalid or expired.")
except discord.HTTPException:
await bot.say("I wasn't able to accept the invite. Try again.")
@bot.command()
@checks.is_owner()
async def setprefix(*text):
@ -244,9 +257,6 @@ def check_configs():
settings_path = "data/red/settings.json"
settings = {"EMAIL" : "EmailHere", "PASSWORD" : "PasswordHere", "OWNER" : "id_here", "PREFIXES" : [], "ADMIN_ROLE" : "Transistor", "MOD_ROLE" : "Process"}
if not os.path.isfile(settings_path):
print("Creating new settings.json...")
with open(settings_path, "w") as f:
f.write(json.dumps(settings))
print("Red - First run configuration")
print("If you don't have one, create a NEW ACCOUNT for Red. Do *not* use yours. (https://discordapp.com)")
@ -262,7 +272,7 @@ def check_configs():
print("\nChoose a prefix (or multiple ones, one at once) for the commands. Type exit when you're done. Example prefix: !")
settings["PREFIXES"] = []
new_prefix = ""
while new_prefix.lower() != "exit":
while new_prefix.lower() != "exit" and settings["PREFIXES"] != []:
new_prefix = input("Prefix> ")
if new_prefix.lower() != "exit" and new_prefix != "":
settings["PREFIXES"].append(new_prefix)
@ -310,6 +320,14 @@ def set_cog(cog, value):
f.write(json.dumps(data))
def load_cogs():
try:
if sys.argv[1] == "--no-prompt":
no_prompt = True
else:
no_prompt = False
except:
no_prompt = False
with open('data/red/cogs.json', "r") as f:
data = json.load(f)
register = tuple(data.keys()) #known cogs
@ -327,17 +345,18 @@ def load_cogs():
print(e)
failed.append(extension)
else:
print("\nNew extension: " + extension)
print("Load it?(y/n)")
if get_answer():
data[extension] = True
try:
bot.load_extension(extension)
except Exception as e:
print(e)
failed.append(extension)
else:
data[extension] = False
if not no_prompt:
print("\nNew extension: " + extension)
print("Load it?(y/n)")
if get_answer():
data[extension] = True
try:
bot.load_extension(extension)
except Exception as e:
print(e)
failed.append(extension)
else:
data[extension] = False
if extensions:
with open('data/red/cogs.json', "w") as f:
@ -349,12 +368,26 @@ def load_cogs():
print(m + " ", end="")
print("\n")
check_folders()
check_configs()
settings = load_settings()
if __name__ == '__main__':
def main():
global settings
check_folders()
check_configs()
settings = load_settings()
checks.owner = settings["OWNER"]
load_cogs()
bot.command_prefix = settings["PREFIXES"]
bot.run(settings['EMAIL'], settings['PASSWORD'])
yield from bot.login(settings["EMAIL"], settings["PASSWORD"])
yield from bot.connect()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
except discord.LoginFailure:
print("Invalid login credentials. Restart Red and configure it properly.")
os.remove('data/red/settings.json') # Hopefully this won't backfire in case of discord servers' problems
except Exception as e:
print(e)
loop.run_until_complete(bot.logout())
finally:
loop.close()