71public class ClanChannel
implements Comparable<ClanChannel> {
73 private static final Gson GSON =
new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
88 private final Set<ClanMember> members =
new HashSet<>();
91 final List<String> bannedMembers =
new ArrayList<>();
96 private ClanChannel() {
99 public static ClanChannel create(
Player player) {
101 player.send(
new SendMessage(
"There is already a clan channel under your name!"));
104 int[] showcase =
new int[]{1155, 1117, 1075};
105 ClanChannel channel =
new ClanChannel();
106 channel.management.name = player.
getName();
107 channel.details.owner = player.
getName();
108 channel.management.slogan =
"Generic slogan here";
111 channel.details.level =
ClanLevel.BRONZE;
112 channel.showcase.showcase = showcase;
113 Arrays.stream(showcase).forEach(i -> channel.showcase.showcaseItems.add(i));
114 channel.connect(player);
121 void connect(
Player player) {
124 if (!player.lastClan.isEmpty()) {
125 if (player.lastClan.equals(details.owner)) {
126 player.lastClan =
"";
127 }
else if (!members.contains(member)) {
128 handler.sendConnectionWarning(player, member);
137 if (member.
name.equalsIgnoreCase(details.owner)) {
141 if (!handler.attemptConnection(player, member)) {
145 if (handler.testPassword(player, member)) {
149 int count = getMembers().size();
151 establish(player, member);
153 if (getMembers().size() > count) {
161 player.clanChannel =
this;
162 player.clanTag = getTag();
163 player.clanTagColor = details.level.getColor();
164 player.updateFlags.add(
UpdateFlag.APPEARANCE);
166 if (player.lastClan.equals(details.owner)) {
167 player.lastClan =
"";
171 member = getMember(member.
name).orElse(member);
172 member.player = Optional.of(player);
173 if (addMember(member)) {
176 handler.connected(member);
180 private boolean addMember(
ClanMember member) {
181 return members.add(member);
185 void disconnect(String name,
boolean logout) {
186 Iterator<ClanMember> iterator = members.iterator();
187 while (iterator.hasNext()) {
189 if (member.
name.equals(name)) {
193 member.
player.ifPresent(player -> {
197 player.clanChannel =
null;
198 player.updateFlags.add(
UpdateFlag.APPEARANCE);
199 player.send(
new SendMessage(
"You have disconnected from the clan chat channel."));
202 player.lastClan = details.owner;
204 member.player = Optional.empty();
214 public void ban(String name) {
215 bannedMembers.add(name);
216 Iterator<ClanMember> iterator = members.iterator();
217 while (iterator.hasNext()) {
220 if (member.
name.equals(name)) {
225 member.
player.ifPresent(player -> {
228 player.lastClan = details.owner;
229 player.clanChannel =
null;
230 player.updateFlags.add(
UpdateFlag.APPEARANCE);
231 player.send(
new SendMessage(
"You have been banned from the clan chat channel."));
232 member.player = Optional.empty();
245 public void unban(
Player player,
int index) {
246 if (index < 0 || index >= bannedMembers.size())
248 String name = bannedMembers.get(index);
249 if (bannedMembers.remove(index) !=
null) {
251 int size = bannedMembers.size() < 10 ? 10 : bannedMembers.size();
252 for (
int idx = 0; idx < size; idx++) {
253 boolean valid = idx < bannedMembers.size();
254 Optional<String> banned = valid ? Optional.of(bannedMembers.get(idx)) : Optional.empty();
255 player.send(
new SendString(banned.orElse(
""),
string));
256 player.send(
new SendTooltip(valid ?
"Unban " + bannedMembers.get(idx) :
"",
string));
260 player.send(
new SendMessage(
"You have unbanned " + name +
" from the clan chat channel."));
264 public void addExperience(
double experience) {
265 if (experience + details.experience > Double.MAX_VALUE)
267 details.experience += experience;
269 if (details.level != level) {
270 details.level = level;
272 forPlayers(player -> {
273 player.clanTagColor = level.
getColor();
274 player.updateFlags.add(
UpdateFlag.APPEARANCE);
280 public void receiveTask(
Difficulty difficulty) {
281 if (details.clanTask ==
null) {
283 details.taskAmount = task.getAmount();
284 details.clanTask = task;
285 message(
"Task time! <col=255>" + task.getName(
this) +
"</col>.");
289 public void activateTask(
ClanTaskKey key, String name) {
290 activateTask(key, name, 1);
293 public void activateTask(
ClanTaskKey key, String name,
int amount) {
294 if (details.clanTask ==
null)
299 double experience = task.getProgressExperience();
300 int progress = details.taskAmount - amount;
302 int reward = details.clanTask.getReward();
303 details.points += reward;
304 message(
"Task complete! Reward: <col=255>" + reward +
"</col> CP. We now have: <col=255>" +
Utility.
formatDigits(details.points) +
"</col> CP.");
305 details.clanTask =
null;
312 details.taskAmount = progress;
313 addExperience(experience);
314 getMember(name).ifPresent(member -> {
315 member.expGained += experience;
322 member.
player.ifPresent(player -> {
323 if (!player.lastClan.isEmpty() && !player.lastClan.equalsIgnoreCase(player.
getName())) {
326 channel.disconnect(name,
false);
333 final int current = details.achievements.computeIfAbsent(achievement, a -> 0);
335 if (list == achievement) {
336 details.achievements.put(achievement, current + 1);
337 if (details.completedAchievement(list)) {
338 message(
"Achievement completed! " + list.details,
"We have earned " + list.getPoints() +
" CP and " +
Utility.
formatDigits(list.getExperience()) +
" Clan EXP.");
345 member.
player.ifPresent(player -> {
346 if (!player.lastClan.isEmpty() && !player.lastClan.equalsIgnoreCase(player.
getName())) {
349 channel.disconnect(member.
name,
false);
355 public void setName(
Player player, String name) {
356 if (getName().equalsIgnoreCase(name)) {
357 player.message(
"Your clan channel name is already set to " + getName() +
"!");
361 player.message(
"The name you have entered was prohibited! Try something else.");
365 player.message(
"There is already a clan that exists with that name!");
368 name =
Utility.formatName(name);
369 if (!management.name.isEmpty())
372 management.name = name;
373 message(
"The clan name has been changed to: <col=255>" + name +
"</col>.");
374 player.clanViewer.update(
this);
377 public void setTag(
Player player, String tag) {
378 if (tag.length() > 4)
380 if (getTag().equalsIgnoreCase(tag)) {
381 player.message(
"Your clan channel tag is already set to " + getTag() +
"!");
385 player.message(
"The tag you have entered was prohibited! Try something else.");
389 player.message(
"There is already a clan that exists with that tag!");
392 if (!management.tag.isEmpty())
395 message(
"The clan tag has been changed to: <col=255>" + getTag() +
"</col>.");
396 player.clanViewer.update(
this);
399 public void setSlogan(
Player player, String slogan) {
401 player.message(
"The slogan you have entered was prohibited! Try something else.");
404 management.slogan =
Utility.formatName(slogan);
405 player.clanViewer.update(
this);
408 public Optional<ClanMember> getMember(String name) {
410 if (member.
name.equalsIgnoreCase(name))
411 return Optional.of(member);
413 return Optional.empty();
416 List<ClanMember> getActiveMembers() {
417 List<ClanMember> list =
new LinkedList<>();
418 forEach(member -> member.
player.ifPresent(player -> list.add(member)));
423 private void forPlayers(Consumer<Player> player) {
425 member.
player.ifPresent(player);
430 public void forEach(Consumer<ClanMember> member) {
431 members.forEach(member);
439 public void chat(String name, String
message) {
440 getMember(name).ifPresent(member -> {
441 if (management.canTalk(member)) {
442 if (Arrays.stream(
Yell.
INVALID).anyMatch(message::contains)) {
443 member.
message(
"Your message contains invalid characters.");
449 member.
message(
"Your rank is too low to talk in this channel.");
454 public void splitLoot(
Player player, Mob dead, Item item) {
455 if (!lootshareEnabled()) {
459 Set<Player> players =
new HashSet<>();
460 long value = item.getValue(PriceType.HIGH_ALCH_VALUE) * item.getAmount();
461 long tax = value / 4;
464 RegionManager.forNearbyPlayer(dead, 32, nearby -> {
465 if (Objects.equals(nearby.clanChannel, player.clanChannel)) {
470 long split = (value - tax) / players.size();
471 players.forEach(other -> {
472 getMember(other.getName()).ifPresent(member ->
473 member.
message(Utility.formatDigits(split) +
" coins have been deposited into your bank vault."));
478 public String getName() {
479 return management.name;
482 public String getOwner() {
483 return details.owner;
487 return members.size();
490 public int activeSize() {
494 public boolean lootshareEnabled() {
495 return management.lootshare;
498 public boolean canManage(ClanMember member) {
499 return member !=
null && management.canManage(member);
502 boolean isBanned(String name) {
503 for (String banned : bannedMembers) {
504 if (banned.equalsIgnoreCase(name)) {
511 public boolean isLocked() {
512 return management.locked;
515 boolean canEnter(ClanMember member) {
516 return management.canEnter(member);
519 boolean hasPassword() {
520 return management.password !=
null && !management.password.isEmpty();
523 boolean isPassword(String input) {
524 return input.equals(management.password);
527 public ClanDetails getDetails() {
531 public ClanManagement getManagement() {
535 public Set<ClanMember> getMembers() {
539 public ClanChannelHandler getHandler() {
543 public String getSlogan() {
544 return management.slogan;
547 public String getPassword() {
548 return management.password;
551 public String getTag() {
552 return management.tag;
555 public String getColor() {
556 return management.color;
559 public ClanShowcase getShowcase() {
563 public Item[] getShowcaseItems() {
564 Item[] items =
new Item[showcase.showcase.length];
566 for (
int iem : showcase.showcase) {
567 items[count] =
new Item(iem, 1);
568 if (items[count].isStackable()) {
569 items[count].setAmount(250);
576 public void setColor(String color) {
577 management.color = color;
580 public JsonObject toJson() {
581 JsonObject
object =
new JsonObject();
582 object.addProperty(
"owner", details.owner);
583 object.addProperty(
"established", details.established);
584 object.addProperty(
"name", management.name);
585 object.addProperty(
"password", management.password);
586 object.addProperty(
"forum", management.forum);
587 object.addProperty(
"slogan", management.slogan);
588 object.addProperty(
"clan-tag", management.tag);
589 object.addProperty(
"clan-type", String.valueOf(details.type));
590 object.addProperty(
"clan-color", management.color);
591 object.addProperty(
"clan-points", details.points);
592 object.addProperty(
"clan-experience", details.experience);
593 object.addProperty(
"clan-level", String.valueOf(details.level));
594 if (details.clanTask !=
null) {
595 object.addProperty(
"clan-task", String.valueOf(details.clanTask));
597 object.addProperty(
"task-amount", details.taskAmount);
598 object.addProperty(
"locked", management.locked);
599 object.addProperty(
"lootshare", management.lootshare);
600 management.saveRanks(
object);
602 object.add(
"showcase", GSON.toJsonTree(showcase.showcase));
603 object.add(
"showcase-items", GSON.toJsonTree(showcase.showcaseItems));
604 object.add(
"banned-members", GSON.toJsonTree(bannedMembers));
606 JsonArray memberArray =
new JsonArray();
607 for (ClanMember member : members) {
608 JsonObject memberObj =
new JsonObject();
609 memberObj.addProperty(
"name", member.
name);
610 memberObj.addProperty(
"joined", member.
joined);
611 memberObj.addProperty(
"rank", String.valueOf(member.
rank));
612 memberObj.addProperty(
"exp-gained", member.
expGained);
613 memberObj.addProperty(
"npc-kills", member.
npcKills);
614 memberObj.addProperty(
"player-kills", member.
playerKills);
615 memberObj.addProperty(
"total-level", member.
totalLevel);
616 memberArray.add(memberObj);
618 object.add(
"members", memberArray);
622 public static void load(String owner) {
623 new GsonParser(
"/content/clan/" + owner,
false) {
625 protected void parse(JsonObject
object) {
626 ClanChannel channel =
new ClanChannel();
628 channel.details.owner =
object.get(
"owner").getAsString();
629 channel.management.name =
object.get(
"name").getAsString();
630 if (
object.has(
"password")) {
631 channel.management.password =
object.get(
"password").getAsString();
633 channel.details.established =
object.get(
"established").getAsString();
634 if (
object.has(
"forum")) {
635 channel.management.forum =
object.get(
"forum").getAsString();
637 if (
object.has(
"slogan")) {
638 channel.management.slogan =
object.get(
"slogan").getAsString();
640 if (
object.has(
"clan-tag")) {
641 channel.management.tag =
object.get(
"clan-tag").getAsString();
643 channel.details.type = ClanType.valueOf(
object.
get(
"clan-type").getAsString());
644 if (
object.has(
"clan-color")) {
645 channel.management.color =
object.get(
"clan-color").getAsString();
648 channel.details.points =
object.get(
"clan-points").getAsInt();
649 channel.details.experience =
object.get(
"clan-experience").getAsLong();
650 channel.details.level = ClanLevel.valueOf(
object.
get(
"clan-level").getAsString());
651 if (
object.has(
"clan-task")) {
652 channel.details.clanTask = ClanTask.valueOf(
object.
get(
"clan-task").getAsString());
654 channel.details.taskAmount =
object.get(
"task-amount").getAsInt();
655 channel.management.locked =
object.get(
"locked").getAsBoolean();
656 channel.management.lootshare =
object.get(
"lootshare").getAsBoolean();
657 channel.management.loadRanks(
object);
658 channel.showcase.showcase = GSON.fromJson(
object.
get(
"showcase"),
int[].
class);
660 JsonArray array =
object.get(
"showcase-items").getAsJsonArray();
661 for (JsonElement element : array) {
662 channel.showcase.showcaseItems.add(element.getAsInt());
665 array =
object.get(
"banned-members").getAsJsonArray();
666 for (JsonElement element : array) {
667 channel.bannedMembers.add(element.getAsString());
670 JsonArray members =
object.get(
"members").getAsJsonArray();
671 for (JsonElement element : members) {
672 JsonObject memberObj = (JsonObject) element;
673 String name = memberObj.get(
"name").getAsString();
674 ClanMember member =
new ClanMember(name);
675 member.joined = memberObj.get(
"joined").getAsString();
676 member.rank = ClanRank.valueOf(memberObj.get(
"rank").getAsString());
677 member.expGained = memberObj.get(
"exp-gained").getAsDouble();
678 member.npcKills = memberObj.get(
"npc-kills").getAsInt();
679 member.playerKills = memberObj.get(
"player-kills").getAsInt();
680 member.totalLevel = memberObj.get(
"total-level").getAsInt();
681 channel.addMember(member);
684 if (!channel.getTag().isEmpty())
685 ClanRepository.ACTIVE_TAGS.add(channel.getTag());
686 if (!channel.getName().isEmpty())
687 ClanRepository.ACTIVE_NAMES.add(channel.getName());
688 ClanRepository.ALLTIME.add(channel);
689 ClanRepository.addChannel(channel);
695 public int compareTo(ClanChannel other) {
696 int compare = Double.compare(other.details.
experience, details.experience);
698 return management.name.compareTo(other.management.
name);
703 public int hashCode() {
704 return details.owner.hashCode();
708 public boolean equals(Object obj) {
709 if (obj ==
this)
return true;
710 if (obj instanceof ClanChannel) {
711 ClanChannel other = (ClanChannel) obj;
712 return Objects.equals(details, other.details)
713 && Objects.equals(management, other.management);
715 return super.equals(obj);