Skip to content

Commit

Permalink
Merge storage-refactor into master
Browse files Browse the repository at this point in the history
  • Loading branch information
pachev committed Jan 21, 2018
2 parents 5d576d7 + 1dc9dd1 commit a6687e2
Show file tree
Hide file tree
Showing 12 changed files with 290 additions and 152 deletions.
138 changes: 77 additions & 61 deletions cogs/add.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
from tabulate import tabulate
from datetime import datetime

from models.character import Character
from models.member import Member
from models.historical import Historical
from models.server import Server
from utils import *

class Add:
Expand All @@ -13,27 +15,51 @@ class Add:
def __init__(self, bot):
self.bot = bot

async def __get_rank_and_discord_id(self, author, user, roles):
async def __get_rank_and_member(self, author, user, roles):
if not user:
discord_id = author.id
discord_user = author
rank = 'Officer' if ADMIN_USER in roles else 'Member'
if Member.objects(discord = author.id).count() >= 1:
await self.bot.say(codify("Cannot add more than one character to this discord id. "
"Try rerolling with gsbot reroll"))
return (None, None)
else:
try:
user_roles = [u.name for u in user.roles]
rank = 'Officer' if ADMIN_USER in user_roles else 'Member'
except Exception as e:
rank = 'Member'
print(e)
discord_id = user.id
discord_user = user
if ADMIN_USER not in roles:
await self.bot.say(codify("Only officers may perform this action"))
return (None, None)

return (rank, discord_id)
return (rank, discord_user)

def __get_server_and_member(self, discord_server, discord_user):
member = Member.objects(discord=discord_user.id).first()
server = Server.objects(id=discord_server.id).first()

if not server:
server = Server.create({
'id': discord_server.id,
'name': discord_server.name,
'avatar': discord_server.avatar
})

if not member:
member = Member.create({
'discord': discord_user.id,
'name': discord_user.name,
'avatar': discord_user.avatar
})

# Checks if member being added is in the server
server_member = Member.objects(servers=discord_server.id, discord=discord_user.id).first()
if not server_member:
server.members.append(member)
server.save()
member.servers.append(discord_server.id)
member.save()

return (server, member)

@commands.command(pass_context=True)
async def add(self,
Expand All @@ -45,107 +71,97 @@ async def add(self,
dp: int,
char_class,
user: discord.User = None):
"""Adds yourself as a member to the database. This member is linked with your
"""Adds your primary character to the guild. This character is linked with your
discord id and can only be updated by either that member or an officer.
**Officers can add a user by tagging them at the end. eg @drawven**
Note: Total gear score and rank is auto calculated."""

# Checks character name to make sure it is correct
try:
# if char_class is shorthand for a class name (EX. DK = DARKKNIGHT) then set it to the real name
char_class = CHARACTER_CLASS_SHORT.get(char_class.upper()) if CHARACTER_CLASS_SHORT.get(char_class.upper()) else char_class

# check for invalid class names
if char_class.upper() not in CHARACTER_CLASSES:
# find possible class names that user was trying to match
possible_classes = list(filter(
lambda class_name: char_class.upper() in class_name,
CHARACTER_CLASSES,
))
if len(possible_classes) > 1:
await self.bot.say(codify("Character class not recognized.\n"
"Did you mean {}?".format(", ".join(
possible_classes[:-1]) + " or " + possible_classes[-1])
))
elif len(possible_classes) == 1:
await self.bot.say(codify("Character class not recognized.\n"
"Did you mean {}?".format(possible_classes[0])
))
else:
await self.bot.say(
codify("Character class not recognized, here is a list "
"of recognized classes\n "
+ "\n ".join(CHARACTER_CLASSES)))
return

if not await check_character_name(self.bot, char_class):
return
author = ctx.message.author
server = ctx.message.server
roles = [u.name for u in author.roles]
rank, discord_user = await self.__get_rank_and_discord_id(author, user, roles)
member = self.__get_server_and_member(server, discord_user)

rank, discord_id = await self.__get_rank_and_discord_id(author, user, roles)

if rank is None or discord_id is None:
if rank is None or discord_user.id is None:
return

member = Member.create({
'fam_name': fam_name,
'char_name': char_name,
character = Character.primary_chars(member=discord_user.id).first()
isPrimary = False if character else True


character = Character.create({
'rank': rank,
'fam_name': fam_name.upper(),
'char_name': char_name.upper(),
'char_class': char_class.upper(),
'server': server.id,
'level': level,
'ap': ap,
'dp': dp,
'char_class': char_class,
'gear_score': ap + dp,
'rank': rank,
'discord': discord_id,
'server': ctx.message.server.id
'primary': isPrimary,
'member': discord_user.id,
})
member.characters.append(character)
member.save()

row = get_row([member], False)
row = get_row([character], False)
data = tabulate(row, HEADERS, 'simple')

await self.bot.say(codify("Success Adding User\n\n" + data))
await self.bot.say(codify("Success Adding Character for member {}\n\n".
format(discord_user.name.upper()) + data))

except Exception as e:
print(e)
await self.bot.say("Something went horribly wrong")

@commands.command(pass_context=True)
async def reroll(self, ctx, new_char_name, level: int, ap : int, dp: int, new_char_class):
"""Just for someone special: Allows you to reroll """
"""Just for someone special: Allows you to reroll your main character """

author = ctx.message.author.id
member = Member.objects(discord = author).first()
character = Character.primary_chars(member = author).first()
date = datetime.now()
if not member:
await self.bot.say("Can't reroll if you're not in the database :(, try adding yoursell first")
if not character:
await self.bot.say("Can't reroll if you're not in the database :(, try adding a character first")
return

if not await check_character_name(self.bot, new_char_class):
return

else:
try:
## Adds historical data to todabase
## Adds historical data to database
update = Historical.create({
'type': "reroll",
'char_class': member.char_class,
'char_class': character.char_class.upper(),
'timestamp': date,
'level': member.level + (round(member.progress, 2) * .01),
'ap': member.ap,
'dp': member.dp,
'gear_score': member.gear_score
'level':float(str(character.level) + '.' + str(round(character.progress))) ,
'ap': character.ap,
'dp': character.dp,
'gear_score': character.gear_score
})

historical_data = member.hist_data
historical_data = character.hist_data
historical_data.append(update)

member.update_attributes({
'char_name': new_char_name,
character.update_attributes({
'char_name': new_char_name.upper(),
'ap': ap,
'dp': dp,
'level': level,
'gear_score': ap + dp,
'char_class': new_char_class,
'char_class': new_char_class.upper(),
'updated': date,
'hist_data': historical_data
})

row = get_row([member], False)
row = get_row([character], False)
data = tabulate(row, HEADERS, 'simple')

await self.bot.say(codify("Success Rerolling\n\n" + data))
Expand Down
8 changes: 4 additions & 4 deletions cogs/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from discord.ext import commands
from tabulate import tabulate

from models.member import Member
from models.character import Character
from utils import *


Expand All @@ -14,15 +14,15 @@ def __init__(self, bot):

@commands.command(pass_context=True)
async def delete(self, ctx, fam_name=''):
"""Deletes character from list. **officers can add an optional family name at the
"""Deletes users's main character from list. **officers can add an optional family name at the
end to delete a certain user"""

try:
author = ctx.message.author
if not fam_name:
member = Member.objects(discord = author.id).first()
member = Character.primary_chars(discord = author.id).first()
else:
member = Member.objects(fam_name = fam_name, server = ctx.message.server.id).first()
member = Character.primary_chars(fam_name = fam_name, server = ctx.message.server.id).first()
roles = [u.name for u in author.roles]
if ADMIN_USER not in roles:
await self.bot.say("Only officers may perform this action")
Expand Down
51 changes: 47 additions & 4 deletions cogs/extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from tabulate import tabulate
from datetime import datetime

from models.member import Member
from models.character import Character
from utils import *


Expand All @@ -21,14 +21,57 @@ async def attach_pic(self, ctx, url):

try:
author = ctx.message.author
member = Member.objects(discord = author.id).first()
member.gear_pic = url
member.save()
character = Character.primary_chars(member = author.id).first()
character.gear_pic = url
character.save()
await self.bot.say(codify("Picture added successfully"))
except Exception as e:
print(e)
await self.bot.say("Picture could not be added")

@commands.command(pass_context=True)
async def my_list(self,ctx):
"""***Experimental***List all the characters that you have added to the database for this server"""
try:
print('server,', ctx.message.server.id)
members = Character.objects(member=ctx.message.author.id, server = ctx.message.server.id)
rows = get_row(members, False)

data = tabulate(rows,
HEADERS,
'simple',)

for page in paginate(data):
await self.bot.say(page)
except Exception as e:
await self.bot.say("Something went horribly wrong")
print(e)

@commands.command(pass_context=True)
async def set_main(self,ctx,num:int=0):
"""***Experimental*** Changes primary character on server"""
if not int(num):
await self.bot.say(codify('Invalid Selection'))
return
try:
print('server,', ctx.message.server.id)
characters = Character.objects(member=ctx.message.author.id, server = ctx.message.server.id)
if num < 1 or num > len(characters):
await self.bot.say(codify('Invalid Selection'))
return

num -= 1
for char in characters:
char.primary = False
char.save()
main = characters[num]
main.primary = True
main.save()
await self.bot.say(codify('Main Character Switched Succesfuly to {}'.format(main.char_name)))
except Exception as e:
await self.bot.say("Something went horribly wrong")
print(e)


def setup(bot):
bot.add_cog(Extras(bot))
6 changes: 3 additions & 3 deletions cogs/general.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from discord.ext import commands
from tabulate import tabulate

from models.member import Member
from models.character import Character
from utils import *


Expand All @@ -20,7 +20,7 @@ async def info(self, ctx):

try:
info = []
members = Member.objects(server=ctx.message.server.id)
members = Character.primary_chars(server=ctx.message.server.id)
if members:
officers = members(rank='Officer')
average = members.average('gear_score')
Expand Down Expand Up @@ -48,7 +48,7 @@ async def info(self, ctx):
async def export(self, ctx):
"""Exports current guild data"""

members = Member.objects(server=ctx.message.server.id)
members = Character.objects(server=ctx.message.server.id)
rows = get_row(members, False)
rows.insert(0, HEADERS)
try:
Expand Down
Loading

0 comments on commit a6687e2

Please sign in to comment.