Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- # ------------------------------------------------------------------------------
- #
- # IOU Recruits Manager 1.1.2 (C) 2015-2016 turidrum
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- # MA 02110-1301, USA.
- #
- # ------------------------------------------------------------------------------
- import sys
- import json
- program = {
- "name": "IOU Recruits Manager",
- "version": "1.1.2",
- "url": "https://iourpg.com/forum/showthread.php?tid=1350"
- }
- json_file = "config.json"
- title_template = "title.txt"
- iou_template = "iou.template"
- kong_template = "kong.template"
- # read guild data from configuration file
- json_data = open(json_file)
- config = json.load(json_data)
- json_data.close()
- cliArgs = [
- "-i", "--iou",
- "-k", "--kong",
- "-t", "--title",
- "-r", "--recruiting_string",
- "-v", "--version",
- "-h", "--help"
- ]
- def help():
- """
- Prints a little help
- """
- print("-" * 80)
- print("%s %s" % (program["name"], program["version"]))
- print("-" * 80)
- print("")
- print("Description: Helper tool for managing Idle Online Universe's recruiting threads")
- print("")
- print("Usage: %s [ -i | -k | -t | -r | -v | -h ]" % __file__)
- print("{:<30s} {:<60s}".format("-i --iou", "Output format for IOU forum, default."))
- print("{:<30s} {:<60s}".format("-k --kong", "Output format for Kongragate forum(html)"))
- print("{:<30s} {:<60s}".format("-t --title", "Prints the thread's title."))
- print("{:<30s} {:<60s}".format("-r --recruiting_string", "Prints an oneliner, plain text, recruiting string."))
- print("{:<30s} {:<60s}".format("-v --version", "Prints program version."))
- print("{:<30s} {:<60s}".format("-h --help", "Show this help."))
- print("")
- print("Without arguments generates the full post.")
- print("More info: https://iourpg.com/forum/showthread.php?tid=1350")
- class Building:
- # ##########################################################################
- # NOTE:
- # update this from http://iourpg.wikia.com/wiki/Guild_Buildings
- # ##########################################################################
- buildLevels = { # stones needed for each build level
- 0: 0,
- 1: 5000,
- 2: 10000,
- 3: 20000,
- 4: 40000,
- 5: 80000,
- 6: 160000,
- 7: 290000,
- 8: 450000,
- 9: 650000,
- 10: 900000,
- 11: 1000000,
- 12: 2000000,
- 13: 3000000,
- 14: 4000000,
- 15: 5000000,
- 16: 6000000,
- 17: 7000000,
- 18: 8000000,
- 19: 9000000,
- 20: 10000000,
- 21: 12000000,
- 22: 14000000,
- 23: 16000000,
- 24: 18000000,
- 25: 20000000,
- 26: 30000000,
- 27: 35000000,
- 28: 40000000,
- 29: 45000000,
- 30: 50000000,
- 31: 120000000,
- }
- bars = { # links to images corresponding to percentage
- 0: "https://upload.wikimedia.org/wikipedia/commons/c/cf/Gasr0percent.png",
- 5: "https://upload.wikimedia.org/wikipedia/commons/9/90/Gasr5percent.png",
- 10: "https://upload.wikimedia.org/wikipedia/commons/5/5b/Gasr10percent.png",
- 15: "https://upload.wikimedia.org/wikipedia/commons/c/c8/Gasr15percent.png",
- 20: "https://upload.wikimedia.org/wikipedia/commons/6/62/Gasr20percent.png",
- 25: "https://upload.wikimedia.org/wikipedia/commons/0/08/Gasr25percent.png",
- 30: "https://upload.wikimedia.org/wikipedia/commons/6/61/Gasr30percent.png",
- 35: "https://upload.wikimedia.org/wikipedia/commons/4/47/Gasr35percent.png",
- 40: "https://upload.wikimedia.org/wikipedia/commons/3/3e/Gasr40percent.png",
- 45: "https://upload.wikimedia.org/wikipedia/commons/0/0e/Gasr45percent.png",
- 50: "https://upload.wikimedia.org/wikipedia/commons/a/a8/Gasr50percent.png",
- 55: "https://upload.wikimedia.org/wikipedia/commons/2/27/Gasr55percent.png",
- 60: "https://upload.wikimedia.org/wikipedia/commons/e/e7/Gasr60percent.png",
- 65: "https://upload.wikimedia.org/wikipedia/commons/9/96/Gasr65percent.png",
- 70: "https://upload.wikimedia.org/wikipedia/commons/7/70/Gasr70percent.png",
- 75: "https://upload.wikimedia.org/wikipedia/commons/7/77/Gasr75percent.png",
- 80: "https://upload.wikimedia.org/wikipedia/commons/4/4d/Gasr80percent.png",
- 85: "https://upload.wikimedia.org/wikipedia/commons/9/9a/Gasr85percent.png",
- 90: "https://upload.wikimedia.org/wikipedia/commons/b/bd/Gasr90percent.png",
- 95: "https://upload.wikimedia.org/wikipedia/commons/7/78/Gasr95percent.png",
- 100: "https://upload.wikimedia.org/wikipedia/commons/f/f3/Gasr100percent.png"
- }
- def __init__(self, buildName, buildLevel, stonesNeeded):
- """
- constructor
- """
- self.upgradeStatusPercent = 0 # current percentage of building update
- self.percBarURL = "" # URL of the image that match the building upgrade status
- self.buildName = buildName # name of the building
- self.buildLevel = buildLevel # current build level
- if self.buildName == "Bank":
- # sets the max cumulable stones for the bank as the sum of stones needed until the max know level building
- self.stonesReserve = stonesNeeded
- stonesNeeded = sum([self.buildLevels[x] for x in self.buildLevels]) - self.stonesReserve
- else:
- if self.buildLevel > len(self.buildLevels)-1 or self.buildLevel < 0:
- while self.buildLevel > len(self.buildLevels)-1 or self.buildLevel < 0:
- print("Insert a build level between 0 and %d" % (len(self.buildLevels)-1,))
- self.buildLevel = int(raw_input("%s level: " % self.buildName))
- if stonesNeeded > self.buildLevels[self.buildLevel+1] or stonesNeeded < 0:
- while stonesNeeded > self.buildLevels[self.buildLevel+1] or stonesNeeded < 0:
- print("Insert the stones needed between 0 and %d" % (self.buildLevels[self.buildLevel+1],))
- stonesNeeded = int(raw_input("%s stones needed to next level: " % self.buildName))
- self.setUpgradePercent(stonesNeeded)
- self.setPercentURL()
- def round_to_5(self, n):
- """
- Rounds a number to nearest 5
- @param integer the number to round
- @return integer the rounded number
- """
- return int(round(n*2,-1)/2)
- def setUpgradePercent(self, stonesNeeded):
- """
- Sets the percentage upgraded status of a building
- @param integer the building's current level
- @param integer the stones needed to the next building level
- """
- nextBuildLevel = self.buildLevels[self.buildLevel+1]
- if self.buildName == "Bank":
- # sets the max cumulable stones for the bank as the sum of stones needed until the max know level building
- #self.stonesReserve = stonesNeeded
- nextBuildLevel = sum([self.buildLevels[x] for x in self.buildLevels])
- if nextBuildLevel-stonesNeeded < 0:
- percent = 100
- else:
- percent = (((nextBuildLevel-stonesNeeded)*100)/nextBuildLevel)
- self.upgradeStatusPercent = percent
- def setPercentURL(self):
- """
- Sets the image URL of building's percentage upgraded status
- """
- url = self.bars[self.round_to_5(self.upgradeStatusPercent)]
- self.percBarURL = url
- def getBuildingProperties(self):
- if self.buildName == "Guild Hall":
- return "Max Members: %d" % (self.buildLevel + 10)
- if self.buildName == "Bank":
- return "Reserves: %d" % (self.stonesReserve)
- if self.buildName == "Fortress":
- return "Ascension Points: %d" % (self.buildLevel)
- if self.buildName == "Altar":
- return "Gold: %1.1f%%, Exp: %1.1f%%" % (self.buildLevel * 0.5, self.buildLevel * 0.5)
- if self.buildName == "Stable":
- return "Pet Dmg: %d%%, Pet Train: %d" % (self.buildLevel * 2, self.buildLevel / 5)
- if self.buildName == "Warehouse":
- return "Yelds: %d%%" % (self.buildLevel * 3)
- if self.buildName == "Sacrificial Tower":
- return "SO Experience Boost: %1.1f%%" % (self.buildLevel * 0.5)
- def printBuilding(self):
- """
- Prints a row for the guild's thread that contains building info
- """
- print("{:<40s} {:<40s} {:<110s}".format("[*][font=Courier New]%s" % self.buildName, ("Lv: %d (%s)") % (self.buildLevel, self.getBuildingProperties()),"Upgrade status: [[img=119x8]%s[/img]][/font]" % (self.percBarURL)))
- def buildingFF(self, forum, method="image"):
- """
- Prints a row for the guild's thread that contains building info
- """
- if forum == "kong":
- if method == "text":
- return "{:<35s} {:<35s} {:<100s}".format("<pre>%s" % self.buildName, ("Lv: %d (%s)") % (self.buildLevel, self.getBuildingProperties()),"Upgrade status: %1.0f%%</pre>\n" % (self.upgradeStatusPercent,))
- elif method == "image":
- return "{:<35s} {:<35s} {:<100s}".format("<pre>%s" % self.buildName, ("Lv: %d (%s)") % (self.buildLevel, self.getBuildingProperties()),"Upgrade status: %1.0f%%</pre><img width=\"100%%\" height=\"8px\" src=\"%s\" />\n" % (self.upgradeStatusPercent, self.percBarURL))
- if method == "text":
- return "{:<40s} {:<40s} {:<110s}".format("[*][font=Courier New]%s" % self.buildName, ("Lv: %d (%s)") % (self.buildLevel, self.getBuildingProperties()),"Upgrade status: %1.0f%%[/font]" % (self.upgradeStatusPercent))
- elif method == "image":
- return "{:<40s} {:<40s} {:<110s}".format("[*][font=Courier New]%s" % self.buildName, ("Lv: %d (%s)") % (self.buildLevel, self.getBuildingProperties()),"Upgrade status: [[img=119x8]%s[/img]][/font]" % (self.percBarURL))
- class Guild:
- def __init__(self, guildName, guildInitials, guildRank, entryLevel, buildings):
- """
- constructor
- """
- self.members = []
- self.guildName = guildName
- self.guildInitials = guildInitials
- self.guildRank = guildRank
- self.entryLevel = entryLevel
- self.buildings = buildings
- self.setMaxMembers(buildings[0].buildLevel + 10)
- self.forum = "iou"
- def setMaxMembers(self, maxMembers):
- """
- Sets the max members number for the guild
- """
- self.maxMembers = maxMembers
- def addMember(self, name, status, level, IOUScore):
- """
- Adds a member to the guild
- """
- self.members.append([name, status, level, IOUScore])
- def getAverageLevel(self):
- """
- Calc the average level of guild's members
- @return float the average level of guild's members
- """
- sumlevels = 0.0
- for m in self.members:
- sumlevels += m[2]
- return float(sumlevels/len(self.members))
- def getGuildIOUScore(self):
- """
- Calc the guild's IOU score
- @return integer the guild's IOU score
- """
- sumIOU = 0
- for m in self.members:
- sumIOU += m[3]
- return sumIOU
- def getAverageIOUScore(self):
- """
- Calc the average IOU score of guild's members
- @return float the average IOU score of guild's members
- """
- return float((0.0+self.getGuildIOUScore())/len(self.members))
- def guildIOUScoreFF(self):
- """
- @return string the guild's IOU Score
- """
- if self.forum == "kong":
- return "<strong>%s</strong> IOU: <strong>%d</strong>\n" % (self.guildName, self.getGuildIOUScore())
- return "[b]%s[/b] IOU: [b]%d[/b]\n" % (self.guildName, self.getGuildIOUScore())
- def averageLevelFF(self):
- """
- @return string the average level of guild's members
- """
- if self.forum == "kong":
- return "<strong>%s</strong> average level: <strong>%.2f</strong>\n" % (self.guildName, float(self.getAverageLevel()))
- return "[b]%s[/b] average level: [b]%.2f[/b]\n" % (self.guildName, float(self.getAverageLevel()))
- def averageIOUScoreFF(self):
- """
- @return string the average IOU Score of guild's members
- """
- if self.forum == "kong":
- return "<strong>%s</strong> average IOU: <strong>%.2f</strong>\n" % (self.guildName, float(self.getAverageIOUScore()))
- return "[b]%s[/b] average IOU: [b]%.2f[/b]\n" % (self.guildName, float(self.getAverageIOUScore()))
- def membersListFF(self):
- """
- @return string the members list
- """
- if self.forum == "kong":
- membersCountString = "<span style=\"color: #33ff33\">%d</span>/%d" % (len(self.members), self.maxMembers) if len(self.members) < self.maxMembers else "<span style=\"color: #ff3333\">%d</span>/%d" % (len(self.members), self.maxMembers)
- result = "<strong>%s (%s)</strong>:\n" % (self.guildName, membersCountString)
- result += "<pre>\n"
- for m in self.members:
- result += u'{:<40s} {:<8s} {:<9s} {:<8s}'.format("%s" % m[0], "[%s" % m[1], "| Lv %d" % m[2], "| IOU %d]\n" % m[3])
- result += "</pre>\n\n"
- return result
- membersCountString = "[color=#33ff33]%d[/color]/%d" % (len(self.members), self.maxMembers) if len(self.members) < self.maxMembers else "[color=#ff3333]%d[/color]/%d" % (len(self.members), self.maxMembers)
- result = "[b]%s (%s)[/b]:\n" % (self.guildName, membersCountString)
- result += "[list]\n"
- for m in self.members:
- result += u'{:<40s} {:<8s} {:<9s} {:<8s}'.format("[*][font=Courier New]%s" % m[0], "[%s" % m[1], "| Lv %d" % m[2], "| IOU %d][/font]\n" % m[3])
- result += "[/list]\n\n"
- return result
- def buildingsListFF(self, method):
- """
- @return string the buildigs list
- """
- # buildigs data forum formatted
- if self.forum == "kong":
- result = "<strong>%s Buildings</strong>:\n" % self.guildName
- #result += "<pre>\n"
- for b in self.buildings:
- result += b.buildingFF(self.forum, method)
- #result += "</pre>\n\n"
- return result
- result = "[b]%s Buildings[/b]:\n" % self.guildName
- result += "[list]\n"
- for b in self.buildings:
- result += b.buildingFF(self.forum, method)
- result += "[/list]\n\n"
- return result
- class Family:
- def __init__(self, name, initials, guilds):
- self.name = name
- self.initials = initials
- self.guilds = guilds
- class TemplateParser:
- def __init__(self, family, forum):
- """
- Constructor
- @param list a list that contains instances of Guild class
- @param string the desired forum output (iou|kong)
- """
- self.words = {}
- totalEmptySpots = 0
- for guild in family.guilds:
- guild.forum = forum
- levels = []
- for b in guild.buildings:
- levels.append(str(b.buildLevel))
- if (guild.maxMembers-len(guild.members)) > 0:
- dynamicSlots = str(guild.maxMembers-len(guild.members)) + " players"
- if (guild.maxMembers-len(guild.members)) == 1:
- dynamicSlots = str(guild.maxMembers-len(guild.members)) + " player"
- else:
- dynamicSlots = "Full"
- guildPosition = ""
- if guild.guildRank == 1:
- guildPosition = "1st"
- elif guild.guildRank == 2:
- guildPosition = "2nd"
- elif guild.guildRank == 3:
- guildPosition = "3rd"
- else:
- guildPosition = "%dth" % guild.guildRank
- words = {
- "{%s-INITIALS}" % (guild.guildInitials): guild.guildInitials,
- "{%s-GUILD}" % (guild.guildInitials): guild.guildName,
- "{%s-RANK}" % (guild.guildInitials): str(guild.guildRank),
- "{%s-POSITION}" % (guild.guildInitials): guildPosition,
- "{%s-ENTRYLEVEL}" % (guild.guildInitials): guild.entryLevel,
- "{%s-BUILDINGS}" % (guild.guildInitials): "/".join(levels),
- "{%s-MEMBERS}" % (guild.guildInitials): str(len(guild.members)),
- "{%s-MAXMEMBERS}" % (guild.guildInitials): str(guild.maxMembers),
- "{%s-EMPTYSLOTS}" % (guild.guildInitials): str(guild.maxMembers-len(guild.members)),
- "{%s-DYNAMICSLOTS}" % (guild.guildInitials): dynamicSlots,
- "{%s-IOUSCORE}" % (guild.guildInitials): guild.guildIOUScoreFF(),
- "{%s-AVERAGELEVEL}" % (guild.guildInitials): guild.averageLevelFF(),
- "{%s-AVERAGEIOUSCORE}" % (guild.guildInitials): guild.averageIOUScoreFF(),
- "{%s-MEMBERSLIST}" % (guild.guildInitials): guild.membersListFF(),
- "{%s-BUILDINGSLIST}" % (guild.guildInitials): guild.buildingsListFF("image"),
- "{%s-BUILDINGSLIST-TEXT}" % (guild.guildInitials): guild.buildingsListFF("text")
- }
- for w in words.keys():
- self.words[w] = words[w]
- totalEmptySpots += guild.maxMembers-len(guild.members)
- self.words["{TOTALEMPTYSPOTS}"] = str(totalEmptySpots)
- self.words["{%s-INITIALS}" % (family.initials)] = family.initials
- def parseText(self, text):
- """
- Translate special words to datas
- @param string the template text
- @return string the translated text
- """
- for word in self.words:
- text = text.replace(word, self.words[word])
- return text
- def generateThread(family, template_file, forum):
- """
- Output guild's recruit thread
- @param list contains instances of Guild class
- @param string path to template file
- @param string target forum (iou|kong)
- """
- # prints header text
- try:
- f = open(template_file, "r")
- except:
- print("Cannot read header file '%s'" % template_file)
- else:
- parser = TemplateParser(family, forum)
- for l in f.readlines():
- print(parser.parseText(l.rstrip()))
- if forum == "kong":
- print("<br /><br /><div><hr /><h6>Generated by <a href=\"%s\">%s %s</a><h6></div>" % (program["url"], program["name"], program["version"]))
- else:
- print("\n\n[hr][align=center][size=xx-small]Generated by [url=%s]%s %s[/url][/size][/align]" % (program["url"], program["name"], program["version"]))
- def generateTitle(family, template_file, forum):
- """
- Output guild's recruit thread title
- @param list contains instances of Guild class
- @param string path to template file
- @param string target forum (iou|kong)
- """
- # read title template
- titleTemplate = ""
- try:
- f = open(template_file, "r")
- except:
- print("Cannot read title file '%s'" % template_file)
- else:
- parser = TemplateParser(family, forum)
- print(parser.parseText(f.readline().rstrip()))
- def generateRecruitingString(family, template_file, forum):
- """
- Output the guild's recruiting string
- @param list contains instances of Guild class
- @param string path to template file
- @param string target forum (iou|kong)
- """
- # read title template
- titleTemplate = ""
- try:
- f = open(template_file, "r")
- except:
- print("Cannot read title file '%s'" % template_file).encode("utf-8")
- else:
- parser = TemplateParser(family, forum)
- recruitingString = parser.parseText(f.readline().rstrip())
- recruitingString += " IOU: %s KONG: %s" % (config["recruiting_threads"]["iou"], config["recruiting_threads"]["kong"])
- print(recruitingString)
- guilds = []
- for g in config["guilds"]:
- # sets buildings data
- buildings = []
- for b in g[0]["buildings"]:
- buildings.append(Building(b[0], b[1], b[2]))
- # sets members data
- guild = Guild(g[0]["guild_name"], g[0]["guild_initials"], g[0]["guild_rank"], g[0]["entry_level"], buildings)
- for m in g[0]["members"]:
- guild.addMember(m[0], m[1], m[2], m[3])
- guilds.append(guild)
- del guild
- family = Family(config["family_name"], config["family_initials"], guilds)
- if len(sys.argv) > 1:
- if "--title" in sys.argv or "-t" in sys.argv:
- forum = "iou"
- generateTitle(family, title_template, forum)
- elif "--recruiting_string" in sys.argv or "-r" in sys.argv:
- forum = "iou"
- generateRecruitingString(family, title_template, forum)
- elif sys.argv[1] == "--version" or sys.argv[1] == "-v":
- print("%s %s" % (program["name"], program["version"]))
- elif sys.argv[1] == "--help" or sys.argv[1] == "-h":
- help()
- elif "--kong" in sys.argv or "-k" in sys.argv:
- forum = "kong"
- generateThread(family, kong_template, forum)
- elif "--iou" in sys.argv or "-i" in sys.argv:
- forum = "iou"
- generateThread(family, iou_template, forum)
- else:
- for argv in sys.argv[1:]:
- if argv not in cliArgs:
- print(">>> Unrecognized argument '%s'." % argv)
- print("\n")
- help()
- else:
- forum = "iou"
- generateThread(family, iou_template, forum)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement