Пример #1
0
class Bot(BotInterface):
    def __init__(self, bot, md):
        BotInterface.__init__(self, bot, md)
        bot.register_module_info(
            __name__,
            "stats",
            "The Junky",
            "Stats Retrieval Module",
            ".01"
        )
        self._db = Amysql(self.logger)
        self._db.setDbCredentialsFromFile(
            self.module_path + R"/statsdb.conf", "db")
        self._db.start()
        # self.clist = [COMMAND_TYPE_PUBLIC, COMMAND_TYPE_TEAM,
        #   COMMAND_TYPE_FREQ, COMMAND_TYPE_PRIVATE, COMMAND_TYPE_CHAT]
        self.clist = [COMMAND_TYPE_PRIVATE]
        # self._sql_command_id = bot.register_command(
        #   '!sql', None, 9, self.clist, "web", "[query]", 'sql it zz')
        # self._sqlnl_command_id = bot.register_command(
        #   '!sqlnl', None, 9, self.clist, "web", "[query]", 'sql it zz')
        self._last_jp = bot.register_command(
            '!jackpots', None, 0, self.clist, "Stats", "", 'last jackpots won')
        self._recs = bot.register_command(
            '!recs', None, 0, self.clist, "Stats", "[reset id]", 'top ratios')
        self._points = bot.register_command(
            '!points', None, 0, self.clist, "Stats", "[reset id]",
            'Top points')
        self._squads = bot.register_command(
            '!squads', None, 0, self.clist, "Stats", "[reset id]",
            'top squads')
        self._resets = bot.register_command(
            '!resets', None, 0, self.clist, "Stats", "", 'recentreset ids')
        self.level = logging.DEBUG
        self.timer_man = TimerManager.TimerManager()
        self.timer_man.set(.01, 1)
        self.timer_man.set(300, 2)
        self.chat = bot.add_chat("st4ff")
        self.cache = {
            # !cmd: (Cached_result, time)
            "!jackpots": (None, 0, "jackpots.txt"),
            "!recs": (None, 0, "recs.txt"),
            "!points": (None, 0, "points.txt"),
            "!squads": (None, 0, "squads.txt")
        }

        formatter = logging.Formatter('%(message)s')
        handler = LoggingRemoteHandler(logging.DEBUG, bot, "Ratio")
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    def getMessageTuple(self, event):
        """
            this data will be used later in pretty printer
            when the result is to be printed back to ss
        """
        if event.command_type == MESSAGE_TYPE_PRIVATE:
            target = event.pname
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_REMOTE:
            target = event.pname
            mtype = MESSAGE_TYPE_PRIVATE
        elif event.command_type == MESSAGE_TYPE_FREQ:
            target = event.player.freq
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_CHAT:
            target = event.chat_no
            mtype = event.command_type
        else:
            target = None
            mtype = event.command_type

        return (mtype, target, event.command.name)

    def getResetId(self, event):
        if len(event.arguments) > 0:
            try:
                r = int(event.arguments[0])
                if r < 0:
                    return None
                return r
            except ValueError:
                return None
            return None

    def handle_events(self, ssbot, event):

        if event.type == EVENT_COMMAND:
            # if event.command.id in [
            #         self._sql_command_id, self._sqlnl_command_id]:
            #     automatically addlimit or not
            #     if event.command.id == self._sql_command_id:
            #         limit = " limit 100"
            #     else:
            #         limit = ""
            #     mt = self.get_message_tuple(event)
            #     db = self._db
            #     db.query(event.arguments_after[0] + limit, None, mt)
            if event.command.id == self._last_jp:
                q = """SELECT
                        id,
                        IF(
                            jackpot > 1000000,
                            concat(round(jackpot / 1000000, 1), "mil"),
                            concat(round(jackpot/1000, 1), "K")
                        ) AS jp,
                        IF(
                            winning_freq < 100,
                            winning_freq,
                            "Priv"
                        ) AS freq,
                        timediff(end_time, start_time) AS runtime
                    FROM flag_games
                    WHERE to_days(now()) - to_days(end_time) < 1
                    ORDER BY jackpot DESC
                    LIMIT 5"""

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._points:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                        player.name AS pname,
                        squad.name AS squad,
                        flag_points + kill_points AS points
                    FROM %s ps, player, squad
                    WHERE
                        ps.player_id = player.id
                        AND ps.squad_id = squad.id %s
                    ORDER BY points DESC
                    LIMIT 10""" % (ps, rs)
                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)

            elif event.command.id == self._resets:
                q = "select * from reset order by id desc limit 10"

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._recs:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                        a.player_id,
                        b.name,
                        GetRating(a.Wins, a.Losses) AS `value`,
                        a.Wins,
                        a.Losses
                    FROM %s a, player b
                    WHERE
                        a.Wins > 50
                        AND a.player_id = b.id %s
                        AND STRCMP(LEFT(b.name, 4), "Bot-")
                        AND STRCMP(LEFT(b.name, 7), "DevBot-")
                    ORDER BY value DESC
                    LIMIT 5""" % (ps, rs)

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._squads:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                    s.name AS squadname,
                    GetTopAvg(0, s.id, 10) AS Avg,
                    count(squad_id) AS members
                    FROM squad s, %s ps
                    WHERE
                        squad_id <> 1
                        AND s.id = ps.squad_id %s
                    GROUP BY squad_id HAVING members >= 10
                    ORDER BY Avg DESC
                    LIMIT 10""" % (ps, rs)
                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
        elif event.type == EVENT_TICK:
            timer_expired = self.timer_man.getExpired()  # a timer expired
            # self.logger.info("tick")
            if timer_expired:
                # self.logger.info("timer expired")

                if timer_expired.data == 1:
                    # self.logger.info("1")
                    r = self._db.getResults()
                    if r:  # most of the time this will be None so check first
                        self.HandleResults(ssbot, event, r)
                    self.timer_man.set(1, 1)  # set it to check again in a sec
                elif timer_expired.data == 2:
                    # self.logger.info("2")
                    self._db.ping()
                    self.timer_man.set(300, 2)

    def HtmlResultWriter(self, result, filename):
        """
        this function will print any result nicely on screen with
        proper formatting
        """
        f = open(filename, 'w')

        if self.rows is None or len(self.rows) == 0:
            pass
        else:
            if not self.description:
                f.write("#### NO RESULTS ###")
            else:
                names = []
                lengths = []

                for dd in self.description:  # iterate over description
                    names.append(dd[0])
                    # in case name is bigger then max len of data
                    lengths.append(len(dd[0]))

                for row in self.rows:  # get the max length of each column
                    for i in range(len(row)):
                        lengths[i] = max(lengths[i], len(str(row[i])))
                tb = "-" * (sum(map(int, lengths)) + (len(lengths) * 3) + 1)
                fm = "|"
                for col in lengths:  # make the format string
                    fm += " %" + str(col) + "s |"
                f.write(tb)
                f.write((fm % tuple(names)))
                f.write(tb)

                for row in self.rows:  # output the rows
                    f.write((fm % row))
                f.write(tb)
                f.close()

    def HandleResults(self, ssbot, event, r):
        # message like connection error or connected
        if r.getType() == AElement.TYPE_MESSAGE:
            self.logger.info(r.message)
        else:
            # if r.query.data[2] in self.cache:
            #     self.cache[r.query.data[2]] = (
            #       copy.copy(r), get_tick_count_hs())
            r.GenericResultPrettyPrinter(
                ssbot, r.query.data[0], r.query.data[1])

    def cleanup(self):
        self._db.CleanUp()
Пример #2
0
class Bot(BotInterface):
    def __init__(self, bot, md):
        BotInterface.__init__(self, bot, md)
        bot.register_module_info(
            __name__,
            "MysqLtest",
            "The Junky",
            "egdldb helper",
            ".01b"
        )
        self._db = Amysql(self.logger)
        self._db.setDbCredentialsFromFile(
            self.module_path + R"/egdldb.conf", "db")
        self._db.start()
        self.clist = [COMMAND_TYPE_PUBLIC, COMMAND_TYPE_TEAM,
                      COMMAND_TYPE_FREQ, COMMAND_TYPE_PRIVATE,
                      COMMAND_TYPE_CHAT]
        self.commands = {
            # bot.register_command(
            #     '!sql',
            #     None,
            #     9,
            #     self.clist,
            #     "db",
            #     "[query]",
            #     'sql it zz'
            # ): (self.cmd_sql, ""),
            bot.register_command(
                '!sqlnl',
                None,
                9,
                self.clist,
                "db",
                "[query]",
                'sql it zz'
            ): (self.cmd_sql, "nl"),
            bot.register_command(
                '!addplayer',
                "!ap",
                5,
                self.clist,
                "egdl",
                "[name:vp:squadid]",
                'create/add new player to current league'
            ): (self.cmd_ap, ""),
            bot.register_command(
                '!changeplayer',
                "!cp",
                5,
                self.clist,
                "egdl",
                "[name:vp:squadid]",
                'update existing player'
            ): (self.cmd_cp, ""),
            bot.register_command(
                '!deleteplayer',
                "!dp",
                5,
                self.clist,
                "egdl",
                "[name]",
                'update existing player'
            ): (self.cmd_dp, ""),
            bot.register_command(
                '!listsquads',
                "!ls",
                5,
                self.clist,
                "egdl",
                "",
                'list squads'
            ): (self.cmd_ls, ""),
            bot.register_command(
                '!listplayers',
                "!lp",
                5,
                self.clist,
                "egdl",
                "[squad]",
                'list squads'
            ): (self.cmd_lp, "")
        }
        self.level = logging.DEBUG
        self.timer_man = TimerManager.TimerManager()
        self.timer_man.set(.01, 1)
        self.timer_man.set(300, 2)
        self.chat = bot.add_chat("st4ff")

        formatter = logging.Formatter('%(message)s')
        handler = LoggingRemoteHandler(logging.DEBUG, bot, "Ratio")
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    @staticmethod
    def get_message_tuple(event):
        """
            this data will be used later in pretty printer
            when the result is to be printed back to ss
        """
        if event.command_type == MESSAGE_TYPE_PRIVATE:
            target = event.pname
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_REMOTE:
            target = event.pname
            mtype = MESSAGE_TYPE_PRIVATE
        elif event.command_type == MESSAGE_TYPE_FREQ:
            target = event.player.freq
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_CHAT:
            target = event.chat_no
            mtype = event.command_type
        else:
            target = None
            mtype = event.command_type

        return (mtype, target)

    @staticmethod
    def cmd_sql(ssbot, event, param):
        ssbot.send_reply(event, "Disabled")
        return 0
        # if len(event.arguments) >= 1:
        #     if param and param == "nl":  # automatically addlimit or not
        #         limit = ""
        #     else:
        #         limit = " limit 100"
        #     mt = self.get_message_tuple(event)
        #     db = self._db
        #     db.query(event.arguments_after[0] + limit, None, mt)

    def cmd_ap(self, ssbot, event, param):
        if len(event.arguments) >= 1:
            mt = self.get_message_tuple(event)
            db = self._db
            q = """insert into egdl_players
            (userid, name, ip, machineid, vp, status, squad_id)
             values (0, %s, 0, 0, %s, 0, %s)
             """
            t = event.arguments_after[0].split(":")
            if len(t) != 3:
                ssbot.send_reply(event, "Could not parse 3 items")
            else:
                # print t
                db.query(q, (t[0], t[1], t[2]), mt)

    def cmd_cp(self, ssbot, event, param):
        mt = self.get_message_tuple(event)
        db = self._db
        q = "update egdl_players p set p.vp=%s, p.squad_id=%s where p.name=%s"
        t = event.arguments_after[0].split(":")
        if len(t) != 3:
            ssbot.send_reply(event, "Could not parse 3 items")
        else:
            # print t
            db.query(q, (t[1], t[2], t[0]), mt)

    def cmd_dp(self, ssbot, event, param):
        if len(event.arguments) >= 1:
            mt = self.get_message_tuple(event)
            db = self._db
            db.query(
                "delete from egdl_players where name=%s", (
                    event.arguments_after[0], ), mt
            )

    def cmd_ls(self, ssbot, event, param):
        mt = self.get_message_tuple(event)
        db = self._db
        db.query("Select s.* from egdl_squads s limit 100", None, mt)

    def cmd_lp(self, ssbot, event, param):
        if len(event.arguments) >= 1:
            mt = self.get_message_tuple(event)
            db = self._db
            db.query(
                "Select s.name, p.* from egdl_players p, egdl_squads s "
                "where s.name=%s and s.id=p.squad_id limit 100", (
                    event.arguments_after[0], ), mt
            )

    def handle_events(self, ssbot, event):
        if event.type == EVENT_COMMAND:
            if event.command.id in self.commands:
                c = self.commands[event.command.id]
                c[0](ssbot, event, c[1])

        elif event.type == EVENT_TICK:
            timer_expired = self.timer_man.getExpired()  # a timer expired
            # self.logger.info("tick")
            if timer_expired:
                # self.logger.info("timer expired")

                if timer_expired.data == 1:
                    # self.logger.info("1")
                    r = self._db.getResults()
                    if r:  # most of the time this will be None so check first
                        self.HandleResults(ssbot, event, r)
                    self.timer_man.set(1, 1)  # set it to check again in a sec
                elif timer_expired.data == 2:
                    # self.logger.info("2")
                    self._db.ping()
                    self.timer_man.set(300, 2)

    def HandleResults(self, ssbot, event, r):
        # message like connection error or connected
        if r.getType() == AElement.TYPE_MESSAGE:
            self.logger.info(r.message)
        else:
            r.GenericResultPrettyPrinter(
                ssbot, r.query.data[0], r.query.data[1])

    def cleanup(self):
        self._db.cleanUp()
Пример #3
0
class Bot(BotInterface):
	def __init__(self, bot, md):
		BotInterface.__init__( self, bot, md)
		bot.registerModuleInfo(__name__,"MysqLtest","The Junky","mysqlclient for ss",".01")
		self._db = Amysql(self.logger)
		self._db.setDbCredentialsFromFile(self.module_path + R"/db.conf","db")
		#self._db.setDbCredentialsFromFile(self.module_path + R"/egnetdb.conf","db")
		self._db.start()
		self.clist = [COMMAND_TYPE_PUBLIC,COMMAND_TYPE_TEAM,COMMAND_TYPE_FREQ,COMMAND_TYPE_PRIVATE,COMMAND_TYPE_CHAT]
		self._sql_command_id = bot.registerCommand('!sql',None,9,self.clist,"web","[query]" , 'sql it zz')
		self._sqlnl_command_id = bot.registerCommand('!sqlnl',None,9,self.clist,"web","[query]" , 'sql it zz')
		self.level = logging.DEBUG
		self.timer_man = TimerManager.TimerManager()
		self.timer_man.set(.01, 1)
		self.timer_man.set(300, 2)
		self.chat = bot.addChat("st4ff")
		
		formatter = logging.Formatter('%(message)s')
		handler = loggingRemoteHandler(logging.DEBUG,bot,"Ratio")
		handler.setFormatter(formatter)
		self.logger.addHandler(handler)
	
	def getMessageTuple(self,event):
		"""
			this data will be used later in pretty printer
			when the result is to be printed back to ss
		"""
		if event.command_type == MESSAGE_TYPE_PRIVATE:
			target = event.pname
			mtype = event.command_type
		elif event.command_type == MESSAGE_TYPE_REMOTE:
			target = event.pname
			mtype = MESSAGE_TYPE_PRIVATE
		elif event.command_type == MESSAGE_TYPE_FREQ:
			target = event.player.freq
			mtype = event.command_type
		elif event.command_type == MESSAGE_TYPE_CHAT:
			target = event.chat_no
			mtype = event.command_type
		else:
			target = None
			mtype = event.command_type
		
		return (mtype,target)
	
	def HandleEvents(self,ssbot,event):
		
		if event.type == EVENT_COMMAND:
			ssbot.sendLvzObjectToggle(event.pname,[(76,True)])
			ssbot.sendReply("76 on")
			if event.command.id in [self._sql_command_id,self._sqlnl_command_id]:
				
				if event.command.id == self._sql_command_id: #automatically addlimit or not
					limit = " limit 100"
				else:
					limit = ""
				
				mt = self.getMessageTuple(event)
				
				db = self._db
				db.query(event.arguments_after[0] + limit , None, mt) 

		elif event.type == EVENT_TICK:
			timer_expired = self.timer_man.getExpired() # a timer expired
			#self.logger.info("tick")
			if timer_expired:
				#self.logger.info("timer expired")
				
				if timer_expired.data == 1:
					#self.logger.info("1")
					r = self._db.getResults()
					if r:# most of the time this will be None so check first
						self.HandleResults(ssbot,event,r)
					self.timer_man.set(1, 1) #set it to check again in a sec
				elif timer_expired.data == 2:
					#self.logger.info("2")
					self._db.ping()
					self.timer_man.set(300, 2)

	def HandleResults(self,ssbot,event,r):
		if r.getType() == AElement.TYPE_MESSAGE: #message like connection error or connected
			self.logger.info(r.message)
		else: 
			r.GenericResultPrettyPrinter(ssbot,r.query.data[0],r.query.data[1])
		
	def Cleanup(self):
		pass
Пример #4
0
class Bot(BotInterface):
    def __init__(self, bot, md):
        BotInterface.__init__(self, bot, md)
        bot.register_module_info(__name__, "MysqLtest", "The Junky",
                                 "mysqlclient for ss", ".01")
        self._db = Amysql(self.logger)
        # self._db.setDbCredentialsFromFile(
        #   self.module_path + R"/db.conf", "db")
        self._db.setDbCredentialsFromFile(self.module_path + R"/egnetdb.conf",
                                          "db")
        self._db.start()
        self.clist = [
            COMMAND_TYPE_PUBLIC, COMMAND_TYPE_TEAM, COMMAND_TYPE_FREQ,
            COMMAND_TYPE_PRIVATE, COMMAND_TYPE_CHAT
        ]
        self._sql_command_id = bot.register_command('!sql', None, 9,
                                                    self.clist, "web",
                                                    "[query]", 'sql it zz')
        self._sqlnl_command_id = bot.register_command('!sqlnl', None, 9,
                                                      self.clist, "web",
                                                      "[query]", 'sql it zz')
        self.level = logging.DEBUG
        self.timer_man = TimerManager.TimerManager()
        self.timer_man.set(.01, 1)
        self.timer_man.set(300, 2)
        self.chat = bot.add_chat("st4ff")

        formatter = logging.Formatter('%(message)s')
        handler = LoggingRemoteHandler(logging.DEBUG, bot, "Ratio")
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    @staticmethod
    def getMessageTuple(event):
        """
            this data will be used later in pretty printer
            when the result is to be printed back to ss
        """
        if event.command_type == MESSAGE_TYPE_PRIVATE:
            target = event.pname
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_REMOTE:
            target = event.pname
            mtype = MESSAGE_TYPE_PRIVATE
        elif event.command_type == MESSAGE_TYPE_FREQ:
            target = event.player.freq
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_CHAT:
            target = event.chat_no
            mtype = event.command_type
        else:
            target = None
            mtype = event.command_type

        return (mtype, target)

    def handle_events(self, ssbot, event):

        if event.type == EVENT_COMMAND:
            if event.command.id in [
                    self._sql_command_id, self._sqlnl_command_id
            ]:

                # automatically addlimit or not
                limit = ""
                if event.command.id == self._sql_command_id:
                    limit = " limit 100"

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(event.arguments_after[0] + limit, None, mt)

        elif event.type == EVENT_TICK:
            timer_expired = self.timer_man.getExpired()  # a timer expired
            # self.logger.info("tick")
            if timer_expired:
                # self.logger.info("timer expired")

                if timer_expired.data == 1:
                    # self.logger.info("1")
                    r = self._db.getResults()
                    if r:  # most of the time this will be None so check first
                        self.HandleResults(ssbot, event, r)
                    self.timer_man.set(1, 1)  # set it to check again in a sec
                elif timer_expired.data == 2:
                    # self.logger.info("2")
                    self._db.ping()
                    self.timer_man.set(300, 2)

    def HandleResults(self, ssbot, event, r):
        # message like connection error or connected
        if r.getType() == AElement.TYPE_MESSAGE:
            self.logger.info(r.message)
        else:
            r.GenericResultPrettyPrinter(ssbot, r.query.data[0],
                                         r.query.data[1])

    def cleanup(self):
        pass
Пример #5
0
class Bot(BotInterface):
    def __init__(self, bot, md):
        BotInterface.__init__(self, bot, md)
        bot.register_module_info(__name__, "stats", "The Junky",
                                 "Stats Retrieval Module", ".01")
        self._db = Amysql(self.logger)
        self._db.setDbCredentialsFromFile(self.module_path + R"/statsdb.conf",
                                          "db")
        self._db.start()
        # self.clist = [COMMAND_TYPE_PUBLIC, COMMAND_TYPE_TEAM,
        #   COMMAND_TYPE_FREQ, COMMAND_TYPE_PRIVATE, COMMAND_TYPE_CHAT]
        self.clist = [COMMAND_TYPE_PRIVATE]
        # self._sql_command_id = bot.register_command(
        #   '!sql', None, 9, self.clist, "web", "[query]", 'sql it zz')
        # self._sqlnl_command_id = bot.register_command(
        #   '!sqlnl', None, 9, self.clist, "web", "[query]", 'sql it zz')
        self._last_jp = bot.register_command('!jackpots', None, 0, self.clist,
                                             "Stats", "", 'last jackpots won')
        self._recs = bot.register_command('!recs', None, 0, self.clist,
                                          "Stats", "[reset id]", 'top ratios')
        self._points = bot.register_command('!points', None, 0, self.clist,
                                            "Stats", "[reset id]",
                                            'Top points')
        self._squads = bot.register_command('!squads', None, 0, self.clist,
                                            "Stats", "[reset id]",
                                            'top squads')
        self._resets = bot.register_command('!resets', None, 0, self.clist,
                                            "Stats", "", 'recentreset ids')
        self.level = logging.DEBUG
        self.timer_man = TimerManager.TimerManager()
        self.timer_man.set(.01, 1)
        self.timer_man.set(300, 2)
        self.chat = bot.add_chat("st4ff")
        self.cache = {
            # !cmd: (Cached_result, time)
            "!jackpots": (None, 0, "jackpots.txt"),
            "!recs": (None, 0, "recs.txt"),
            "!points": (None, 0, "points.txt"),
            "!squads": (None, 0, "squads.txt")
        }

        formatter = logging.Formatter('%(message)s')
        handler = LoggingRemoteHandler(logging.DEBUG, bot, "Ratio")
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    def getMessageTuple(self, event):
        """
            this data will be used later in pretty printer
            when the result is to be printed back to ss
        """
        if event.command_type == MESSAGE_TYPE_PRIVATE:
            target = event.pname
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_REMOTE:
            target = event.pname
            mtype = MESSAGE_TYPE_PRIVATE
        elif event.command_type == MESSAGE_TYPE_FREQ:
            target = event.player.freq
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_CHAT:
            target = event.chat_no
            mtype = event.command_type
        else:
            target = None
            mtype = event.command_type

        return (mtype, target, event.command.name)

    def getResetId(self, event):
        if len(event.arguments) > 0:
            try:
                r = int(event.arguments[0])
                if r < 0:
                    return None
                return r
            except ValueError:
                return None
            return None

    def handle_events(self, ssbot, event):

        if event.type == EVENT_COMMAND:
            # if event.command.id in [
            #         self._sql_command_id, self._sqlnl_command_id]:
            #     automatically addlimit or not
            #     if event.command.id == self._sql_command_id:
            #         limit = " limit 100"
            #     else:
            #         limit = ""
            #     mt = self.get_message_tuple(event)
            #     db = self._db
            #     db.query(event.arguments_after[0] + limit, None, mt)
            if event.command.id == self._last_jp:
                q = """SELECT
                        id,
                        IF(
                            jackpot > 1000000,
                            concat(round(jackpot / 1000000, 1), "mil"),
                            concat(round(jackpot/1000, 1), "K")
                        ) AS jp,
                        IF(
                            winning_freq < 100,
                            winning_freq,
                            "Priv"
                        ) AS freq,
                        timediff(end_time, start_time) AS runtime
                    FROM flag_games
                    WHERE to_days(now()) - to_days(end_time) < 1
                    ORDER BY jackpot DESC
                    LIMIT 5"""

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._points:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                        player.name AS pname,
                        squad.name AS squad,
                        flag_points + kill_points AS points
                    FROM %s ps, player, squad
                    WHERE
                        ps.player_id = player.id
                        AND ps.squad_id = squad.id %s
                    ORDER BY points DESC
                    LIMIT 10""" % (ps, rs)
                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)

            elif event.command.id == self._resets:
                q = "select * from reset order by id desc limit 10"

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._recs:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                        a.player_id,
                        b.name,
                        GetRating(a.Wins, a.Losses) AS `value`,
                        a.Wins,
                        a.Losses
                    FROM %s a, player b
                    WHERE
                        a.Wins > 50
                        AND a.player_id = b.id %s
                        AND STRCMP(LEFT(b.name, 4), "Bot-")
                        AND STRCMP(LEFT(b.name, 7), "DevBot-")
                    ORDER BY value DESC
                    LIMIT 5""" % (ps, rs)

                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
            elif event.command.id == self._squads:
                reset_id = self.getResetId(event)
                if reset_id:
                    ps = " pub_stats_arch"
                    rs = " and reset_id=" + str(reset_id) + " "
                else:
                    ps = " pub_stats"
                    rs = ""
                q = """SELECT
                    s.name AS squadname,
                    GetTopAvg(0, s.id, 10) AS Avg,
                    count(squad_id) AS members
                    FROM squad s, %s ps
                    WHERE
                        squad_id <> 1
                        AND s.id = ps.squad_id %s
                    GROUP BY squad_id HAVING members >= 10
                    ORDER BY Avg DESC
                    LIMIT 10""" % (ps, rs)
                mt = self.getMessageTuple(event)

                db = self._db
                db.query(q, None, mt)
        elif event.type == EVENT_TICK:
            timer_expired = self.timer_man.getExpired()  # a timer expired
            # self.logger.info("tick")
            if timer_expired:
                # self.logger.info("timer expired")

                if timer_expired.data == 1:
                    # self.logger.info("1")
                    r = self._db.getResults()
                    if r:  # most of the time this will be None so check first
                        self.HandleResults(ssbot, event, r)
                    self.timer_man.set(1, 1)  # set it to check again in a sec
                elif timer_expired.data == 2:
                    # self.logger.info("2")
                    self._db.ping()
                    self.timer_man.set(300, 2)

    def HtmlResultWriter(self, result, filename):
        """
        this function will print any result nicely on screen with
        proper formatting
        """
        f = open(filename, 'w')

        if self.rows is None or len(self.rows) == 0:
            pass
        else:
            if not self.description:
                f.write("#### NO RESULTS ###")
            else:
                names = []
                lengths = []

                for dd in self.description:  # iterate over description
                    names.append(dd[0])
                    # in case name is bigger then max len of data
                    lengths.append(len(dd[0]))

                for row in self.rows:  # get the max length of each column
                    for i in range(len(row)):
                        lengths[i] = max(lengths[i], len(str(row[i])))
                tb = "-" * (sum(map(int, lengths)) + (len(lengths) * 3) + 1)
                fm = "|"
                for col in lengths:  # make the format string
                    fm += " %" + str(col) + "s |"
                f.write(tb)
                f.write((fm % tuple(names)))
                f.write(tb)

                for row in self.rows:  # output the rows
                    f.write((fm % row))
                f.write(tb)
                f.close()

    def HandleResults(self, ssbot, event, r):
        # message like connection error or connected
        if r.getType() == AElement.TYPE_MESSAGE:
            self.logger.info(r.message)
        else:
            # if r.query.data[2] in self.cache:
            #     self.cache[r.query.data[2]] = (
            #       copy.copy(r), get_tick_count_hs())
            r.GenericResultPrettyPrinter(ssbot, r.query.data[0],
                                         r.query.data[1])

    def cleanup(self):
        self._db.CleanUp()
Пример #6
0
class Bot(BotInterface):
	def __init__(self, bot, md):
		BotInterface.__init__( self, bot, md)
		bot.registerModuleInfo(__name__,"Population Monitoring/Logger","The Junky","logs some pop stats to chart later",".001")
		self._db = Amysql(self.logger)
		self._db.setDbCredentialsFromFile(self.module_path + R"/popmon.conf","db")
		self._db.start()
		self.clist = [COMMAND_TYPE_PUBLIC,COMMAND_TYPE_TEAM,COMMAND_TYPE_FREQ,COMMAND_TYPE_PRIVATE,COMMAND_TYPE_CHAT]
		self.CID_SP = bot.registerCommand('!showpop',"!sp",2,self.clist,"Pop","limit" , 'show last x entries')
		self.CID_SPG = bot.registerCommand('!showpopgraph',"!spg",2,self.clist,"Pop","" , 'graph last 70 pop entries')
		self.level = logging.DEBUG
		

		self.chat = bot.addChat("st4ff")
		self.QTYPE_SQL=1
		self.QTYPE_SPG=2
		self.QTYPE_ADDPOP=3
		
		self.timer_man = TimerManager.TimerManager()
		
		self.TID_CHECK_RESULTS=1
		self.TID_PING_DB=2
		self.TID_PARSE_STATS=3
		self.TID_LOG_STATS=4
		
		self.timer_man.set(.01, self.TID_CHECK_RESULTS)
		self.timer_man.set(300, self.TID_PING_DB)
		self.timer_man.set(30, self.TID_PARSE_STATS)
		
		
		formatter = logging.Formatter('%(message)s')
		handler = loggingPublicHandler(logging.DEBUG,bot,"*bot")
		handler.setFormatter(formatter)
		self.logger.addHandler(handler)
		#gayness because of master bot doesnt auto load all the other classes in the file int ts context	
		
		try: #if running in stand alone
			self.popStats = PopStats()
		except NameError:
			self.popStats = md.module.PopStats()
		
				
	
	def getMessageTuple(self,event):
		"""
			this data will be used later in pretty printer
			when the result is to be printed back to ss
		"""
		if event.command_type == MESSAGE_TYPE_PRIVATE:
			target = event.pname
			mtype = event.command_type
		elif event.command_type == MESSAGE_TYPE_REMOTE:
			target = event.pname
			mtype = MESSAGE_TYPE_PRIVATE
		elif event.command_type == MESSAGE_TYPE_FREQ:
			target = event.player.freq
			mtype = event.command_type
		elif event.command_type == MESSAGE_TYPE_CHAT:
			target = event.chat_no
			mtype = event.command_type
		else:
			target = None
			mtype = event.command_type
		
		return (mtype,target)
	
	def ResultGraphPrinter(self,res,ssbot,mtype,target):
		"""
		this function will print any result nicely on screen with proper formatting 
		"""
		ss = BotUtilities.SSmessenger(ssbot,mtype,target)
		if res.rows is None or len(res.rows) == 0:
			if res.error_msg:
				ss.sendMessage("Error: " + str(res.error_msg))
		else:
			if not res.description:
				ss.sendMessage("#### NO RESULTS ###")
			else:
				min = 9999
				max = 0
				total = 0
				count = 0
				for row in res.rows:
					pop = row[2]+row[4]+row[6]
					if min > pop:
						min = pop
					if max < pop:
						max = pop
					total += pop
					count+=1
				step = -7
				data_points = 0
				for i in range(140,0,step):
					txt = "%-3.3i|" % (i,)
					for row in res.rows:
						pop = row[2]+row[4]+row[6]
						if pop < i and pop >= (step+i):
							txt+= "+"
							data_points+=1			
						else:
							txt+= " "
						if i < min:
							break		
					if data_points:
						ss.sendMessage(txt)	
				ss.sendMessage("000|" + "-" * len(res.rows))
				ss.sendMessage("Max:%3i Min:%3i Avg:%3.2f" %(max,min,total/count))  
	def HandleEvents(self,ssbot,event):
		
		if event.type == EVENT_COMMAND:
			if event.command.id == self.CID_SPG:
				
				mt = self.getMessageTuple(event)
				#	(qtype,message type to respond with,target[playername if priv msg)
				qd = (self.QTYPE_SPG,mt[0],mt[1])
				db = self._db
				db.query("select * from (select * from eg_Bots.population order by id desc limit 70) as pop order by id asc"  , None, qd)
			if event.command.id == self.CID_SP:
				
				if len(event.arguments) > 0: #automatically addlimit or not
					try:
						l = int(event.arguments[0])
					except:
						l = 10
						LogException(self.logger)
					if l <= 100:
						limit = "limit " +str(l)
					else:
						limit = "limit 100"
				else:
					limit = "limit 10"
				
				mt = self.getMessageTuple(event)
				#	(qtype,message type to respond with,target[playername if priv msg)
				qd = (self.QTYPE_SQL,mt[0],mt[1])
				db = self._db
				db.query("select * from eg_Bots.population order by id desc " + limit , None, qd)	 
		if event.type == EVENT_MESSAGE:
			if event.message_type == MESSAGE_TYPE_SYSTEM:
				if event.message.find(" - Sysop - ") != -1:
					if event.message.startswith("DevBot") or event.message.startswith("Bot"):
						self.popStats.staff.bots+=1
					else:
						self.popStats.staff.sysops+=1;
				elif event.message.find(" - Mod - ") != -1:
					self.popStats.staff.mods+=1
				elif event.message.find(" - SMod - ") != -1:
					self.popStats.staff.smods+=1
		if event.type == EVENT_ARENA_LIST:
			for a in event.arena_list:
				#a (arena,pop,here)
				if a[0][0] >= '0' and a[0][0] <= '9':
					self.popStats.arenas.pubCount+=1
					self.popStats.arenas.pubPop+= a[1]
				elif a[0][0] == '#':
					self.popStats.arenas.privCount+=1
					self.popStats.arenas.privPop+= a[1]
				elif a[0].find(":") != -1:
					self.popStats.arenas.peerCount+=1
					self.popStats.arenas.peerPop+= a[1]	
				else:
					self.popStats.arenas.nonPubCount+=1
					self.popStats.arenas.nonPubPop+= a[1]
				self.popStats.pop += a[1]
										
		elif event.type == EVENT_TICK:
			timer_expired = self.timer_man.getExpired() # a timer expired
			if timer_expired:
				if timer_expired.data == self.TID_CHECK_RESULTS:#check for results
					r = self._db.getResults()
					if r:# most of the time this will be None so check first
						self.HandleResults(ssbot,event,r)
					self.timer_man.set(1, 1) #set it to check again in a sec
				elif timer_expired.data == self.TID_PING_DB:#ping db
					self._db.ping()
					self.timer_man.set(300, self.TID_PING_DB)
				elif timer_expired.data == self.TID_PARSE_STATS: # Clear stats and repopulate
					self.popStats.Reset()
					ssbot.sendPublicMessage("*listmod")
					ssbot.sendPublicMessage("?arena")
					self.timer_man.set(1800, self.TID_PARSE_STATS)# do it again in 30 mins
					self.timer_man.set(3, self.TID_LOG_STATS) #	in 10 secs pop stats will be done send it to db	
				elif timer_expired.data == self.TID_LOG_STATS: #put in db
					a = self.popStats.arenas
					s = self.popStats.staff
					query = "INSERT INTO eg_bots.Population (pubc,pubp,npubc,npubp,privc,privp,prc,prp,botsc,sysopsc,smodsc,modsc) VALUES (%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i,%i)"
					qtp = (a.pubCount,a.pubPop,a.nonPubCount,a.nonPubPop,a.privCount,a.privPop,a.peerCount,a.peerPop,s.bots,s.sysops,s.smods,s.mods)
					ssbot.sendPublicMessage(query % qtp)
					#		(qtype,message type to respond with,target[playername if priv msg)
					qdata = (self.QTYPE_ADDPOP,MESSAGE_TYPE_PUBLIC,None)
					db = self._db
					db.query(query % qtp , None, qdata)
					pass 


	def HandleResults(self,ssbot,event,r):
		if r.getType() == AElement.TYPE_MESSAGE: #message like connection error or connected
			self.logger.info(r.message)
		else:
			if r.query.data[0] == self.QTYPE_SQL:
				r.GenericResultPrettyPrinter(ssbot,r.query.data[1],r.query.data[2])
			if r.query.data[0] == self.QTYPE_SPG:
				self.ResultGraphPrinter(r,ssbot,r.query.data[1],r.query.data[2])
			elif r.query.data[0] == self.QTYPE_ADDPOP:
				pass
				#spews to pub only if there is a failure
				r.GenericResultPrettyPrinter(ssbot,r.query.data[1],r.query.data[2],True)
	def Cleanup(self):
		self._db.cleanUp()
Пример #7
0
class Bot(BotInterface):
    def __init__(self, bot, md):
        BotInterface.__init__(self, bot, md)
        bot.register_module_info(
            __name__,
            "Population Monitoring/Logger",
            "The Junky",
            "logs some pop stats to chart later",
            ".001"
        )
        self._db = Amysql(self.logger)
        self._db.setDbCredentialsFromFile(
            self.module_path + R"/popmon.conf", "db")
        self._db.start()
        self.clist = [
            COMMAND_TYPE_PUBLIC,
            COMMAND_TYPE_TEAM,
            COMMAND_TYPE_FREQ,
            COMMAND_TYPE_PRIVATE,
            COMMAND_TYPE_CHAT
        ]
        self.CID_SP = bot.register_command(
            '!showpop',
            "!sp",
            2,
            self.clist,
            "Pop",
            "limit",
            'show last x entries'
        )
        self.CID_SPG = bot.register_command(
            '!showpopgraph',
            "!spg",
            2,
            self.clist,
            "Pop",
            "",
            'graph last 70 pop entries'
        )
        self.level = logging.DEBUG

        self.chat = bot.add_chat("st4ff")
        self.QTYPE_SQL = 1
        self.QTYPE_SPG = 2
        self.QTYPE_ADDPOP = 3

        self.timer_man = TimerManager.TimerManager()

        self.TID_CHECK_RESULTS = 1
        self.TID_PING_DB = 2
        self.TID_PARSE_STATS = 3
        self.TID_LOG_STATS = 4

        self.timer_man.set(.01, self.TID_CHECK_RESULTS)
        self.timer_man.set(300, self.TID_PING_DB)
        self.timer_man.set(30, self.TID_PARSE_STATS)

        formatter = logging.Formatter('%(message)s')
        handler = LoggingPublicHandler(logging.DEBUG, bot, "*bot")
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)
        # gayness because of master bot doesnt auto load all the other
        # classes in the file int ts context

        try:  # if running in stand alone
            self.popStats = PopStats()
        except NameError:
            self.popStats = md.module.PopStats()

    def getMessageTuple(self, event):
        """
            this data will be used later in pretty printer
            when the result is to be printed back to ss
        """
        if event.command_type == MESSAGE_TYPE_PRIVATE:
            target = event.pname
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_REMOTE:
            target = event.pname
            mtype = MESSAGE_TYPE_PRIVATE
        elif event.command_type == MESSAGE_TYPE_FREQ:
            target = event.player.freq
            mtype = event.command_type
        elif event.command_type == MESSAGE_TYPE_CHAT:
            target = event.chat_no
            mtype = event.command_type
        else:
            target = None
            mtype = event.command_type

        return (mtype, target)

    def ResultGraphPrinter(self, res, ssbot, mtype, target):
        """
        this function will print any result nicely on screen
        with proper formatting
        """
        ss = SSmessenger(ssbot, mtype, target)
        if res.rows is None or len(res.rows) == 0:
            if res.error_msg:
                ss.send_message("Error: " + str(res.error_msg))
        else:
            if not res.description:
                ss.send_message("#### NO RESULTS ###")
            else:
                min = 9999
                max = 0
                total = 0
                count = 0
                for row in res.rows:
                    pop = row[2]+row[4]+row[6]
                    if min > pop:
                        min = pop
                    if max < pop:
                        max = pop
                    total += pop
                    count += 1
                step = -7
                data_points = 0
                for i in range(140, 0, step):
                    txt = "%-3.3i|" % (i, )
                    for row in res.rows:
                        pop = row[2]+row[4]+row[6]
                        if pop < i and pop >= (step+i):
                            txt += "+"
                            data_points += 1
                        else:
                            txt += " "
                        if i < min:
                            break
                    if data_points:
                        ss.send_message(txt)
                ss.send_message("000|" + "-" * len(res.rows))
                ss.send_message("Max:%3i Min:%3i Avg:%3.2f" %
                               (max, min, total/count))

    def handle_events(self, ssbot, event):

        if event.type == EVENT_COMMAND:
            if event.command.id == self.CID_SPG:

                mt = self.getMessageTuple(event)
                # (qtype, message type to respond with,
                # target[playername if priv msg)
                qd = (self.QTYPE_SPG, mt[0], mt[1])
                db = self._db
                db.query((
                    "select * from ("
                    "    select * from eg_Bots.population "
                    "    order by id desc limit 70) as pop "
                    "order by id asc"
                ), None, qd)
            if event.command.id == self.CID_SP:

                # automatically addlimit or not
                if len(event.arguments) > 0:
                    try:
                        l = int(event.arguments[0])
                    except:
                        l = 10
                        log_exception(self.logger)
                    if l <= 100:
                        limit = "limit " + str(l)
                    else:
                        limit = "limit 100"
                else:
                    limit = "limit 10"

                mt = self.getMessageTuple(event)
                # (qtype, message type to respond with,
                # target[playername if priv msg)
                qd = (self.QTYPE_SQL, mt[0], mt[1])
                db = self._db
                db.query(
                    "select * from eg_Bots.population order by id desc "
                    + limit, None, qd)
        if event.type == EVENT_MESSAGE:
            if event.message_type == MESSAGE_TYPE_SYSTEM:
                if event.message.find(" - Sysop - ") != -1:
                    if event.message.startswith("DevBot") or \
                            event.message.startswith("Bot"):
                        self.popStats.staff.bots += 1
                    else:
                        self.popStats.staff.sysops += 1
                elif event.message.find(" - Mod - ") != -1:
                    self.popStats.staff.mods += 1
                elif event.message.find(" - SMod - ") != -1:
                    self.popStats.staff.smods += 1
        if event.type == EVENT_ARENA_LIST:
            for a in event.arena_list:
                # a (arena, pop, here)
                if a[0][0] >= '0' and a[0][0] <= '9':
                    self.popStats.arenas.pubCount += 1
                    self.popStats.arenas.pubPop += a[1]
                elif a[0][0] == '#':
                    self.popStats.arenas.privCount += 1
                    self.popStats.arenas.privPop += a[1]
                elif a[0].find(":") != -1:
                    self.popStats.arenas.peerCount += 1
                    self.popStats.arenas.peerPop += a[1]
                else:
                    self.popStats.arenas.nonPubCount += 1
                    self.popStats.arenas.nonPubPop += a[1]
                self.popStats.pop += a[1]

        elif event.type == EVENT_TICK:
            timer_expired = self.timer_man.getExpired()  # a timer expired
            if timer_expired:
                # check for results
                if timer_expired.data == self.TID_CHECK_RESULTS:
                    r = self._db.getResults()

                    # most of the time this will be None so check first
                    if r:
                        self.HandleResults(ssbot, event, r)
                    # set it to check again in a sec
                    self.timer_man.set(1, 1)
                elif timer_expired.data == self.TID_PING_DB:  # ping db
                    self._db.ping()
                    self.timer_man.set(300, self.TID_PING_DB)
                # Clear stats and repopulate
                elif timer_expired.data == self.TID_PARSE_STATS:
                    self.popStats.Reset()
                    ssbot.send_public_message("*listmod")
                    ssbot.send_public_message("?arena")
                    # do it again in 30 mins
                    self.timer_man.set(1800, self.TID_PARSE_STATS)
                    # in 10 secs pop stats will be done send it to db
                    self.timer_man.set(3, self.TID_LOG_STATS)
                elif timer_expired.data == self.TID_LOG_STATS:  # put in db
                    a = self.popStats.arenas
                    s = self.popStats.staff
                    query = (
                        "INSERT INTO eg_bots.Population ("
                        "    pubc, pubp, npubc, npubp, privc, privp, prc, "
                        "    prp, botsc, sysopsc, smodsc, modsc"
                        ") VALUES ("
                        "    %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i"
                        ")"
                    )
                    qtp = (
                        a.pubCount,
                        a.pubPop,
                        a.nonPubCount,
                        a.nonPubPop,
                        a.privCount,
                        a.privPop,
                        a.peerCount,
                        a.peerPop,
                        s.bots,
                        s.sysops,
                        s.smods,
                        s.mods
                    )
                    ssbot.send_public_message(query % qtp)
                    # (qtype, message type to respond with,
                    # target[playername if priv msg)
                    qdata = (self.QTYPE_ADDPOP, MESSAGE_TYPE_PUBLIC, None)
                    db = self._db
                    db.query(query % qtp, None, qdata)
                    pass

    def HandleResults(self, ssbot, event, r):
        # message like connection error or connected
        if r.getType() == AElement.TYPE_MESSAGE:
            self.logger.info(r.message)
        else:
            if r.query.data[0] == self.QTYPE_SQL:
                r.GenericResultPrettyPrinter(
                    ssbot, r.query.data[1], r.query.data[2])
            if r.query.data[0] == self.QTYPE_SPG:
                self.ResultGraphPrinter(
                    r, ssbot, r.query.data[1], r.query.data[2])
            elif r.query.data[0] == self.QTYPE_ADDPOP:
                pass
                # spews to pub only if there is a failure
                r.GenericResultPrettyPrinter(
                    ssbot, r.query.data[1], r.query.data[2], True)

    def cleanup(self):
        self._db.cleanUp()