Player.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using MafiaTelegramBot.CustomCollections;
  7. using MafiaTelegramBot.DataBase;
  8. using MafiaTelegramBot.DataBase.Entity;
  9. using MafiaTelegramBot.DataBase.EntityDao;
  10. using MafiaTelegramBot.Game.GameRoles;
  11. using MafiaTelegramBot.Models;
  12. using MafiaTelegramBot.Resources;
  13. using Microsoft.EntityFrameworkCore;
  14. using Newtonsoft.Json;
  15. namespace MafiaTelegramBot.Game
  16. {
  17. public class Player : UserEntity
  18. {
  19. public GameRooms.GameRoom.Role CurrentRole = new NoneRole();
  20. public int TurnOrder = -1;
  21. private string _roomName = "";
  22. private static System.Timers.Timer _activeTime = new();
  23. public bool IsSpeaker;
  24. public bool IsPlaying;
  25. public bool IsAlive = true;
  26. public bool CanBeHealed = true;
  27. public bool IsBlocked = false;
  28. public bool CanBeBlockedNight = true;
  29. public bool CanBeBlockedDay = true;
  30. public readonly StatisticsList Statistics = new();
  31. public OpenedRolesEntity OpenedRoles = new();
  32. public AchievementsEntity Achievements = new();
  33. public async Task<bool> LoadStatistics()
  34. {
  35. List<StatisticsEntity> userStats = await UserDao.DataBase.Statistics.Where(s => s.UserId == Id).AsNoTracking().ToListAsync();
  36. foreach (var role in userStats)
  37. {
  38. Statistics.Add(Enum.Parse<Roles>(role.Role),role);
  39. }
  40. return true;
  41. }
  42. public void SetTimer()
  43. {
  44. _activeTime = new System.Timers.Timer(3600000);
  45. _activeTime.Elapsed += async (x , y) =>
  46. {
  47. await Remove();
  48. };
  49. _activeTime.Enabled = true;
  50. }
  51. public void Restart()
  52. {
  53. if (_activeTime.Enabled)
  54. _activeTime.Stop();
  55. _activeTime.Start();
  56. }
  57. public void StopTimer()
  58. {
  59. _activeTime.Stop();
  60. }
  61. public void StartTimer()
  62. {
  63. _activeTime.Start();
  64. }
  65. private async Task Remove()
  66. {
  67. try
  68. {
  69. UserDao.ActiveUsers.Remove(Id);
  70. _activeTime.Dispose();
  71. }
  72. catch (Exception)
  73. {
  74. await Console.Out.WriteLineAsync("Cant delete user!");
  75. }
  76. //await Bot.SendHyperLink(ChatId, "Inactive now!");
  77. }
  78. public static Player FromUserEntity(UserEntity b)
  79. {
  80. var serialized = JsonConvert.SerializeObject(b);
  81. Player a = JsonConvert.DeserializeObject<Player>(serialized);
  82. return a;
  83. }
  84. public string GetRoomName()
  85. {
  86. return _roomName;
  87. }
  88. public bool SetRoomName(string roomName)
  89. {
  90. if (_roomName != "") return false;
  91. _roomName = roomName;
  92. return true;
  93. }
  94. public async Task<bool> RemoveGame()
  95. {
  96. if (_roomName == "") return false;
  97. _roomName = "";
  98. await UserDao.Update(this);
  99. return true;
  100. }
  101. public override bool Equals(object? obj)
  102. {
  103. return obj is UserEntity user && user.Id == Id;
  104. }
  105. public override int GetHashCode()
  106. {
  107. return Id.GetHashCode();
  108. }
  109. public Roles GetRole()
  110. {
  111. return CurrentRole.RoleKey;
  112. }
  113. public string GetRoleName()
  114. {
  115. return roles.ResourceManager.GetString(CurrentRole.RoleKey.ToString())!;
  116. }
  117. public void ResetState()
  118. {
  119. CurrentRole = new NoneRole();
  120. IsAlive = true;
  121. IsSpeaker = true;
  122. IsPlaying = false;
  123. CanBeHealed = true;
  124. CanBeBlockedDay = true;
  125. CanBeBlockedNight = true;
  126. }
  127. public void BodyguardRoleAchievementEvent()
  128. {
  129. if (!OpenedRoles.Bodyguard)
  130. {
  131. Task.Run(async() =>
  132. {
  133. Achievements.DoctorHeals++;
  134. if (Achievements.DoctorHeals == 10)
  135. {
  136. await Bot.SendWithMarkdown2(ChatId,
  137. $"{strings.congrats} {roles.Bodyguard}! {strings.you_can_use}");
  138. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Bodyguard.ToString()]);
  139. OpenedRoles.OpenBodyguard();
  140. }
  141. });
  142. }
  143. }
  144. public void NecromancerRoleAchievementEvent()
  145. {
  146. if (!OpenedRoles.Necromancer)
  147. {
  148. Task.Run(async () =>
  149. {
  150. Achievements.DoctorHeals++;
  151. if (Achievements.DoctorHeals == 50)
  152. {
  153. await Bot.SendWithMarkdown2(ChatId,
  154. $"{strings.congrats} {roles.Necromancer}! {strings.you_can_use}");
  155. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Necromancer.ToString()]);
  156. OpenedRoles.OpenNecromancer();
  157. }
  158. });
  159. }
  160. }
  161. public void FoolRoleAchievementEvent()
  162. {
  163. if (!OpenedRoles.Fool)
  164. {
  165. Task.Run(async () =>
  166. {
  167. Achievements.CopDispatches++;
  168. if (Achievements.CopDispatches == 3)
  169. {
  170. await Bot.SendWithMarkdown2(ChatId,
  171. $"{strings.congrats} {roles.Fool}! {strings.you_can_use}");
  172. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Fool.ToString()]);
  173. OpenedRoles.OpenFool();
  174. }
  175. });
  176. }
  177. }
  178. public void JournalistAchievementEvent()
  179. {
  180. if (!OpenedRoles.Journalist)
  181. {
  182. Task.Run(async () =>
  183. {
  184. await Bot.SendWithMarkdown2(ChatId,
  185. $"{strings.congrats} {roles.Journalist}! {strings.you_can_use}");
  186. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Journalist.ToString()]);
  187. OpenedRoles.OpenJournalist();
  188. });
  189. }
  190. }
  191. public void DetectiveAchievementEvent()
  192. {
  193. if (!OpenedRoles.Detective)
  194. {
  195. Task.Run(async () =>
  196. {
  197. Achievements.GamesWhereCopCheckOnlyMafia++;
  198. if (Achievements.GamesWhereCopCheckOnlyMafia == 3)
  199. {
  200. await Bot.SendWithMarkdown2(ChatId,
  201. $"{strings.congrats} {roles.Detective}! {strings.you_can_use}");
  202. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Detective.ToString()]);
  203. OpenedRoles.OpenDetective();
  204. }
  205. });
  206. }
  207. }
  208. public void DameRoleAchievementEvent()
  209. {
  210. Task.Run(async () =>
  211. {
  212. if (!OpenedRoles.Dame)
  213. {
  214. Achievements.HaveSexWithDon++;
  215. if(Achievements.HaveSexWithDon == 5)
  216. {
  217. await Bot.SendWithMarkdown2(ChatId,
  218. $"{strings.congrats} {roles.Dame}! {strings.you_can_use}");
  219. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Dame.ToString()]);
  220. OpenedRoles.OpenDame();
  221. }
  222. }
  223. });
  224. }
  225. public void ElderRoleAchievementEvent()
  226. {
  227. Task.Run(async() =>
  228. {
  229. if (!OpenedRoles.Elder)
  230. {
  231. Achievements.NotDispatchedOnSecondStage++;
  232. if(Achievements.NotDispatchedOnSecondStage == 2)
  233. {
  234. await Bot.SendWithMarkdown2(ChatId,
  235. $"{strings.congrats} {roles.Elder}! {strings.you_can_use}");
  236. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Elder.ToString()]);
  237. OpenedRoles.OpenElder();
  238. }
  239. }
  240. });
  241. }
  242. public void LawyerRoleAchievementEvent()
  243. {
  244. if (!OpenedRoles.Lawyer)
  245. {
  246. Task.Run(async() =>
  247. {
  248. Achievements.MafiaSoloWins++;
  249. if(Achievements.MafiaSoloWins == 3)
  250. {
  251. await Bot.SendWithMarkdown2(ChatId,
  252. $"{strings.congrats} {roles.Lawyer}! {strings.you_can_use}");
  253. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Lawyer.ToString()]);
  254. OpenedRoles.OpenLawyer();
  255. }
  256. });
  257. }
  258. }
  259. public void WerewolfRoleAchievementEvent(int color, bool reset = false)
  260. {
  261. Task.Run(async () =>
  262. {
  263. if (!OpenedRoles.Werewolf)
  264. {
  265. if (reset)
  266. {
  267. Achievements.PreviousGameWinColor = 0;
  268. }
  269. else if ((Achievements.PreviousGameWinColor == 1 && color == 2)
  270. || (Achievements.PreviousGameWinColor == 2 && color == 1))
  271. {
  272. await Bot.SendWithMarkdown2(ChatId,
  273. $"{strings.congrats} {roles.Werewolf}! {strings.you_can_use}");
  274. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Werewolf.ToString()]);
  275. OpenedRoles.OpenWerewolf();
  276. }
  277. else
  278. {
  279. Achievements.PreviousGameWinColor = color;
  280. }
  281. }
  282. });
  283. }
  284. public void ParasiteRoleAchievementEvent(List<long> team)
  285. {
  286. if (!OpenedRoles.Parasite)
  287. {
  288. Task.Run(async() =>
  289. {
  290. team.Remove(Id);
  291. if (Achievements.PlayerWinTeam == "")
  292. {
  293. Achievements.PlayerWinTeam = BuildString(team);
  294. Achievements.PlayerWinTeamTwo = "";
  295. }
  296. else
  297. {
  298. var firstTeam = Achievements.PlayerWinTeam.Split('|').Select(long.Parse).ToList();
  299. var firstCross = team.Intersect(firstTeam).ToList();
  300. if (firstCross.Count == 0)
  301. {
  302. Achievements.PlayerWinTeam = BuildString(team);
  303. Achievements.PlayerWinTeamTwo = "";
  304. }
  305. else
  306. {
  307. Achievements.PlayerWinTeam = BuildString(firstCross);
  308. if (Achievements.PlayerWinTeamTwo == "")
  309. Achievements.PlayerWinTeamTwo = BuildString(team);
  310. else
  311. {
  312. var secondTeam = Achievements.PlayerWinTeamTwo.Split('|').Select(long.Parse).ToList();
  313. var secondCross = team.Intersect(secondTeam).ToList();
  314. if (secondCross.Count == 0) Achievements.PlayerWinTeamTwo = BuildString(team);
  315. else
  316. {
  317. await Bot.SendWithMarkdown2(ChatId,
  318. $"{strings.congrats} {roles.Parasite}! {strings.you_can_use}");
  319. await Bot.SendStickerAsync(ChatId, Stickers.Sticker[Roles.Parasite.ToString()]);
  320. OpenedRoles.OpenParasite();
  321. }
  322. }
  323. }
  324. }
  325. });
  326. }
  327. string BuildString(List<long> list)
  328. {
  329. var result = team.Aggregate("", (current, id) => current + (id + '|'));
  330. return result.Remove(result.Length - 1);
  331. }
  332. }
  333. public void ResetParasiteProgress()
  334. {
  335. Achievements.PlayerWinTeam = "";
  336. Achievements.PlayerWinTeamTwo = "";
  337. }
  338. }
  339. }