Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from jabberbot import JabberBot, botcmd
- import datetime
- import random
- class MafiaJabberBot(JabberBot):
- def clear(self):
- self.vvotes = {}
- self.votel = []
- self.admin = "inviz"
- self.players = []
- self.died = []
- self.started = False
- self.day = True
- self.dead = ""
- def get_mafia_count(self):
- return max(1, int(round(len(self.players) / 4.5)))
- def give_roles(self):
- # constants
- need = 4
- roles = ['mafia' for i in xrange(self.get_mafia_count())]
- #roles.append('blumen')
- if len(self.players) < need:
- return False
- random.shuffle(self.players)
- role = 0
- for player in self.players:
- if role == len(roles):
- player['role'] = 'human'
- else:
- player['role'] = roles[role]
- role += 1
- random.shuffle(self.players)
- return True
- def is_player(self, name):
- for player in self.players:
- if player['user'] == name:
- return True
- return False
- def check_win(self):
- bad = 0
- solution = ""
- for player in self.players:
- if player['role'] == 'mafia' and not player['died']:
- bad += 1
- solution += player['user'] + " — "
- if player['role'] == 'mafia':
- solution += 'Мафия'
- elif player['role'] == 'human':
- solution += 'Гражданин'
- elif player['role'] == 'blumen':
- solution += 'Мартин Блюмен'
- else:
- solution += 'Наблюдатель'
- solution += "\n"
- if bad == 0:
- self.send_all("Игра окончена!\nПобеду одержали мирные жители!\n" + solution)
- self.clear()
- return True
- elif bad >= len(self.players) - len(self.died) - 1:
- self.send_all("Игра окончена!\nПобеду одержала мафия!\n" + solution)
- self.clear()
- return True
- return False
- def next_state(self):
- self.day = not self.day
- if self.day:
- self.send_all("Начался день. Сегодня ночью убили: " + self.dead + ".")
- if not self.check_win():
- return "Вы убили: " + self.dead + "."
- else:
- self.vvotes = {}
- self.votel = []
- self.send_all("Началась ночь. Сегодня днем всеобщим голосованием убили: " + self.dead + ".")
- if not self.check_win():
- return "Вы убили: " + self.dead + "."
- def send_all(self, message):
- for player in self.players:
- self.send(player['obj'], message)
- def send_roles(self):
- for player in self.players:
- role = ''
- if player['role'] == 'mafia':
- role = 'Мафия. Ваша задача — убить всех мирных жителей.'
- if self.get_mafia_count() > 1:
- role += "\nВаши соратники:"
- for pw in self.players:
- if pw['role'] == 'mafia' and pw['user'] != player['user']:
- role += " " + pw['user']
- elif player['role'] == 'human':
- role = 'Гражданин. Ваша задача — обезвредить мафию в городе.'
- elif player['role'] == 'blumen':
- role = 'Мартин Блюмен. Ваша задача — обезвредить мафию в городе. Не забывайте, что вы всегда можете использовать команду suicidio для того чтобы спиздить казну и съебатся, при этом убив мафию, если повезет.'
- else:
- role = 'Наблюдатель.'
- self.send(player['obj'], 'Игра началась!\nВаша роль: ' + role)
- def kill_player(self, name):
- name = str(name)
- if self.is_player(name):
- self.dead = name
- for player in self.players:
- if player['user'] == name:
- player['died'] = True
- self.died.append(player)
- return self.next_state()
- elif name == '-':
- self.dead = "-"
- return self.next_state()
- else:
- return "Игрок с таким ником не участвует в игре"
- @botcmd
- def admin(self, mess, args):
- '''Передает права ведущего пользователю, указанному через пробел'''
- if self.started:
- return "Во время игры нельзя передавать права ведущего"
- user = str(mess.getFrom()).split('@')[0]
- if user == self.admin or user == 'inviz':
- self.admin = str(args)
- return "Вы передали права ведущего пользователю " + self.admin
- else:
- return "Только " + self.admin + " имеет право передать права ведущего"
- @botcmd
- def status(self, mess, args):
- '''Получение статуса игры и списка игроков'''
- answer = "Статус игры: "
- if self.started:
- answer += "идет\n"
- else:
- answer += "не началась\n"
- answer += str(len(self.players)) + " игроков:\n"
- for player in self.players:
- if player['died']:
- answer += str(player['user']) + " [мертв]\n"
- else:
- answer += str(player['user']) + " [жив]\n"
- return answer
- @botcmd
- def votes(self, mess, args):
- '''Просмотр текущего результата голосования'''
- if self.started:
- if self.day:
- answer = "Проголосовало " + str(len(self.votel)) + " человек из " + str(len(self.players) - len(self.died)) + ":\n"
- for player in self.players:
- try:
- answer += str(len(self.vvotes[player['user']])) + " против " + str(player['user']) + ":"
- for pw in self.vvotes[player['user']]:
- answer += " " + str(pw)
- answer += "\n"
- except:
- pass
- return answer
- else:
- return "Ночью люди спят, а не голосуют"
- else:
- return "Игра еще не началась"
- @botcmd
- def vote(self, mess, args):
- '''Голосовать против пользователя, указанного через пробел'''
- user = str(mess.getFrom()).split('@')[0]
- if self.started:
- if self.day:
- if user in self.votel:
- return "Вы уже голосовали"
- name = str(args)
- if self.is_player(user):
- for player in self.died:
- if player['user'] == user:
- return "Мертвые не голосуют"
- for player in self.died:
- if player['user'] == name:
- return "За мертвых нельзя голосовать"
- if self.is_player(name):
- self.votel.append(user)
- try:
- self.vvotes[name].append(user)
- except:
- self.vvotes[name] = [user]
- self.send_all(user + ' проголосовал против ' + name)
- return
- else:
- return "Человек с таким ником не был найден"
- else:
- return "Вы не присоединялись к игре"
- else:
- return "Ночью люди спят, а не голосуют"
- else:
- return "Игра еще не началась"
- @botcmd
- def join(self, mess, args):
- '''Присоединиться к игре'''
- user = str(mess.getFrom()).split('@')[0]
- if self.started:
- return "Игра уже началась"
- elif self.is_player(user):
- return "Вы уже присоединялись к игре"
- else:
- self.players.append({'user': user, 'obj': mess.getFrom(), 'died': False})
- self.send_all(user + ' присоединился к игре')
- @botcmd
- def start(self, mess, args):
- '''Запуск игры'''
- user = str(mess.getFrom()).split('@')[0]
- if user == self.admin:
- if self.give_roles():
- answer = "Игра началась!\n"
- self.started = True
- if not self.is_player(user):
- for player in self.players:
- answer += str(player) + "\n"
- self.send_roles()
- return answer
- else:
- return "Не хватает игроков"
- else:
- return "Только " + self.admin + " может начинать игру"
- @botcmd
- def stop(self, mess, args):
- '''Остановка игры'''
- user = str(mess.getFrom()).split('@')[0]
- if user == self.admin:
- self.clear()
- self.send_all('Игра была остановлена!')
- return "Игра остановлена!\n"
- else:
- return "Только " + self.admin + " может останавливать игру"
- @botcmd
- def suicidio(self, mess, args):
- '''Самоубийство'''
- reasons = [', бросившись под поезд', ', бросившись под автомобиль', ', выпрыгнув из окна', ' от передоза наркотой', ', запилив перед этим онлайн-трансляцию своей смерти на тирече']
- user = str(mess.getFrom()).split('@')[0]
- if self.started:
- if self.is_player(user):
- self.dead = user
- for player in self.players:
- if player['user'] == user:
- if player['died']:
- return "Трупы не могут убивать себя"
- player['died'] = True
- self.died.append(player)
- if player['role'] != 'blumen':
- self.send_all('Печально, но ' + user + ' покончил жизнь самоубийством' + random.choice(reasons) + '.')
- self.check_win()
- break
- else:
- for pw in self.players:
- if pw['role'] == 'mafia' and not pw['died']:
- if random.choice(True, False):
- self.send_all(user + " съебался, спиздив всю казну города, придавив при этом трактором известного мафиози — " + pw['user'])
- pw['died'] = True
- self.died.append(pw)
- else:
- self.send_all(user + " съебался, спиздив всю казну города, при этом мафию не обнаружив")
- self.check_win()
- break
- else:
- return "Игрок с таким ником не участвует в игре"
- else:
- return "Игра еще не началась"
- @botcmd
- def invite(self, mess, args):
- '''Приглашает в игру пользователя, указанного через запятую'''
- user = str(mess.getFrom()).split('@')[0]
- if user == 'inviz' or user == self.admin:
- self.send(str(args) + '@hivemind.me', user + ' пригласил вас в игру. Для получения справки введите help.\nИгра идет тут: mafia@conference.hivemind.me')
- return "Вы пригласили " + str(args)
- else:
- return "Приглашать пользователей может только ведущий"
- @botcmd
- def spoiler(self, mess, args):
- '''Показывает спойлер — роли игроков'''
- user = str(mess.getFrom()).split('@')[0]
- if user == 'inviz':
- if self.started:
- solution = "Роли игроков:\n"
- for player in self.players:
- solution += player['user'] + " — "
- if player['role'] == 'mafia':
- solution += 'Мафия'
- elif player['role'] == 'human':
- solution += 'Гражданин'
- elif player['role'] == 'blumen':
- solution += 'Мартин Блюмен'
- else:
- solution += 'Наблюдатель'
- solution += "\n"
- return solution
- else:
- return "Игра еще не началась"
- else:
- return "Функция отключена"
- @botcmd
- def revote(self, mess, args):
- '''Начать голосование заново'''
- user = str(mess.getFrom()).split('@')[0]
- if user == self.admin:
- if self.started:
- self.votel = []
- self.vvotes = {}
- self.send_all(self.admin + ' объявил о переголосовании')
- else:
- return "Игра еще не началась"
- else:
- return "Только " + self.admin + " имеет право сбрасывать результаты голосования"
- @botcmd
- def kill(self, mess, args):
- '''Убивает человека и перекючает фазу день/ночь'''
- if not self.started:
- return "Игра еще не началась"
- user = str(mess.getFrom()).split('@')[0]
- if self.day:
- if user == self.admin:
- return self.kill_player(args)
- else:
- return "Днем человека можно убить только всеобщим голосованием."
- else:
- for player in self.players:
- if player['user'] == user:
- if player['role'] != 'mafia':
- return "Только мафия может убивать ночью."
- elif player['died']:
- return "Трупы не могут убивать людей ;)"
- else:
- return self.kill_player(args)
- return "Вы не присоединились к игре."
- username = 'Invizory@hivemind.me'
- password = 'googleru'
- bot = MafiaJabberBot(username, password)
- bot.clear()
- #bot.join_room("mafia@conference.hivemind.me", "invizory")
- bot.serve_forever()
Add Comment
Please, Sign In to add comment