/src/net/sacredlabyrinth/phaed/simpleclans/managers/RequestManager.java

https://github.com/masp/SimpleClans · Java · 515 lines · 349 code · 64 blank · 102 comment · 58 complexity · 269647348870855d430f254d8e5282f6 MD5 · raw file

  1. package net.sacredlabyrinth.phaed.simpleclans.managers;
  2. import net.sacredlabyrinth.phaed.simpleclans.*;
  3. import org.bukkit.ChatColor;
  4. import org.bukkit.entity.Player;
  5. import java.text.MessageFormat;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. /**
  9. * @author phaed
  10. */
  11. public final class RequestManager
  12. {
  13. private SimpleClans plugin;
  14. private HashMap<String, Request> requests = new HashMap<String, Request>();
  15. /**
  16. *
  17. */
  18. public RequestManager()
  19. {
  20. plugin = SimpleClans.getInstance();
  21. askerTask();
  22. }
  23. /**
  24. * Check whether the clan has a pending request
  25. *
  26. * @param tag
  27. * @return
  28. */
  29. public boolean hasRequest(String tag)
  30. {
  31. return requests.containsKey(tag);
  32. }
  33. /**
  34. * Add a demotion request
  35. *
  36. * @param requester
  37. * @param demotedName
  38. * @param clan
  39. */
  40. public void addDemoteRequest(ClanPlayer requester, String demotedName, Clan clan)
  41. {
  42. String msg = MessageFormat.format(plugin.getLang().getString("asking.for.the.demotion"), Helper.capitalize(requester.getName()), demotedName);
  43. ClanPlayer demotedTp = plugin.getClanManager().getClanPlayer(demotedName.toLowerCase());
  44. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
  45. acceptors.remove(demotedTp);
  46. Request req = new Request(plugin, ClanRequest.DEMOTE, acceptors, requester, demotedName, clan, msg);
  47. requests.put(clan.getTag(), req);
  48. ask(req);
  49. }
  50. /**
  51. * Add a promotion request
  52. *
  53. * @param requester
  54. * @param promotedName
  55. * @param clan
  56. */
  57. public void addPromoteRequest(ClanPlayer requester, String promotedName, Clan clan)
  58. {
  59. String msg = MessageFormat.format(plugin.getLang().getString("asking.for.the.promotion"), Helper.capitalize(requester.getName()), promotedName);
  60. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
  61. acceptors.remove(requester);
  62. Request req = new Request(plugin, ClanRequest.PROMOTE, acceptors, requester, promotedName, clan, msg);
  63. requests.put(clan.getTag(), req);
  64. ask(req);
  65. }
  66. /**
  67. * Add a clan disband request
  68. *
  69. * @param requester
  70. * @param clan
  71. */
  72. public void addDisbandRequest(ClanPlayer requester, Clan clan)
  73. {
  74. String msg = MessageFormat.format(plugin.getLang().getString("asking.for.the.deletion"), Helper.capitalize(requester.getName()));
  75. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
  76. acceptors.remove(requester);
  77. Request req = new Request(plugin, ClanRequest.DISBAND, acceptors, requester, null, clan, msg);
  78. requests.put(clan.getTag(), req);
  79. ask(req);
  80. }
  81. /**
  82. * Add a member invite request
  83. *
  84. * @param requester
  85. * @param invitedName
  86. * @param clan
  87. */
  88. public void addInviteRequest(ClanPlayer requester, String invitedName, Clan clan)
  89. {
  90. String msg = MessageFormat.format(plugin.getLang().getString("inviting.you.to.join"), Helper.capitalize(requester.getName()), clan.getName());
  91. Request req = new Request(plugin, ClanRequest.INVITE, null, requester, invitedName, clan, msg);
  92. requests.put(invitedName.toLowerCase(), req);
  93. ask(req);
  94. }
  95. /**
  96. * Add an clan war request
  97. *
  98. * @param requester
  99. * @param allyClan
  100. * @param requestingClan
  101. */
  102. public void addWarStartRequest(ClanPlayer requester, Clan allyClan, Clan requestingClan)
  103. {
  104. String msg = MessageFormat.format(plugin.getLang().getString("proposing.war"), Helper.capitalize(requestingClan.getName()), Helper.stripColors(allyClan.getColorTag()));
  105. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(allyClan.getLeaders());
  106. acceptors.remove(requester);
  107. Request req = new Request(plugin, ClanRequest.START_WAR, acceptors, requester, allyClan.getTag(), requestingClan, msg);
  108. requests.put(allyClan.getTag(), req);
  109. ask(req);
  110. }
  111. /**
  112. * Add an war end request
  113. *
  114. * @param requester
  115. * @param rivalClan
  116. * @param requestingClan
  117. */
  118. public void addWarEndRequest(ClanPlayer requester, Clan rivalClan, Clan requestingClan)
  119. {
  120. String msg = MessageFormat.format(plugin.getLang().getString("proposing.to.end.the.war"), Helper.capitalize(requestingClan.getName()), Helper.stripColors(rivalClan.getColorTag()));
  121. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(rivalClan.getLeaders());
  122. acceptors.remove(requester);
  123. Request req = new Request(plugin, ClanRequest.END_WAR, acceptors, requester, rivalClan.getTag(), requestingClan, msg);
  124. requests.put(rivalClan.getTag(), req);
  125. ask(req);
  126. }
  127. /**
  128. * Add an clan alliance request
  129. *
  130. * @param requester
  131. * @param allyClan
  132. * @param requestingClan
  133. */
  134. public void addAllyRequest(ClanPlayer requester, Clan allyClan, Clan requestingClan)
  135. {
  136. String msg = MessageFormat.format(plugin.getLang().getString("proposing.an.alliance"), Helper.capitalize(requestingClan.getName()), Helper.stripColors(allyClan.getColorTag()));
  137. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(allyClan.getLeaders());
  138. acceptors.remove(requester);
  139. Request req = new Request(plugin, ClanRequest.CREATE_ALLY, acceptors, requester, allyClan.getTag(), requestingClan, msg);
  140. requests.put(allyClan.getTag(), req);
  141. ask(req);
  142. }
  143. /**
  144. * Add an clan rivalry break request
  145. *
  146. * @param requester
  147. * @param rivalClan
  148. * @param requestingClan
  149. */
  150. public void addRivalryBreakRequest(ClanPlayer requester, Clan rivalClan, Clan requestingClan)
  151. {
  152. String msg = MessageFormat.format(plugin.getLang().getString("proposing.to.end.the.rivalry"), Helper.capitalize(requestingClan.getName()), Helper.stripColors(rivalClan.getColorTag()));
  153. List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(rivalClan.getLeaders());
  154. acceptors.remove(requester);
  155. Request req = new Request(plugin, ClanRequest.BREAK_RIVALRY, acceptors, requester, rivalClan.getTag(), requestingClan, msg);
  156. requests.put(rivalClan.getTag(), req);
  157. ask(req);
  158. }
  159. /**
  160. * Record one player's accept vote
  161. *
  162. * @param cp
  163. */
  164. public void accept(ClanPlayer cp)
  165. {
  166. Request req = requests.get(cp.getTag());
  167. if (req != null)
  168. {
  169. req.vote(cp.getName(), VoteResult.ACCEPT);
  170. processResults(req);
  171. }
  172. else
  173. {
  174. req = requests.get(cp.getCleanName());
  175. if (req != null)
  176. {
  177. processInvite(req, VoteResult.ACCEPT);
  178. }
  179. }
  180. }
  181. /**
  182. * Record one player's deny vote
  183. *
  184. * @param cp
  185. */
  186. public void deny(ClanPlayer cp)
  187. {
  188. Request req = requests.get(cp.getTag());
  189. if (req != null)
  190. {
  191. req.vote(cp.getName(), VoteResult.DENY);
  192. processResults(req);
  193. }
  194. else
  195. {
  196. req = requests.get(cp.getCleanName());
  197. if (req != null)
  198. {
  199. processInvite(req, VoteResult.DENY);
  200. }
  201. }
  202. }
  203. /**
  204. * Process the answer from an invite and add the player to the clan if accepted
  205. *
  206. * @param req
  207. * @param vote
  208. */
  209. public void processInvite(Request req, VoteResult vote)
  210. {
  211. Clan clan = req.getClan();
  212. String invited = req.getTarget();
  213. if (vote.equals(VoteResult.ACCEPT))
  214. {
  215. ClanPlayer cp = plugin.getClanManager().getCreateClanPlayer(invited);
  216. clan.addBb(ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("joined.the.clan"), Helper.capitalize(invited)));
  217. plugin.getClanManager().serverAnnounce(MessageFormat.format(plugin.getLang().getString("has.joined"), Helper.capitalize(invited), clan.getName()));
  218. clan.addPlayerToClan(cp);
  219. }
  220. else
  221. {
  222. clan.leaderAnnounce(plugin.getLang().getString("leaders"), ChatColor.RED + MessageFormat.format(plugin.getLang().getString("membership.invitation"), Helper.capitalize(invited)));
  223. }
  224. requests.remove(req.getTarget().toLowerCase());
  225. }
  226. /**
  227. * Check to see if votes are complete and process the result
  228. *
  229. * @param req
  230. */
  231. public void processResults(Request req)
  232. {
  233. if (req.getType().equals(ClanRequest.START_WAR))
  234. {
  235. Clan clan = req.getClan();
  236. Clan war = plugin.getClanManager().getClan(req.getTarget());
  237. ClanPlayer cp = req.getRequester();
  238. if (war != null && clan != null)
  239. {
  240. List<String> accepts = req.getAccepts();
  241. List<String> denies = req.getDenies();
  242. if (!accepts.isEmpty())
  243. {
  244. clan.addWarringClan(war);
  245. war.addWarringClan(clan);
  246. war.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("you.are.at.war"), Helper.capitalize(war.getName()), clan.getColorTag()));
  247. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("you.are.at.war"), Helper.capitalize(clan.getName()), war.getColorTag()));
  248. }
  249. else
  250. {
  251. war.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("denied.war.req"), Helper.capitalize(denies.get(0)), clan.getName()));
  252. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("end.war.denied"), Helper.capitalize(war.getName())));
  253. }
  254. }
  255. }
  256. else if (req.getType().equals(ClanRequest.END_WAR))
  257. {
  258. Clan clan = req.getClan();
  259. Clan war = plugin.getClanManager().getClan(req.getTarget());
  260. ClanPlayer cp = req.getRequester();
  261. if (war != null && clan != null)
  262. {
  263. List<String> accepts = req.getAccepts();
  264. List<String> denies = req.getDenies();
  265. if (!accepts.isEmpty())
  266. {
  267. clan.removeWarringClan(war);
  268. war.removeWarringClan(clan);
  269. war.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("you.are.no.longer.at.war"), Helper.capitalize(accepts.get(0)), clan.getColorTag()));
  270. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("you.are.no.longer.at.war"), Helper.capitalize(clan.getName()), Helper.capitalize(war.getColorTag())));
  271. }
  272. else
  273. {
  274. war.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("denied.war.end"), Helper.capitalize(denies.get(0)), clan.getName()));
  275. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("end.war.denied"), Helper.capitalize(war.getName())));
  276. }
  277. }
  278. }
  279. else if (req.getType().equals(ClanRequest.CREATE_ALLY))
  280. {
  281. Clan clan = req.getClan();
  282. Clan ally = plugin.getClanManager().getClan(req.getTarget());
  283. ClanPlayer cp = req.getRequester();
  284. if (ally != null && clan != null)
  285. {
  286. List<String> accepts = req.getAccepts();
  287. List<String> denies = req.getDenies();
  288. if (!accepts.isEmpty())
  289. {
  290. clan.addAlly(ally);
  291. ally.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("accepted.an.alliance"), Helper.capitalize(accepts.get(0)), clan.getName()));
  292. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("created.an.alliance"), Helper.capitalize(cp.getName()), Helper.capitalize(ally.getName())));
  293. }
  294. else
  295. {
  296. ally.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("denied.an.alliance"), Helper.capitalize(denies.get(0)), clan.getName()));
  297. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("the.alliance.was.denied"), Helper.capitalize(ally.getName())));
  298. }
  299. }
  300. }
  301. else if (req.getType().equals(ClanRequest.BREAK_RIVALRY))
  302. {
  303. Clan clan = req.getClan();
  304. Clan rival = plugin.getClanManager().getClan(req.getTarget());
  305. ClanPlayer cp = req.getRequester();
  306. if (rival != null && clan != null)
  307. {
  308. List<String> accepts = req.getAccepts();
  309. List<String> denies = req.getDenies();
  310. if (!accepts.isEmpty())
  311. {
  312. clan.removeRival(rival);
  313. rival.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("broken.the.rivalry"), Helper.capitalize(accepts.get(0)), clan.getName()));
  314. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("broken.the.rivalry.with"), Helper.capitalize(cp.getName()), Helper.capitalize(rival.getName())));
  315. }
  316. else
  317. {
  318. rival.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("denied.to.make.peace"), Helper.capitalize(denies.get(0)), clan.getName()));
  319. clan.addBb(cp.getName(), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("peace.agreement.denied"), Helper.capitalize(rival.getName())));
  320. }
  321. }
  322. }
  323. else if (req.votingFinished())
  324. {
  325. List<String> denies = req.getDenies();
  326. if (req.getType().equals(ClanRequest.DEMOTE))
  327. {
  328. Clan clan = req.getClan();
  329. String demoted = req.getTarget();
  330. if (denies.isEmpty())
  331. {
  332. clan.addBb(plugin.getLang().getString("leaders"), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("demoted.back.to.member"), Helper.capitalize(demoted)));
  333. clan.demote(demoted);
  334. }
  335. else
  336. {
  337. String deniers = Helper.capitalize(Helper.toMessage(Helper.toArray(denies), ", "));
  338. clan.leaderAnnounce(plugin.getLang().getString("leaders"), ChatColor.RED + MessageFormat.format(plugin.getLang().getString("denied.demotion"), deniers, demoted));
  339. }
  340. }
  341. else if (req.getType().equals(ClanRequest.PROMOTE))
  342. {
  343. Clan clan = req.getClan();
  344. String promoted = req.getTarget();
  345. if (denies.isEmpty())
  346. {
  347. clan.addBb(plugin.getLang().getString("leaders"), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("promoted.to.leader"), Helper.capitalize(promoted)));
  348. clan.promote(promoted);
  349. }
  350. else
  351. {
  352. String deniers = Helper.capitalize(Helper.toMessage(Helper.toArray(denies), ", "));
  353. clan.leaderAnnounce(plugin.getLang().getString("leaders"), ChatColor.RED + MessageFormat.format(plugin.getLang().getString("denied.the.promotion"), deniers, promoted));
  354. }
  355. }
  356. else if (req.getType().equals(ClanRequest.DISBAND))
  357. {
  358. Clan clan = req.getClan();
  359. if (denies.isEmpty())
  360. {
  361. clan.addBb(plugin.getLang().getString("leaders"), ChatColor.AQUA + MessageFormat.format(plugin.getLang().getString("has.been.disbanded"), clan.getName()));
  362. clan.disband();
  363. }
  364. else
  365. {
  366. String deniers = Helper.capitalize(Helper.toMessage(Helper.toArray(denies), ", "));
  367. clan.leaderAnnounce(plugin.getLang().getString("leaders"), ChatColor.RED + MessageFormat.format(plugin.getLang().getString("clan.deletion"), deniers));
  368. }
  369. }
  370. req.cleanVotes();
  371. requests.remove(req.getClan().getTag());
  372. }
  373. }
  374. /**
  375. * End a pending request prematurely
  376. *
  377. * @param playerName
  378. * @return
  379. */
  380. public boolean endPendingRequest(String playerName)
  381. {
  382. for (Request req : requests.values())
  383. {
  384. for (ClanPlayer cp : req.getAcceptors())
  385. {
  386. if (cp.getName().equalsIgnoreCase(playerName))
  387. {
  388. req.getClan().leaderAnnounce(plugin.getLang().getString("leaders"), MessageFormat.format(plugin.getLang().getString("signed.off.request.cancelled"), ChatColor.RED + Helper.capitalize(playerName), req.getType()));
  389. requests.remove(req.getClan().getTag());
  390. break;
  391. }
  392. }
  393. }
  394. return false;
  395. }
  396. /**
  397. * Starts the task that asks for the votes of all requests
  398. */
  399. public void askerTask()
  400. {
  401. plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable()
  402. {
  403. public void run()
  404. {
  405. for (Request req : requests.values())
  406. {
  407. ask(req);
  408. }
  409. }
  410. }, 0, plugin.getSettingsManager().getRequestFreqencySecs() * 20L);
  411. }
  412. /**
  413. * Asks a request to players for votes
  414. *
  415. * @param req
  416. */
  417. public void ask(Request req)
  418. {
  419. final String tag = plugin.getSettingsManager().getClanChatBracketColor() + plugin.getSettingsManager().getClanChatTagBracketLeft() + plugin.getSettingsManager().getTagDefaultColor() + req.getClan().getColorTag() + plugin.getSettingsManager().getClanChatBracketColor() + plugin.getSettingsManager().getClanChatTagBracketRight();
  420. final String message = tag + " " + plugin.getSettingsManager().getRequestMessageColor() + req.getMsg();
  421. final String options = MessageFormat.format(plugin.getLang().getString("accept.or.deny"), ChatBlock.makeEmpty(Helper.stripColors(tag)) + " " + ChatColor.DARK_GREEN + "/" + plugin.getSettingsManager().getCommandAccept() + plugin.getSettingsManager().getPageHeadingsColor(), ChatColor.DARK_RED + "/" + plugin.getSettingsManager().getCommandDeny());
  422. if (req.getType().equals(ClanRequest.INVITE))
  423. {
  424. Player player = plugin.getServer().getPlayer(req.getTarget());
  425. if (player != null)
  426. {
  427. ChatBlock.sendBlank(player);
  428. ChatBlock.sendMessage(player, message);
  429. ChatBlock.sendMessage(player, options);
  430. ChatBlock.sendBlank(player);
  431. }
  432. }
  433. else
  434. {
  435. for (ClanPlayer cp : req.getAcceptors())
  436. {
  437. if (cp.getVote() == null)
  438. {
  439. Player player = plugin.getServer().getPlayer(cp.getName());
  440. if (player != null)
  441. {
  442. ChatBlock.sendBlank(player);
  443. ChatBlock.sendMessage(player, message);
  444. ChatBlock.sendMessage(player, options);
  445. ChatBlock.sendBlank(player);
  446. }
  447. }
  448. }
  449. }
  450. }
  451. }