def format_lines(self, value): if value is None: return lines = [] extra = {'server_name': self.name} for line in value: lines.append(encode(self.format(line, extra))) return lines
def format_lines(self, value): if value is None: return lines = [] extra = {'server_name' : self.name} for line in value: lines.append(encode(self.format(line, extra))) return lines
def update_format(self): """ Called when the map (or other variables) have been updated """ config = self.config self.name = encode(self.format(config.get('name', 'pyspades server %s' % random.randrange(0, 2000)))) self.motd = self.format_lines(config.get('motd', None)) self.help = self.format_lines(config.get('help', None)) self.tips = self.format_lines(config.get('tips', None)) self.rules = self.format_lines(config.get('rules', None)) if self.master_connection is not None: self.master_connection.send_server()
def privmsg(self, user, channel, msg): if user in self.ops or user in self.voices: prefix = '@' if user in self.ops else '+' alias = self.factory.aliases.get(user, user) if msg.startswith(self.factory.commandprefix) and user in self.ops: self.unaliased_name = user self.name = prefix + alias input = msg[len(self.factory.commandprefix):] result = commands.handle_input(self, input) if result is not None: self.send("%s: %s" % (user, result)) elif msg.startswith(self.factory.chatprefix): max_len = MAX_IRC_CHAT_SIZE - len(self.protocol.server_prefix) - 1 msg = msg[len(self.factory.chatprefix):].strip() message = ("<%s> %s" % (prefix + alias, msg))[:max_len] message = message.decode('cp1252') print message.encode('ascii', 'replace') self.factory.server.send_chat(encode(message))
def privmsg(self, user, channel, msg): if (user in self.owners or user in self.admins or user in self.moderators or user in self.guards or user in self.voices): if user in self.owners: prefix = '~' user_type = 'admin' elif user in self.admins: prefix = '&' user_type = 'admin' elif user in self.moderators: prefix = '@' user_type = 'moderator' elif user in self.guards: prefix = '%' user_type = 'guard' else: prefix = '+' user_type = 'none' alias = self.factory.aliases.get(user, user) if msg.startswith(self.factory.commandprefix) and ( user in self.owners or user in self.admins or user in self.moderators or user in self.guards): self.unaliased_name = user self.name = prefix + alias input = msg[len(self.factory.commandprefix):] rights = self.rights self.rights = AttributeSet() self.rights.update(commands.rights.get(user_type, ())) self.rights.update(commands.rights.get('irc', ())) result = commands.handle_input(self, input) self.rights = rights if result is not None: self.send("%s: %s" % (user, result)) elif msg.startswith(self.factory.chatprefix): max_len = MAX_IRC_CHAT_SIZE - len(self.protocol.server_prefix) - 1 msg = msg[len(self.factory.chatprefix):].strip() message = ("<%s> %s" % (prefix + alias, msg))[:max_len] message = message.decode('cp1252') print message.encode('ascii', 'replace') self.factory.server.send_chat(encode(message))
def __init__(self, interface, config): self.config = config if config.get('random_rotation', False): self.map_rotator_type = random_choice_cycle else: self.map_rotator_type = itertools.cycle self.default_time_limit = config.get('default_time_limit', 20.0) self.default_cap_limit = config.get('cap_limit', 10.0) self.advance_on_win = int(config.get('advance_on_win', False)) self.win_count = itertools.count(1) self.bans = NetworkDict() try: self.bans.read_list(json.load(open('bans.txt', 'rb'))) except IOError: pass self.hard_bans = set() # possible DDoS'ers are added here self.player_memory = deque(maxlen = 100) self.config = config if len(self.name) > MAX_SERVER_NAME_SIZE: print '(server name too long; it will be truncated to "%s")' % ( self.name[:MAX_SERVER_NAME_SIZE]) self.respawn_time = config.get('respawn_time', 8) self.respawn_waves = config.get('respawn_waves', False) game_mode = config.get('game_mode', 'ctf') if game_mode == 'ctf': self.game_mode = CTF_MODE elif game_mode == 'tc': self.game_mode = TC_MODE elif self.game_mode is None: raise NotImplementedError('invalid game mode: %s' % game_mode) self.game_mode_name = game_mode team1 = config.get('team1', {}) team2 = config.get('team2', {}) self.team1_name = team1.get('name', 'Blue') self.team2_name = team2.get('name', 'Green') self.team1_color = tuple(team1.get('color', (0, 0, 196))) self.team2_color = tuple(team2.get('color', (0, 196, 0))) self.friendly_fire = config.get('friendly_fire', True) self.friendly_fire_time = config.get('grief_friendly_fire_time', 2.0) self.spade_teamkills_on_grief = config.get('spade_teamkills_on_grief', False) self.fall_damage = config.get('fall_damage', True) self.teamswitch_interval = config.get('teamswitch_interval', 0) self.max_players = config.get('max_players', 20) self.melee_damage = config.get('melee_damage', 100) self.max_connections_per_ip = config.get('max_connections_per_ip', 0) self.passwords = config.get('passwords', {}) self.server_prefix = encode(config.get('server_prefix', '[*]')) self.time_announcements = config.get('time_announcements', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 60, 120, 180, 240, 300, 600, 900, 1200, 1800, 2400, 3000]) self.balanced_teams = config.get('balanced_teams', None) self.login_retries = config.get('login_retries', 1) # voting configuration self.default_ban_time = config.get('default_ban_duration', 24*60) self.speedhack_detect = config.get('speedhack_detect', True) if config.get('user_blocks_only', False): self.user_blocks = set() self.set_god_build = config.get('set_god_build', False) self.debug_log = config.get('debug_log', False) if self.debug_log: pyspades.debug.open_debug_log() ssh = config.get('ssh', {}) if ssh.get('enabled', False): from ssh import RemoteConsole self.remote_console = RemoteConsole(self, ssh) irc = config.get('irc', {}) if irc.get('enabled', False): from irc import IRCRelay self.irc_relay = IRCRelay(self, irc) status = config.get('status_server', {}) if status.get('enabled', False): from statusserver import StatusServerFactory self.status_server = StatusServerFactory(self, status) publish = config.get('ban_publish', {}) if publish.get('enabled', False): from banpublish import PublishServer self.ban_publish = PublishServer(self, publish) ban_subscribe = config.get('ban_subscribe', {}) if ban_subscribe.get('enabled', True): import bansubscribe self.ban_manager = bansubscribe.BanManager(self, ban_subscribe) logfile = config.get('logfile', None) if logfile is not None and logfile.strip(): if config.get('rotate_daily', False): create_filename_path(logfile) logging_file = DailyLogFile(logfile, '.') else: logging_file = open_create(logfile, 'a') log.addObserver(log.FileLogObserver(logging_file).emit) log.msg('pyspades server started on %s' % time.strftime('%c')) log.startLogging(sys.stdout) # force twisted logging self.start_time = reactor.seconds() self.end_calls = [] self.console = create_console(self) for password in self.passwords.get('admin', []): if password == 'replaceme': print 'REMEMBER TO CHANGE THE DEFAULT ADMINISTRATOR PASSWORD!' elif not password: self.everyone_is_admin = True for user_type, func_names in config.get('rights', {}).iteritems(): for func_name in func_names: commands.add_rights(func_name, user_type) port = self.port = config.get('port', 32887) ServerProtocol.__init__(self, port, interface) self.host.receiveCallback = self.receive_callback ret = self.set_map_rotation(config['maps']) if not ret: print 'Invalid map in map rotation (%s), exiting.' % ret.map raise SystemExit self.update_format() self.tip_frequency = config.get('tip_frequency', 0) if self.tips is not None and self.tip_frequency > 0: reactor.callLater(self.tip_frequency * 60, self.send_tip) self.master = config.get('master', True) self.set_master() get_external_ip(config.get('network_interface', '')).addCallback( self.got_external_ip)
def encode_lines(value): if value is not None: lines = [] for line in value: lines.append(encode(line)) return lines
def __init__(self, interface, config): self.config = config if config.get('random_rotation', False): self.map_rotator_type = random_choice_cycle else: self.map_rotator_type = itertools.cycle self.default_time_limit = config.get('default_time_limit', 20.0) self.default_cap_limit = config.get('cap_limit', 10.0) self.advance_on_win = int(config.get('advance_on_win', False)) self.win_count = itertools.count(1) self.bans = NetworkDict() try: self.bans.read_list(json.load(open('bans.txt', 'rb'))) except IOError: pass self.hard_bans = set() # possible DDoS'ers are added here self.player_memory = deque(maxlen=100) self.config = config if len(self.name) > MAX_SERVER_NAME_SIZE: print '(server name too long; it will be truncated to "%s")' % ( self.name[:MAX_SERVER_NAME_SIZE]) self.respawn_time = config.get('respawn_time', 8) self.respawn_waves = config.get('respawn_waves', False) game_mode = config.get('game_mode', 'ctf') if game_mode == 'ctf': self.game_mode = CTF_MODE elif game_mode == 'tc': self.game_mode = TC_MODE elif self.game_mode is None: raise NotImplementedError('invalid game mode: %s' % game_mode) self.game_mode_name = game_mode team1 = config.get('team1', {}) team2 = config.get('team2', {}) self.team1_name = team1.get('name', 'Blue') self.team2_name = team2.get('name', 'Green') self.team1_color = tuple(team1.get('color', (0, 0, 196))) self.team2_color = tuple(team2.get('color', (0, 196, 0))) self.friendly_fire = config.get('friendly_fire', True) self.friendly_fire_time = config.get('grief_friendly_fire_time', 2.0) self.spade_teamkills_on_grief = config.get('spade_teamkills_on_grief', False) self.fall_damage = config.get('fall_damage', True) self.teamswitch_interval = config.get('teamswitch_interval', 0) self.max_players = config.get('max_players', 20) self.melee_damage = config.get('melee_damage', 100) self.max_connections_per_ip = config.get('max_connections_per_ip', 0) self.passwords = config.get('passwords', {}) self.server_prefix = encode(config.get('server_prefix', '[*]')) self.time_announcements = config.get('time_announcements', [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 60, 120, 180, 240, 300, 600, 900, 1200, 1800, 2400, 3000 ]) self.balanced_teams = config.get('balanced_teams', None) self.login_retries = config.get('login_retries', 1) # voting configuration self.default_ban_time = config.get('default_ban_duration', 24 * 60) self.speedhack_detect = config.get('speedhack_detect', True) if config.get('user_blocks_only', False): self.user_blocks = set() self.set_god_build = config.get('set_god_build', False) self.debug_log = config.get('debug_log', False) if self.debug_log: pyspades.debug.open_debug_log() ssh = config.get('ssh', {}) if ssh.get('enabled', False): from ssh import RemoteConsole self.remote_console = RemoteConsole(self, ssh) irc = config.get('irc', {}) if irc.get('enabled', False): from irc import IRCRelay self.irc_relay = IRCRelay(self, irc) status = config.get('status_server', {}) if status.get('enabled', False): from statusserver import StatusServerFactory self.status_server = StatusServerFactory(self, status) publish = config.get('ban_publish', {}) if publish.get('enabled', False): from banpublish import PublishServer self.ban_publish = PublishServer(self, publish) ban_subscribe = config.get('ban_subscribe', {}) if ban_subscribe.get('enabled', True): import bansubscribe self.ban_manager = bansubscribe.BanManager(self, ban_subscribe) logfile = config.get('logfile', None) if logfile is not None and logfile.strip(): if config.get('rotate_daily', False): create_filename_path(logfile) logging_file = DailyLogFile(logfile, '.') else: logging_file = open_create(logfile, 'a') log.addObserver(log.FileLogObserver(logging_file).emit) log.msg('pyspades server started on %s' % time.strftime('%c')) log.startLogging(sys.stdout) # force twisted logging self.start_time = reactor.seconds() self.end_calls = [] self.console = create_console(self) for password in self.passwords.get('admin', []): if password == 'replaceme': print 'REMEMBER TO CHANGE THE DEFAULT ADMINISTRATOR PASSWORD!' elif not password: self.everyone_is_admin = True for user_type, func_names in config.get('rights', {}).iteritems(): for func_name in func_names: commands.add_rights(func_name, user_type) port = self.port = config.get('port', 32887) ServerProtocol.__init__(self, port, interface) self.host.receiveCallback = self.receive_callback ret = self.set_map_rotation(config['maps']) if not ret: print 'Invalid map in map rotation (%s), exiting.' % ret.map raise SystemExit self.update_format() self.tip_frequency = config.get('tip_frequency', 0) if self.tips is not None and self.tip_frequency > 0: reactor.callLater(self.tip_frequency * 60, self.send_tip) self.master = config.get('master', True) self.set_master() get_external_ip(config.get('network_interface', '')).addCallback(self.got_external_ip)
def encode_lines(value): if value is not None: return [encode(line) for line in value]