Guest User

Untitled

a guest
Aug 10th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.85 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. from jabberbot import JabberBot, botcmd
  4. import datetime
  5. import random
  6.  
  7. class MafiaJabberBot(JabberBot):
  8. def clear(self):
  9. self.vvotes = {}
  10. self.votel = []
  11. self.admin = "inviz"
  12. self.players = []
  13. self.died = []
  14. self.started = False
  15. self.day = True
  16. self.dead = ""
  17.  
  18. def get_mafia_count(self):
  19. return max(1, int(round(len(self.players) / 4.5)))
  20.  
  21. def give_roles(self):
  22. # constants
  23. need = 4
  24. roles = ['mafia' for i in xrange(self.get_mafia_count())]
  25. #roles.append('blumen')
  26.  
  27. if len(self.players) < need:
  28. return False
  29.  
  30. random.shuffle(self.players)
  31.  
  32. role = 0
  33. for player in self.players:
  34. if role == len(roles):
  35. player['role'] = 'human'
  36. else:
  37. player['role'] = roles[role]
  38. role += 1
  39.  
  40. random.shuffle(self.players)
  41.  
  42. return True
  43.  
  44. def is_player(self, name):
  45. for player in self.players:
  46. if player['user'] == name:
  47. return True
  48. return False
  49.  
  50. def check_win(self):
  51. bad = 0
  52. solution = ""
  53. for player in self.players:
  54. if player['role'] == 'mafia' and not player['died']:
  55. bad += 1
  56. solution += player['user'] + " — "
  57. if player['role'] == 'mafia':
  58. solution += 'Мафия'
  59. elif player['role'] == 'human':
  60. solution += 'Гражданин'
  61. elif player['role'] == 'blumen':
  62. solution += 'Мартин Блюмен'
  63. else:
  64. solution += 'Наблюдатель'
  65. solution += "\n"
  66. if bad == 0:
  67. self.send_all("Игра окончена!\nПобеду одержали мирные жители!\n" + solution)
  68. self.clear()
  69. return True
  70. elif bad >= len(self.players) - len(self.died) - 1:
  71. self.send_all("Игра окончена!\nПобеду одержала мафия!\n" + solution)
  72. self.clear()
  73. return True
  74. return False
  75.  
  76. def next_state(self):
  77. self.day = not self.day
  78. if self.day:
  79. self.send_all("Начался день. Сегодня ночью убили: " + self.dead + ".")
  80. if not self.check_win():
  81. return "Вы убили: " + self.dead + "."
  82. else:
  83. self.vvotes = {}
  84. self.votel = []
  85. self.send_all("Началась ночь. Сегодня днем всеобщим голосованием убили: " + self.dead + ".")
  86. if not self.check_win():
  87. return "Вы убили: " + self.dead + "."
  88.  
  89. def send_all(self, message):
  90. for player in self.players:
  91. self.send(player['obj'], message)
  92.  
  93. def send_roles(self):
  94. for player in self.players:
  95. role = ''
  96. if player['role'] == 'mafia':
  97. role = 'Мафия. Ваша задача — убить всех мирных жителей.'
  98. if self.get_mafia_count() > 1:
  99. role += "\nВаши соратники:"
  100. for pw in self.players:
  101. if pw['role'] == 'mafia' and pw['user'] != player['user']:
  102. role += " " + pw['user']
  103. elif player['role'] == 'human':
  104. role = 'Гражданин. Ваша задача — обезвредить мафию в городе.'
  105. elif player['role'] == 'blumen':
  106. role = 'Мартин Блюмен. Ваша задача — обезвредить мафию в городе. Не забывайте, что вы всегда можете использовать команду suicidio для того чтобы спиздить казну и съебатся, при этом убив мафию, если повезет.'
  107. else:
  108. role = 'Наблюдатель.'
  109. self.send(player['obj'], 'Игра началась!\nВаша роль: ' + role)
  110.  
  111. def kill_player(self, name):
  112. name = str(name)
  113. if self.is_player(name):
  114. self.dead = name
  115. for player in self.players:
  116. if player['user'] == name:
  117. player['died'] = True
  118. self.died.append(player)
  119. return self.next_state()
  120. elif name == '-':
  121. self.dead = "-"
  122. return self.next_state()
  123. else:
  124. return "Игрок с таким ником не участвует в игре"
  125.  
  126. @botcmd
  127. def admin(self, mess, args):
  128. '''Передает права ведущего пользователю, указанному через пробел'''
  129. if self.started:
  130. return "Во время игры нельзя передавать права ведущего"
  131. user = str(mess.getFrom()).split('@')[0]
  132. if user == self.admin or user == 'inviz':
  133. self.admin = str(args)
  134. return "Вы передали права ведущего пользователю " + self.admin
  135. else:
  136. return "Только " + self.admin + " имеет право передать права ведущего"
  137.  
  138. @botcmd
  139. def status(self, mess, args):
  140. '''Получение статуса игры и списка игроков'''
  141. answer = "Статус игры: "
  142. if self.started:
  143. answer += "идет\n"
  144. else:
  145. answer += "не началась\n"
  146. answer += str(len(self.players)) + " игроков:\n"
  147. for player in self.players:
  148. if player['died']:
  149. answer += str(player['user']) + " [мертв]\n"
  150. else:
  151. answer += str(player['user']) + " [жив]\n"
  152. return answer
  153.  
  154. @botcmd
  155. def votes(self, mess, args):
  156. '''Просмотр текущего результата голосования'''
  157. if self.started:
  158. if self.day:
  159. answer = "Проголосовало " + str(len(self.votel)) + " человек из " + str(len(self.players) - len(self.died)) + ":\n"
  160. for player in self.players:
  161. try:
  162. answer += str(len(self.vvotes[player['user']])) + " против " + str(player['user']) + ":"
  163. for pw in self.vvotes[player['user']]:
  164. answer += " " + str(pw)
  165. answer += "\n"
  166. except:
  167. pass
  168. return answer
  169. else:
  170. return "Ночью люди спят, а не голосуют"
  171. else:
  172. return "Игра еще не началась"
  173.  
  174. @botcmd
  175. def vote(self, mess, args):
  176. '''Голосовать против пользователя, указанного через пробел'''
  177. user = str(mess.getFrom()).split('@')[0]
  178. if self.started:
  179. if self.day:
  180. if user in self.votel:
  181. return "Вы уже голосовали"
  182. name = str(args)
  183. if self.is_player(user):
  184. for player in self.died:
  185. if player['user'] == user:
  186. return "Мертвые не голосуют"
  187. for player in self.died:
  188. if player['user'] == name:
  189. return "За мертвых нельзя голосовать"
  190. if self.is_player(name):
  191. self.votel.append(user)
  192. try:
  193. self.vvotes[name].append(user)
  194. except:
  195. self.vvotes[name] = [user]
  196. self.send_all(user + ' проголосовал против ' + name)
  197. return
  198. else:
  199. return "Человек с таким ником не был найден"
  200. else:
  201. return "Вы не присоединялись к игре"
  202. else:
  203. return "Ночью люди спят, а не голосуют"
  204. else:
  205. return "Игра еще не началась"
  206.  
  207. @botcmd
  208. def join(self, mess, args):
  209. '''Присоединиться к игре'''
  210. user = str(mess.getFrom()).split('@')[0]
  211. if self.started:
  212. return "Игра уже началась"
  213. elif self.is_player(user):
  214. return "Вы уже присоединялись к игре"
  215. else:
  216. self.players.append({'user': user, 'obj': mess.getFrom(), 'died': False})
  217. self.send_all(user + ' присоединился к игре')
  218.  
  219. @botcmd
  220. def start(self, mess, args):
  221. '''Запуск игры'''
  222. user = str(mess.getFrom()).split('@')[0]
  223. if user == self.admin:
  224. if self.give_roles():
  225. answer = "Игра началась!\n"
  226. self.started = True
  227. if not self.is_player(user):
  228. for player in self.players:
  229. answer += str(player) + "\n"
  230. self.send_roles()
  231. return answer
  232. else:
  233. return "Не хватает игроков"
  234. else:
  235. return "Только " + self.admin + " может начинать игру"
  236.  
  237. @botcmd
  238. def stop(self, mess, args):
  239. '''Остановка игры'''
  240. user = str(mess.getFrom()).split('@')[0]
  241. if user == self.admin:
  242. self.clear()
  243. self.send_all('Игра была остановлена!')
  244. return "Игра остановлена!\n"
  245. else:
  246. return "Только " + self.admin + " может останавливать игру"
  247.  
  248. @botcmd
  249. def suicidio(self, mess, args):
  250. '''Самоубийство'''
  251. reasons = [', бросившись под поезд', ', бросившись под автомобиль', ', выпрыгнув из окна', ' от передоза наркотой', ', запилив перед этим онлайн-трансляцию своей смерти на тирече']
  252.  
  253. user = str(mess.getFrom()).split('@')[0]
  254.  
  255. if self.started:
  256. if self.is_player(user):
  257. self.dead = user
  258. for player in self.players:
  259. if player['user'] == user:
  260. if player['died']:
  261. return "Трупы не могут убивать себя"
  262. player['died'] = True
  263. self.died.append(player)
  264. if player['role'] != 'blumen':
  265. self.send_all('Печально, но ' + user + ' покончил жизнь самоубийством' + random.choice(reasons) + '.')
  266. self.check_win()
  267. break
  268. else:
  269. for pw in self.players:
  270. if pw['role'] == 'mafia' and not pw['died']:
  271. if random.choice(True, False):
  272. self.send_all(user + " съебался, спиздив всю казну города, придавив при этом трактором известного мафиози — " + pw['user'])
  273. pw['died'] = True
  274. self.died.append(pw)
  275. else:
  276. self.send_all(user + " съебался, спиздив всю казну города, при этом мафию не обнаружив")
  277. self.check_win()
  278. break
  279. else:
  280. return "Игрок с таким ником не участвует в игре"
  281. else:
  282. return "Игра еще не началась"
  283.  
  284. @botcmd
  285. def invite(self, mess, args):
  286. '''Приглашает в игру пользователя, указанного через запятую'''
  287. user = str(mess.getFrom()).split('@')[0]
  288. if user == 'inviz' or user == self.admin:
  289. self.send(str(args) + '@hivemind.me', user + ' пригласил вас в игру. Для получения справки введите help.\nИгра идет тут: mafia@conference.hivemind.me')
  290. return "Вы пригласили " + str(args)
  291. else:
  292. return "Приглашать пользователей может только ведущий"
  293.  
  294. @botcmd
  295. def spoiler(self, mess, args):
  296. '''Показывает спойлер — роли игроков'''
  297. user = str(mess.getFrom()).split('@')[0]
  298. if user == 'inviz':
  299. if self.started:
  300. solution = "Роли игроков:\n"
  301. for player in self.players:
  302. solution += player['user'] + " — "
  303. if player['role'] == 'mafia':
  304. solution += 'Мафия'
  305. elif player['role'] == 'human':
  306. solution += 'Гражданин'
  307. elif player['role'] == 'blumen':
  308. solution += 'Мартин Блюмен'
  309. else:
  310. solution += 'Наблюдатель'
  311. solution += "\n"
  312. return solution
  313. else:
  314. return "Игра еще не началась"
  315. else:
  316. return "Функция отключена"
  317.  
  318. @botcmd
  319. def revote(self, mess, args):
  320. '''Начать голосование заново'''
  321. user = str(mess.getFrom()).split('@')[0]
  322. if user == self.admin:
  323. if self.started:
  324. self.votel = []
  325. self.vvotes = {}
  326. self.send_all(self.admin + ' объявил о переголосовании')
  327. else:
  328. return "Игра еще не началась"
  329. else:
  330. return "Только " + self.admin + " имеет право сбрасывать результаты голосования"
  331.  
  332. @botcmd
  333. def kill(self, mess, args):
  334. '''Убивает человека и перекючает фазу день/ночь'''
  335. if not self.started:
  336. return "Игра еще не началась"
  337. user = str(mess.getFrom()).split('@')[0]
  338. if self.day:
  339. if user == self.admin:
  340. return self.kill_player(args)
  341. else:
  342. return "Днем человека можно убить только всеобщим голосованием."
  343. else:
  344. for player in self.players:
  345. if player['user'] == user:
  346. if player['role'] != 'mafia':
  347. return "Только мафия может убивать ночью."
  348. elif player['died']:
  349. return "Трупы не могут убивать людей ;)"
  350. else:
  351. return self.kill_player(args)
  352. return "Вы не присоединились к игре."
  353.  
  354. username = 'Invizory@hivemind.me'
  355. password = 'googleru'
  356. bot = MafiaJabberBot(username, password)
  357. bot.clear()
  358. #bot.join_room("mafia@conference.hivemind.me", "invizory")
  359. bot.serve_forever()
Add Comment
Please, Sign In to add comment