All pastes #911055 Raw Edit

Untitled

public text v1 · immutable
·published 2008-02-20 13:31 UTC
rendered paste body
# Name:        RateMap v1.5b
#
# Author:      JoeyT2008
#
# Description: Allows players to rate their favourite maps.
#
# Commands:    !ratemap - Brings up the rating menu, or the error message if you have already rated.
#              !rate - Brings up the rating menu, or the error message if you have already rated.
#              !rm - Brings up the rating menu, or the error message if you have already rated.
#              !rating - Tells the user what the current map is rated.
#              !rating [map] - Tells the user what the chosen map is rated.
#              !ratings - Shows the users all maps in a list and their ratings.
#              !rmhelp - Brings up the command help menu.
#
# Credits:     Creator         JoeyT2008
#
#              Help            NATO_Hunter
#                              R`SiN
#                              Errant

import es, popuplib, keyvalues, os, playerlib, string, threading, gamethread, urllib2, time, langlib
from es import server_var

ratemap_ver = es.ServerVar("ratemap_ver", "1.5b", "Version of RateMap that you are using.")
ratemap_ver.makepublic()
rm_commands = {"!rm": "ratemap/sendpopup", "!rate": "ratemap/sendpopup", "!ratemap": "ratemap/sendpopup", "!rating": "ratemap/viewrating", "!ratings": "ratemap/listpopup", "!rmhelp": "ratemap/commands"}
rm_languages = ["en"]

info = es.AddonInfo() 
info.name     = "RateMap" 
info.version  = ratemap_ver
info.url      = "http://addons.eventscripts.com/addons/view/ratemap"
info.basename = "ratemap" 
info.author   = "JoeyT2008"

class DoSql(threading.Thread):
    def run(self):
        if rm_usemysql == 1:
            rm_removed = []
            try:
                rm_runsql = urllib2.urlopen("%s/deleted.php?username=%s&password=%s" % (rm_sqlurl, rm_username, rm_password)).read()
                for rm_map in rm_runsql.split("\n"):
                    rm_map = rm_map.replace("<br/>", "")
                    rm_removed.append(rm_map)
            except:
                rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "r")
                rm_logfiletext = rm_logfile.read() + "%s: Error: Could not check for deleted maps.\n" % (time.ctime())
                rm_logfile.close()
                rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "w")
                rm_logfile.write(rm_logfiletext)
                rm_logfile.close()
            rm_filepath = es.getAddonPath("ratemap") + "/data/"
            for rm_map in os.listdir(rm_filepath):
                rm_map = rm_map.replace(".dat", "")
                rm_path = es.getAddonPath("ratemap") + "/data/" + rm_map + ".dat"
                if os.path.exists(rm_path):
                    if rm_map in rm_removed:
                        os.remove(rm_path)
                        rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "r")
                        rm_logfiletext = rm_logfile.read() + "%s: Removed: %s\n" % (time.ctime(), rm_map)
                        rm_logfile.close()
                        rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "w")
                        rm_logfile.write(rm_logfiletext)
                        rm_logfile.close()
                    else:
                        mapkey = keyvalues.KeyValues(name=str(rm_map))
                        mapkey.load(rm_path)
                        if 'fivestars' in mapkey:
                            rm_fivestars = mapkey['fivestars']['count']
                        else:
                            rm_fivestars = 0
                        if 'fourstars' in mapkey:
                            rm_fourstars = mapkey['fourstars']['count']
                        else:
                            rm_fourstars = 0
                        if 'threestars' in mapkey:
                            rm_threestars = mapkey['threestars']['count']
                        else:
                            rm_threestars = 0
                        if 'twostars' in mapkey:
                            rm_twostars = mapkey['twostars']['count']
                        else:
                            rm_twostars = 0
                        if 'onestars' in mapkey:
                            rm_onestars = mapkey['onestars']['count']
                        else:
                            rm_onestars = 0
                        if 'runs' in mapkey:
                            rm_runs = mapkey['runs']['count']
                        else:
                            rm_runs = 0
                        if not rm_map == "":
                            try:
                                rm_runsql = urllib2.urlopen("%s/update.php?username=%s&password=%s&map=%s&fivestars=%s&fourstars=%s&threestars=%s&twostars=%s&onestars=%s&runs=%s" % (rm_sqlurl, rm_username, rm_password, rm_map, rm_fivestars, rm_fourstars, rm_threestars, rm_twostars, rm_onestars, rm_runs)).read()
                            except:
                                rm_runsql = "Could not connect to server."
                            if rm_runsql == "FINISHED":
                                rm_type = "Finished"
                                rm_runsql = "SQL table updated for %s." % rm_map
                            else:
                                rm_type = "Error"
                            rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "r")
                            rm_logfiletext = rm_logfile.read() + "%s: %s: %s\n" % (time.ctime(), rm_type, rm_runsql)
                            rm_logfile.close()
                            rm_logfile = open(es.getAddonPath("ratemap") + "/ratemap.log", "w")
                            rm_logfile.write(rm_logfiletext)
                            rm_logfile.close()

def loadconfig():
    rm_requiredvars = {"rm_maplist": 0, "rm_maplist_type": 0, "rm_maplist_ammount": 0, "rm_popup_automatic": 0, "rm_popup_minutes": 0, "rm_usemysql": 0, "rm_maplist": 0, "rm_sqlurl": 0, "rm_username": 0, "rm_password": 0, "rm_updatetime": 0, "rm_maplist_rating": 0, "rm_maplist_min_votes": 0}
    rm_path = es.ServerVar("eventscripts_gamedir") + "/cfg/ratemap.cfg"
    if os.path.exists(rm_path):
        rm_config = open(rm_path, "r").read()
        rm_vars = {}
        for line in rm_config.split("\n"):
            line = line.strip()
            if not line.startswith("/") and not line.startswith("-") and not line == "":
                line = line.split()
                rm_vars[line[0]] = line[1]
        for rm_varname in rm_vars:
            if rm_varname in rm_requiredvars:
                del rm_requiredvars[rm_varname]
        if len(rm_requiredvars) == 0:
            global rm_maplist
            rm_maplist = es.ServerVar("rm_maplist", int(rm_vars["rm_maplist"]))
            global rm_maplist_type
            rm_maplist_type = es.ServerVar("rm_maplist_type", int(rm_vars["rm_maplist_type"]))
            global rm_maplist_ammount
            rm_maplist_ammount = es.ServerVar("rm_maplist_ammount", int(rm_vars["rm_maplist_ammount"]))
            global rm_popup_automatic
            rm_popup_automatic = es.ServerVar("rm_popup_automatic", int(rm_vars["rm_popup_automatic"]))
            global rm_popup_minutes
            rm_popup_minutes = es.ServerVar("rm_popup_minutes", int(rm_vars["rm_popup_minutes"]))
            global rm_usemysql
            rm_usemysql = es.ServerVar("rm_usemysql", int(rm_vars["rm_usemysql"]))
            global rm_sqlurl
            rm_sqlurl = rm_vars["rm_sqlurl"]
            global rm_username
            rm_username = rm_vars["rm_username"]
            global rm_password
            rm_password = rm_vars["rm_password"]
            global rm_updatetime
            rm_updatetime = es.ServerVar("rm_updatetime", int(rm_vars["rm_updatetime"]))
            global rm_maplist_rating
            rm_maplist_rating = es.ServerVar("rm_maplist_rating", int(rm_vars["rm_maplist_rating"]))
            global rm_maplist_min_votes
            rm_maplist_min_votes = es.ServerVar("rm_maplist_min_votes", int(rm_vars["rm_maplist_min_votes"]))
            es.ServerVar("ratemap_url", rm_sqlurl).makepublic() 
        else: 
            for rm_varname in rm_requiredvars:
                es.dbgmsg(0, lang("cfg_missing_var", {"var": rm_varname}))
                lang("mysql_fail", {"map": rm_map})
            es.unload("ratemap")
    else:
        es.dbgmsg(0, lang("cfg_missing"))
        es.unload("ratemap")

def gg_win(event_var):
    popup_rating()

def load():
    global lang
    lang = langlib.Strings(es.getAddonPath("ratemap") + "/strings.ini")
    loadconfig()
    global rm_rounds_left
    rm_rounds_left = es.ServerVar("mp_maxrounds")
    if rm_rounds_left == 0:
        rm_rounds_left = -1
    for rm_command in rm_commands:
        es.regsaycmd(rm_command, rm_commands[rm_command])
    global rm_map
    rm_map = es.ServerVar("eventscripts_currentmap")
    global rm_path
    rm_path = es.getAddonPath('ratemap') + "/data/" + rm_map + '.dat'
    if not os.path.exists(rm_path):
        mapkey = keyvalues.KeyValues(name=str(rm_map))
        mapkey['fivestars'] = keyvalues.KeyValues(name='fivestars')
        mapkey['fivestars']['count'] = 0
        mapkey['fourstars'] = keyvalues.KeyValues(name='fourstars')
        mapkey['fourstars']['count'] = 0
        mapkey['threestars'] = keyvalues.KeyValues(name='threestars')
        mapkey['threestars']['count'] = 0
        mapkey['twostars'] = keyvalues.KeyValues(name='twostars')
        mapkey['twostars']['count'] = 0
        mapkey['onestars'] = keyvalues.KeyValues(name='onestars')
        mapkey['onestars']['count'] = 0
        mapkey.save(rm_path)
    else:
        mapkey = keyvalues.KeyValues(name=str(rm_map))
        mapkey.load(rm_path)
    gamethread.delayedname(rm_updatetime, "updatesql", updatesql)

def unload():
    gamethread.cancelDelayed("popup_rating")
    gamethread.cancelDelayed("updatesql")
    for rm_command in rm_commands:
        es.unregsaycmd(rm_command)

def es_map_start(event_var):
    global rm_map
    rm_map = es.ServerVar("eventscripts_currentmap")
    global rm_path
    rm_path = es.getAddonPath('ratemap') + "/data/" + rm_map + ".dat"
    if not os.path.exists(rm_path):
        mapkey = keyvalues.KeyValues(name=str(rm_map))
        mapkey['fivestars'] = keyvalues.KeyValues(name='fivestars')
        mapkey['fivestars']['count'] = 0
        mapkey['fourstars'] = keyvalues.KeyValues(name='fourstars')
        mapkey['fourstars']['count'] = 0
        mapkey['threestars'] = keyvalues.KeyValues(name='threestars')
        mapkey['threestars']['count'] = 0
        mapkey['twostars'] = keyvalues.KeyValues(name='twostars')
        mapkey['twostars']['count'] = 0
        mapkey['onestars'] = keyvalues.KeyValues(name='onestars')
        mapkey['onestars']['count'] = 0
        mapkey['runs'] = keyvalues.KeyValues(name='runs')
        mapkey['runs']['count'] = 1
        mapkey.save(rm_path)
    else:
        mapkey = keyvalues.KeyValues(name=str(rm_map))
        mapkey.load(rm_path)
        if 'runs' in mapkey:
            rm_runs = mapkey['runs']['count']
            rm_runs += 1
            mapkey['runs']['count'] = rm_runs
            mapkey.save(rm_path)
        else:
            rm_runs = 1
            mapkey['runs'] = keyvalues.KeyValues(name='runs')
            mapkey['runs']['count'] = rm_runs
            mapkey.save(rm_path)
    if rm_maplist == 1:
        createmaplist()
    gamethread.cancelDelayed("popup_rating")
    if rm_popup_automatic == 1:
        rm_popup_seconds = int(rm_popup_minutes) * 60
        gamethread.delayedname(rm_popup_seconds, 'popup_rating', popup_rating)
    rm_sql = DoSql();
    rm_sql.start()

def updatesql():
    rm_sql = DoSql();
    rm_sql.start()
    gamethread.delayedname(rm_updatetime*60, "updatesql", updatesql)

def popup_rating():
    for rm_userid in playerlib.getPlayerList('#all'):
        rm_userid = int(rm_userid)
        mapkey = keyvalues.KeyValues(name=str(rm_map))
        mapkey.load(rm_path)
        rm_steamid = es.getplayersteamid(rm_userid)
        if not rm_steamid in mapkey:
            popuprating(rm_userid)

def createmaplist():
    rm_maplistdict = {}
    rm_filepath = es.getAddonPath('ratemap') + "/data/"
    for rm_file in os.listdir(rm_filepath):
        rm_filepath_full = rm_filepath + rm_file
        rm_maps = keyvalues.KeyValues(name=rm_file)
        rm_maps.load(rm_filepath_full)
        rm_fivestars = rm_maps["fivestars"]["count"]
        rm_fourstars = rm_maps["fourstars"]["count"]
        rm_threestars = rm_maps["threestars"]["count"]
        rm_twostars = rm_maps["twostars"]["count"]
        rm_onestars = rm_maps["onestars"]["count"]
        rm_total_fivestars = int(rm_fivestars) * 5
        rm_total_fourstars = int(rm_fourstars) * 4
        rm_total_threestars = int(rm_threestars) * 3
        rm_total_twostars = int(rm_twostars) * 2
        rm_total_onestars = int(rm_onestars) * 1
        rm_total_votes = int(rm_fivestars) + int(rm_fourstars) + int(rm_threestars) + int(rm_twostars) + int(rm_onestars)
        rm_total_votes2 = int(rm_total_fivestars) + int(rm_total_fourstars) + int(rm_total_threestars) + int(rm_total_twostars) + int(rm_total_onestars)
        if rm_total_votes2 != 0:
            rm_totalmaplistrating = float(rm_total_votes2) / float(rm_total_votes)
            if rm_maplist_type == 1:
                rm_maplistrating = rm_total_votes2
            if rm_maplist_type == 2:
                rm_maplistrating = float(rm_total_votes2) / float(rm_total_votes)
            if rm_maplist_type == 3:
                rm_maplistrating = rm_total_votes
            rm_mapname = rm_file.replace(".dat", "")
            if rm_total_votes <= int(rm_maplist_min_votes) or rm_totalmaplistrating >= int(rm_maplist_rating):
                rm_maplistdict[rm_mapname] = rm_maplistrating
    rm_maplistdict_items = [(v, k) for k, v in rm_maplistdict.items()]
    rm_maplistdict_items.sort()
    rm_maplistdict_items.reverse()
    rm_maplistdict_items = [(k, v) for v, k in rm_maplistdict_items]
    rm_ammount = rm_maplist_ammount
    rm_txtpath = es.getAddonPath('ratemap') + "../../../../maplist.txt"
    rm_txtpath2 = es.getAddonPath('ratemap') + "../../../../mapcycle.txt"
    rm_txtpath3 = es.getAddonPath('ratemap') + "../../../../cfg/mani_admin_plugin/votemaplist.txt"
    f = open(rm_txtpath, 'w')
    f2 = open(rm_txtpath2, 'w')
    if os.path.exists(rm_txtpath3):
        f3 = open(rm_txtpath3, 'w')
    for rm_key in rm_maplistdict_items:
        rm_ammount -= 1
        if not rm_ammount == 0:
            rm_key = str(rm_key)
            rm_mapname = rm_key.split("', ")[0][2:]
            f.write('%s\n' % rm_mapname)
            f2.write('%s\n' % rm_mapname)
            if os.path.exists(rm_txtpath3):
                f3.write('%s\n' % rm_mapname)
    f.close()
    f2.close()
    if os.path.exists(rm_txtpath3):
        f3.close()

def round_start(event_var):
    global rm_rounds_left
    rm_rounds_left -= 1
    if rm_rounds_left == 0:
        if rm_popup_minutes == 0:
            popup_rating()
    mapkey = keyvalues.KeyValues(name=str(rm_map))
    mapkey.load(rm_path)
    for rm_userid in playerlib.getPlayerList("#all"):
        rm_userid = int(rm_userid)
        rm_player = playerlib.getPlayer(rm_userid)
        rm_lang = rm_player.get("lang")
        if not rm_lang in rm_languages:
            rm_lang = "en"
        es.tell(rm_userid, "#multi", lang("round_start_msg1", {}, rm_lang))
        rm_ratingdict = getrating(rm_userid, rm_map)
        if not rm_ratingdict == None:
            es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
        else:
            es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map}, rm_lang))

def teamplay_round_start(event_var):
    mapkey = keyvalues.KeyValues(name=str(rm_map))
    mapkey.load(rm_path)
    for rm_userid in playerlib.getPlayerList("#all"):
        rm_userid = int(rm_userid)
        rm_player = playerlib.getPlayer(rm_userid)
        rm_lang = rm_player.get("lang")
        if not rm_lang in rm_languages:
            rm_lang = "en"
        es.tell(rm_userid, "#multi", lang("round_start_msg1", {}, rm_lang))
        rm_ratingdict = getrating(rm_userid, rm_map)
        if not rm_ratingdict == None:
            es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
        else:
            es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map}, rm_lang))

def viewrating():
    rm_userid = es.getcmduserid()
    rm_player = playerlib.getPlayer(int(rm_userid))
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    rm_argcount = es.getargc()
    if rm_argcount <= 2:
        if rm_argcount == 1:
            rm_ratingdict = getrating(rm_userid, rm_map)
            if not rm_ratingdict == None:
                es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
            else:
                es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map}, rm_lang))
        if rm_argcount == 2:
            rm_map2 = es.getargv(1)
            rm_ratingdict = getrating(rm_userid, rm_map2)
            if not rm_ratingdict == None:
                es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
            else:
                es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map2}, rm_lang))
    else:
        es.tell(int(rm_userid), "#multi", lang("viewrating", {}, rm_lang))

def sendpopup():
    rm_userid = es.getcmduserid()
    mapkey = keyvalues.KeyValues(name=str(rm_map))
    mapkey.load(rm_path)
    rm_steamid = es.getplayersteamid(rm_userid)
    if rm_steamid in mapkey:
        rm_player = playerlib.getPlayer(int(rm_userid))
        rm_lang = rm_player.get("lang")
        if not rm_lang in rm_languages:
            rm_lang = "en"
        es.tell(rm_userid, "#multi", lang("sendpopup", {"map": rm_map}, rm_lang))
        rm_ratingdict = getrating(rm_userid, rm_map)
        if not rm_ratingdict == None:
            es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
        else:
            es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map}, rm_lang))
    else:
        popuprating(rm_userid)

def popuprating(rm_userid):
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    if popuplib.isqueued('ratemenu', rm_userid):
        popuplib.close('ratemenu', rm_userid)
    ratemenu = popuplib.create("ratemenu")
    ratemenu.addline("RateMap v1.5b")
    ratemenu.addline("-------------------")
    ratemenu.addline("%s: %s" % (lang("map", {}, rm_lang), rm_map))
    ratemenu.addline("-------------------")
    ratemenu.addline("->1. 5 %s" % lang("stars", {}, rm_lang))
    ratemenu.addline("->2. 4 %s" % lang("stars", {}, rm_lang))
    ratemenu.addline("->3. 3 %s" % lang("stars", {}, rm_lang))
    ratemenu.addline("->4. 2 %s" % lang("stars", {}, rm_lang))
    ratemenu.addline("->5. 1 %s" % lang("star", {}, rm_lang))
    ratemenu.addline("-------------------")
    ratemenu.addline("0. %s" % lang("close", {}, rm_lang))
    ratemenu.addline("-------------------")
    ratemenu.select(1, setrating)
    ratemenu.select(2, setrating)
    ratemenu.select(3, setrating)
    ratemenu.select(4, setrating)
    ratemenu.select(5, setrating)
    ratemenu.send(rm_userid)

def setrating(rm_userid, rm_choice, rm_popup):
    mapkey = keyvalues.KeyValues(name=str(rm_map))
    mapkey.load(rm_path)
    if rm_choice == 1:
        rm_stars = "fivestars"
    if rm_choice == 2:
        rm_stars = "fourstars"
    if rm_choice == 3:
        rm_stars = "threestars"
    if rm_choice == 4:
        rm_stars = "twostars"
    if rm_choice == 5:
        rm_stars = "onestars"
    rm_steamid = es.getplayersteamid(rm_userid)
    mapkey[rm_steamid] = keyvalues.KeyValues(name=str(rm_steamid))
    mapkey[rm_steamid]["Rated"] = rm_choice
    rm_count = mapkey[rm_stars]["count"]
    rm_count = int(rm_count)
    rm_count += 1
    mapkey[rm_stars]["count"] = rm_count
    mapkey.save(rm_path)
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    es.tell(rm_userid, "#multi", lang("thx_for_rating", {"map": rm_map}, rm_lang))
    rm_ratingdict = getrating(rm_userid, rm_map)
    if not rm_ratingdict == None:
        es.tell(rm_userid, "#multi", lang("rating", rm_ratingdict, rm_lang))
    else:
        es.tell(rm_userid, "#multi", lang("no_rating", {"map": rm_map}, rm_lang))

def getrating(rm_userid, rm_map2):
    mapkey = keyvalues.KeyValues(name=str(rm_map2))
    rm_path2 = es.getAddonPath('ratemap') + "/data/" + rm_map2 + '.dat'
    if not os.path.exists(rm_path2):
        return None
    else:
        mapkey.load(rm_path2)
        rm_fivestars = mapkey["fivestars"]["count"]
        rm_fourstars = mapkey["fourstars"]["count"]
        rm_threestars = mapkey["threestars"]["count"]
        rm_twostars = mapkey["twostars"]["count"]
        rm_onestars = mapkey["onestars"]["count"]
        rm_total_fivestars = int(rm_fivestars) * 5
        rm_total_fourstars = int(rm_fourstars) * 4
        rm_total_threestars = int(rm_threestars) * 3
        rm_total_twostars = int(rm_twostars) * 2
        rm_total_onestars = int(rm_onestars) * 1
        rm_total_votes = int(rm_fivestars) + int(rm_fourstars) + int(rm_threestars) + int(rm_twostars) + int(rm_onestars)
        rm_total_votes2 = int(rm_total_fivestars) + int(rm_total_fourstars) + int(rm_total_threestars) + int(rm_total_twostars) + int(rm_total_onestars)
        if rm_total_votes != 0:
            rm_map_rating = float(rm_total_votes2) / float(rm_total_votes)
            rm_map_rating = "%.2f"%rm_map_rating
            return {"map": rm_map2, "rating": rm_map_rating, "votes": rm_total_votes}
        else:
            return {"map": rm_map2, "rating": 0.00, "votes": 0}

def listpopup():
    rm_userid = es.getcmduserid()
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    if popuplib.isqueued('ratemenu2', rm_userid):
        popuplib.close('ratemenu2', rm_userid)
    ratemenu2 = popuplib.create('ratemenu2')
    ratemenu2.addline('RateMap v1.5b')
    ratemenu2.addline('-------------------')
    ratemenu2.addline('->1. %s' % lang("nameasc", {}, rm_lang))
    ratemenu2.addline('->2. %s' % lang("nameasc", {}, rm_lang))
    ratemenu2.addline('->3. %s' % lang("votesasc", {}, rm_lang))
    ratemenu2.addline('->4. %s' % lang("votesasc", {}, rm_lang))
    ratemenu2.addline('->5. %s' % lang("ratingasc", {}, rm_lang))
    ratemenu2.addline('->6. %s' % lang("ratingasc", {}, rm_lang))
    ratemenu2.addline('-------------------')
    ratemenu2.addline('0. %s' % lang("close", {}, rm_lang))
    ratemenu2.addline('-------------------')
    ratemenu2.menuselect = sort
    ratemenu2.send(rm_userid)

def sort(rm_userid, rm_choice, rm_popupid):
    if rm_choice == 1:
        sortbyname(rm_userid, 1)
    if rm_choice == 2:
        sortbyname(rm_userid, 2)
    if rm_choice == 3:
        sortbyvotes(rm_userid, 1)
    if rm_choice == 4:
        sortbyvotes(rm_userid, 2)
    if rm_choice == 5:
        sortbyrating(rm_userid, 1)
    if rm_choice == 6:
        sortbyrating(rm_userid, 2)

def sortbyname(rm_userid, rm_type):
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    rm_namedict = {}
    rm_filepath = es.getAddonPath('ratemap') + "/data/"
    ratemenu3 = popuplib.easymenu('ratemenu3', '_popup_choice', showinfo)
    ratemenu3.settitle("RateMap v1.5b\n%s" % lang("mapratings", {}, rm_lang))
    for rm_file in os.listdir(rm_filepath):
        rm_file = rm_file.replace(".dat", "")
        rm_namedict[rm_file] = rm_file
    rm_namedict_items = [(v, k) for k, v in rm_namedict.items()]
    rm_namedict_items.sort()
    if rm_type == 2:
        rm_namedict_items.reverse()
    rm_namedict_items = [(k, v) for v, k in rm_namedict_items]
    for rm_key in rm_namedict_items:
        rm_key = str(rm_key)
        rm_name = rm_key.split("', ")[0][2:]
        ratemenu3.addoption(rm_key, rm_name)
    ratemenu3.send(rm_userid)

def sortbyvotes(rm_userid, rm_type):
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    rm_filepath = es.getAddonPath('ratemap') + "/data/"
    rm_votedict = {}
    rm_ratingdict = {}
    if popuplib.isqueued('ratemenu4', rm_userid):
        popuplib.close('ratemenu4', rm_userid)
    for rm_file in os.listdir(rm_filepath):
        rm_filepath_full = rm_filepath + rm_file
        rm_maps = keyvalues.KeyValues(name=rm_file)
        rm_maps.load(rm_filepath_full)
        rm_map_fivestars = rm_maps["fivestars"]["count"]
        rm_map_fourstars = rm_maps["fourstars"]["count"]
        rm_map_threestars = rm_maps["threestars"]["count"]
        rm_map_twostars = rm_maps["twostars"]["count"]
        rm_map_onestars = rm_maps["onestars"]["count"]
        rm_map_total_fivestars = rm_map_fivestars * 5
        rm_map_total_fourstars = rm_map_fourstars * 4
        rm_map_total_threestars = rm_map_threestars * 3
        rm_map_total_twostars = rm_map_twostars * 2
        rm_map_total_onestars = rm_map_onestars
        rm_map_votes = rm_map_fivestars + rm_map_twostars + rm_map_threestars + rm_map_fourstars + rm_map_onestars
        rm_map_rating = rm_map_total_fivestars + rm_map_total_twostars + rm_map_total_threestars + rm_map_total_fourstars + rm_map_total_onestars
        rm_votedict[rm_file] = rm_map_votes
        rm_ratingdict[rm_file] = rm_map_rating
    rm_votedict_items = [(v, k) for k, v in rm_votedict.items()]
    rm_votedict_items.sort()
    if rm_type == 1:
        rm_votedict_items.reverse()
    rm_votedict_items = [(k, v) for v, k in rm_votedict_items]
    rm_ratingdict_items = [(v, k) for k, v in rm_ratingdict.items()]
    rm_ratingdict_items.sort()
    if rm_type == 1:
        rm_ratingdict_items.reverse()
    ratemenu4 = popuplib.easymenu('ratemenu4', '_popup_choice', showinfo)
    ratemenu4.settitle("RateMap v1.5b\n%s" % lang("mapratings", {}, rm_lang))
    rm_ratingdict_items = [(k, v) for v, k in rm_ratingdict_items]
    for rm_key in rm_votedict_items:
        rm_key = str(rm_key)
        rm_name = rm_key.split("', ")[0][2:]
        rm_name = rm_name.replace(".dat", "")
        rm_value = rm_key.split("', ")[1][:4]
        rm_value = rm_value.replace(")", "")
        rm_name = rm_name + " - " + rm_value
        ratemenu4.addoption(rm_key, rm_name)
    ratemenu4.send(rm_userid)

def sortbyrating(rm_userid, rm_type):
    rm_filepath = es.getAddonPath('ratemap') + "/data/"
    rm_votedict = {}
    rm_ratingdict = {}
    rm_totalratingdict = {}
    if popuplib.isqueued('ratemenu5', rm_userid):
        popuplib.close('ratemenu5', rm_userid)
    ratemenu5 = popuplib.easymenu('ratemenu5', '_popup_choice', showinfo)
    ratemenu5.settitle("RateMap v1.5b")
    for rm_file in os.listdir(rm_filepath):
        rm_filepath_full = rm_filepath + rm_file
        rm_maps = keyvalues.KeyValues(name=rm_file)
        rm_maps.load(rm_filepath_full)
        rm_map_fivestars = rm_maps["fivestars"]["count"]
        rm_map_fourstars = rm_maps["fourstars"]["count"]
        rm_map_threestars = rm_maps["threestars"]["count"]
        rm_map_twostars = rm_maps["twostars"]["count"]
        rm_map_onestars = rm_maps["onestars"]["count"]
        rm_map_total_fivestars = rm_map_fivestars * 5
        rm_map_total_fourstars = rm_map_fourstars * 4
        rm_map_total_threestars = rm_map_threestars * 3
        rm_map_total_twostars = rm_map_twostars * 2
        rm_map_total_onestars = rm_map_onestars
        rm_map_votes = rm_map_fivestars + rm_map_twostars + rm_map_threestars + rm_map_fourstars + rm_map_onestars
        rm_map_rating = rm_map_total_fivestars + rm_map_total_twostars + rm_map_total_threestars + rm_map_total_fourstars + rm_map_total_onestars
        rm_votedict[rm_file] = rm_map_votes
        rm_ratingdict[rm_file] = rm_map_rating
        if rm_map_votes != 0:
            rm_map_rating = rm_map_rating + .00
            rm_map_votes = rm_map_votes + .00
            rm_map_total_rating = rm_map_rating / rm_map_votes
        else:
            rm_map_total_rating = 0
        rm_totalratingdict[rm_file] = rm_map_total_rating
    rm_ratingdict_items = [(v, k) for k, v in rm_totalratingdict.items()]
    rm_ratingdict_items.sort()
    if rm_type == 1:
        rm_ratingdict_items.reverse()
    rm_ratingdict_items = [(k, v) for v, k in rm_ratingdict_items]
    for rm_key in rm_ratingdict_items:
        rm_key = str(rm_key)
        rm_key = rm_key.replace(".dat", "")
        rm_name = rm_key.split("', ")[0][2:]
        rm_name_full = rm_name + ".dat"
        rm_map_rating = rm_totalratingdict[rm_name_full]
        rm_name = rm_name + " - " + str("%.2f"%rm_map_rating) + "/5.00"
        ratemenu5.addoption(rm_key, rm_name)
    ratemenu5.send(rm_userid)

def showinfo(rm_userid, rm_choice, rm_popupid):
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    if ".dat" in rm_choice:
        rm_choice = rm_choice.replace(".dat", "")
    rm_map_name = rm_choice.split("', ")[0][2:]
    rm_map_path = es.getAddonPath('ratemap') + "/data/" + rm_map_name + ".dat"
    if popuplib.isqueued('ratemenu6', rm_userid):
        popuplib.close('ratemenu6', rm_userid)
    mapkey = keyvalues.KeyValues(name=str(rm_map_name))
    mapkey.load(rm_map_path)
    rm_map_fivestars = mapkey["fivestars"]["count"]
    rm_map_fourstars = mapkey["fourstars"]["count"]
    rm_map_threestars = mapkey["threestars"]["count"]
    rm_map_twostars = mapkey["twostars"]["count"]
    rm_map_onestars = mapkey["onestars"]["count"]
    rm_map_total_fivestars = rm_map_fivestars * 5
    rm_map_total_fourstars = rm_map_fourstars * 4
    rm_map_total_threestars = rm_map_threestars * 3
    rm_map_total_twostars = rm_map_twostars * 2
    rm_map_total_onestars = rm_map_onestars
    rm_map_votes = rm_map_fivestars + rm_map_fourstars + rm_map_threestars + rm_map_twostars + rm_map_onestars
    rm_map_rating = rm_map_total_fivestars + rm_map_total_fourstars + rm_map_total_threestars + rm_map_total_twostars + rm_map_total_onestars
    if rm_map_rating != 0:
        rm_map_rating = rm_map_rating + .00
        rm_map_votes2 = rm_map_votes + .00
        rm_map_rating = rm_map_rating / rm_map_votes2
    rm_steamid = es.getplayersteamid(rm_userid)
    if rm_steamid in mapkey:
        rm_player_rating = mapkey[rm_steamid]["Rated"]
        if rm_player_rating == 1:
            rm_player_rating = "5.00"
        if rm_player_rating == 2:
            rm_player_rating = "4.00"
        if rm_player_rating == 3:
            rm_player_rating = "3.00"
        if rm_player_rating == 4:
            rm_player_rating = "2.00"
        if rm_player_rating == 5:
            rm_player_rating = "1.00"
    if 'runs' in mapkey:
        rm_runs = mapkey['runs']['count']
    else:
        rm_runs = 0
    ratemenu6 = popuplib.create('ratemenu6')
    ratemenu6.addline('RateMap v1.5b')
    ratemenu6.addline('-------------------')
    ratemenu6.addline('%s: %s' % (lang("mapname", {}, rm_lang), rm_map_name))
    ratemenu6.addline('%s: %s' % (lang("totalvotes", {}, rm_lang), rm_map_votes))
    ratemenu6.addline('%s: %s times' % (lang("mapruns", {}, rm_lang), rm_runs))
    ratemenu6.addline('%s: %s' % (lang("ratingtxt", {}, rm_lang), "%.2f"%rm_map_rating + "/5.00"))
    if rm_steamid in mapkey:
        ratemenu6.addline('%s: %s' % (lang("yourrating", {}, rm_lang), rm_player_rating))
    ratemenu6.addline('-------------------')
    ratemenu6.addline('0. %s' % lang("close", {}, rm_lang))
    ratemenu6.addline('-------------------')
    ratemenu6.send(rm_userid)

def commands():
    rm_userid = es.getcmduserid()
    if popuplib.isqueued('ratemenu7', rm_userid):
        popuplib.close('ratemenu7', rm_userid)
    ratemenu7 = popuplib.create('ratemenu7')
    ratemenu7.addline('RateMap v1.5b')
    ratemenu7.addline('-------------------')
    ratemenu7.addline('Help')
    ratemenu7.addline('-------------------')
    ratemenu7.addline('->1. !ratemap')
    ratemenu7.addline('->2. !ratings')
    ratemenu7.addline('->3. !rating')
    ratemenu7.addline('->4. !rmhelp')
    ratemenu7.addline('-------------------')
    ratemenu7.addline('0. Close')
    ratemenu7.addline('-------------------')
    ratemenu7.menuselect = commanddesc
    ratemenu7.send(rm_userid)

def commanddesc(rm_userid, rm_choice, rm_popupid):
    rm_player = playerlib.getPlayer(rm_userid)
    rm_lang = rm_player.get("lang")
    if not rm_lang in rm_languages:
        rm_lang = "en"
    if popuplib.isqueued('ratemenu8', rm_userid):
        popuplib.close('ratemenu8', rm_userid)
    ratemenu8 = popuplib.create('ratemenu8')
    ratemenu8.addline('RateMap v1.5b')
    ratemenu8.addline('-------------------')
    if rm_choice == 1:
        ratemenu8.addline('!ratemap')
    if rm_choice == 2:
        ratemenu8.addline('!ratings')
    if rm_choice == 3:
        ratemenu8.addline('!rating')
    if rm_choice == 4:
        ratemenu8.addline('!rmhelp')
    ratemenu8.addline('-------------------')
    if rm_choice == 1:
        ratemenu8.addline('%s' % lang("rmh1", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh2", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh3", {}, rm_lang))
    if rm_choice == 2:
        ratemenu8.addline('%s' % lang("rmh4", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh5", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh6", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh7", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh8", {}, rm_lang))
    if rm_choice == 3:
        ratemenu8.addline('%s' % lang("rmh9", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh10", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh11", {}, rm_lang))
    if rm_choice == 4:
        ratemenu8.addline('%s' % lang("rmh12", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh13", {}, rm_lang))
        ratemenu8.addline('%s' % lang("rmh14", {}, rm_lang))
    ratemenu8.addline('-------------------')
    ratemenu8.addline('0. %s' % lang("close", {}, rm_lang))
    ratemenu8.addline('-------------------')
    ratemenu8.send(rm_userid)