use of com.jockie.bot.core.command.Command in project Sx4 by sx4-discord-bot.
the class PickaxeCommand method repair.
@Command(value = "repair", description = "Repair your current pickaxe with the material it is made from")
@CommandId(363)
@Examples({ "pickaxe repair 10", "pickaxe repair all" })
public void repair(Sx4CommandEvent event, @Argument(value = "durability") @AlternativeOptions("all") Alternative<Integer> option) {
Bson filter = Filters.and(Filters.eq("userId", event.getAuthor().getIdLong()), Filters.eq("item.type", ItemType.PICKAXE.getId()));
Document data = event.getMongo().getItem(filter, Projections.include("item"));
if (data == null) {
event.replyFailure("You do not have a pickaxe").queue();
return;
}
Pickaxe pickaxe = Pickaxe.fromData(event.getBot().getEconomyManager(), data.get("item", Document.class));
CraftItem item = pickaxe.getRepairItem();
if (item == null) {
event.replyFailure("That pickaxe is not repairable").queue();
return;
}
int maxDurability = pickaxe.getMaxDurability() - pickaxe.getDurability();
if (maxDurability <= 0) {
event.replyFailure("Your pickaxe is already at full durability").queue();
return;
}
int durability;
if (option.isAlternative()) {
durability = maxDurability;
} else {
int amount = option.getValue();
if (amount > maxDurability) {
event.reply("You can only repair your pickaxe by **" + maxDurability + "** durability :no_entry:").queue();
return;
}
durability = amount;
}
String acceptId = new CustomButtonId.Builder().setType(ButtonType.PICKAXE_REPAIR_CONFIRM).setTimeout(60).setOwners(event.getAuthor().getIdLong()).setArguments(item.getId(), pickaxe.getId(), pickaxe.getDurability(), durability).getId();
String rejectId = new CustomButtonId.Builder().setType(ButtonType.GENERIC_REJECT).setTimeout(60).setOwners(event.getAuthor().getIdLong()).getId();
List<Button> buttons = List.of(Button.success(acceptId, "Yes"), Button.danger(rejectId, "No"));
int itemCount = (int) Math.ceil((((double) pickaxe.getPrice() / item.getPrice()) / pickaxe.getMaxDurability()) * durability);
event.reply("It will cost you `" + itemCount + " " + item.getName() + "` to repair your pickaxe by **" + durability + "** durability, are you sure you want to repair it?").setActionRow(buttons).queue();
}
use of com.jockie.bot.core.command.Command in project Sx4 by sx4-discord-bot.
the class PickaxeCommand method upgrades.
@Command(value = "upgrades", description = "View all the upgrades you can use on a pickaxe")
@CommandId(428)
@Examples({ "pickaxe upgrades" })
public void upgrades(Sx4CommandEvent event) {
EnumSet<Upgrade> upgrades = Upgrade.getUpgrades(ItemType.PICKAXE);
PagedResult<Upgrade> paged = new PagedResult<>(event.getBot(), Arrays.asList(upgrades.toArray(Upgrade[]::new))).setPerPage(3).setCustomFunction(page -> {
EmbedBuilder embed = new EmbedBuilder().setTitle("Pickaxe Upgrades");
page.forEach((upgrade, index) -> embed.addField(upgrade.getName(), upgrade.getDescription(), false));
return new MessageBuilder().setEmbeds(embed.build());
});
paged.execute(event);
}
use of com.jockie.bot.core.command.Command in project Sx4 by sx4-discord-bot.
the class ShopCommand method list.
@Command(value = "list", description = "View what items the bot has")
@CommandId(455)
@Examples({ "shop list" })
public void list(Sx4CommandEvent event) {
List<Bson> pipeline = List.of(Aggregates.match(Filters.and(Filters.eq("userId", event.getSelfUser().getIdLong()), Filters.ne("amount", 0))), Aggregates.project(Projections.fields(Projections.computed("name", "$item.name"), Projections.computed("type", "$item.type"), Projections.include("item", "amount"))), Aggregates.sort(Sorts.descending("amount")));
event.getMongo().aggregateItems(pipeline).whenComplete((items, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
EmbedBuilder embed = new EmbedBuilder().setAuthor("Shop List", null, event.getSelfUser().getEffectiveAvatarUrl()).setColor(event.getSelfMember().getColorRaw());
if (items.isEmpty()) {
event.replyFailure("That user does not have any items").queue();
return;
}
Map<ItemType, StringJoiner> types = new HashMap<>();
for (Document item : items) {
ItemType type = ItemType.fromId(item.getInteger("type"));
ItemStack<?> stack = new ItemStack<>(event.getBot().getEconomyManager(), item);
types.compute(type, (key, value) -> (value == null ? new StringJoiner("\n") : value).add(stack.toString()));
}
types.forEach((type, joiner) -> embed.addField(type.getName(), joiner.toString(), true));
event.reply(embed.build()).queue();
});
}
use of com.jockie.bot.core.command.Command in project Sx4 by sx4-discord-bot.
the class MarriageCommand method add.
@Command(value = "add", description = "Propose to a user and marry them if they accept")
@CommandId(268)
@Redirects({ "marry" })
@Examples({ "marriage add @Shea#6653", "marriage add Shea", "marriage add 402557516728369153" })
public void add(Sx4CommandEvent event, @Argument(value = "user", endless = true) Member member) {
User author = event.getAuthor();
if (member.getUser().isBot()) {
event.replyFailure("You cannot marry bots").queue();
return;
}
Bson checkFilter = Filters.or(Filters.eq("proposerId", author.getIdLong()), Filters.eq("partnerId", author.getIdLong()), Filters.eq("proposerId", member.getIdLong()), Filters.eq("partnerId", member.getIdLong()));
List<Document> marriages = event.getMongo().getMarriages(checkFilter, Projections.include("partnerId", "proposerId")).into(new ArrayList<>());
long userCount = marriages.stream().filter(d -> d.getLong("proposerId") == author.getIdLong() || d.getLong("partnerId") == author.getIdLong()).count();
if (userCount >= 5) {
event.removeCooldown();
event.replyFailure("You cannot marry more than 5 users").queue();
return;
}
long memberCount = marriages.stream().filter(d -> d.getLong("proposerId") == member.getIdLong() || d.getLong("partnerId") == member.getIdLong()).count();
if (memberCount >= 5) {
event.removeCooldown();
event.replyFailure("That user is already married to 5 users").queue();
return;
}
String acceptId = new CustomButtonId.Builder().setType(ButtonType.MARRIAGE_CONFIRM).setTimeout(60).setOwners(member.getIdLong()).setArguments(author.getIdLong()).getId();
String rejectId = new CustomButtonId.Builder().setType(ButtonType.MARRIAGE_REJECT).setTimeout(60).setOwners(member.getIdLong()).setArguments(author.getIdLong()).getId();
List<Button> buttons = List.of(Button.success(acceptId, "Yes"), Button.danger(rejectId, "No"));
event.reply(member.getAsMention() + ", **" + author.getName() + "** would like to marry you! Do you accept?").allowedMentions(EnumSet.of(Message.MentionType.USER)).setActionRow(buttons).queue();
}
use of com.jockie.bot.core.command.Command in project Sx4 by sx4-discord-bot.
the class MarriageCommand method remove.
@Command(value = "remove", description = "Divorce someone you are currently married to")
@CommandId(269)
@Redirects({ "divorce" })
@Examples({ "marriage remove @Shea#6653", "marriage remove Shea", "marriage remove all" })
public void remove(Sx4CommandEvent event, @Argument(value = "user | all", endless = true, nullDefault = true) @AlternativeOptions("all") Alternative<Member> option) {
User author = event.getAuthor();
if (option == null) {
Bson filter = Filters.or(Filters.eq("proposerId", author.getIdLong()), Filters.eq("partnerId", author.getIdLong()));
List<Document> marriages = event.getMongo().getMarriages(filter, Projections.include("proposerId", "partnerId")).into(new ArrayList<>());
if (marriages.isEmpty()) {
event.replyFailure("You are not married to anyone").queue();
return;
}
List<Long> userIds = marriages.stream().map(marriage -> {
long partnerId = marriage.getLong("partnerId");
return partnerId == author.getIdLong() ? marriage.getLong("proposerId") : partnerId;
}).collect(Collectors.toList());
PagedResult<Long> paged = new PagedResult<>(event.getBot(), userIds).setAuthor("Divorce", null, author.getEffectiveAvatarUrl()).setTimeout(60).setDisplayFunction(userId -> {
User other = event.getShardManager().getUserById(userId);
return (other == null ? "Anonymous#0000" : other.getAsTag()) + " (" + userId + ")";
});
paged.onTimeout(() -> event.reply("Timed out :stopwatch:").queue());
paged.onSelect(select -> {
long userId = select.getSelected();
Bson deleteFilter = Filters.or(Filters.and(Filters.eq("proposerId", userId), Filters.eq("partnerId", author.getIdLong())), Filters.and(Filters.eq("proposerId", author.getIdLong()), Filters.eq("partnerId", userId)));
event.getMongo().deleteMarriage(deleteFilter).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
User user = event.getShardManager().getUserById(userId);
event.replySuccess("You are no longer married to **" + (user == null ? "Anonymous#0000" : user.getAsTag()) + "**").queue();
});
});
paged.execute(event);
} else if (option.isAlternative()) {
String acceptId = new CustomButtonId.Builder().setType(ButtonType.DIVORCE_ALL_CONFIRM).setTimeout(60).setOwners(author.getIdLong()).getId();
String rejectId = new CustomButtonId.Builder().setType(ButtonType.GENERIC_REJECT).setTimeout(60).setOwners(author.getIdLong()).getId();
event.reply(author.getName() + ", are you sure you want to divorce everyone you are currently married to?").setActionRow(List.of(Button.success(acceptId, "Yes"), Button.danger(rejectId, "No"))).queue();
} else {
Member member = option.getValue();
Bson filter = Filters.or(Filters.and(Filters.eq("proposerId", member.getIdLong()), Filters.eq("partnerId", author.getIdLong())), Filters.and(Filters.eq("proposerId", author.getIdLong()), Filters.eq("partnerId", member.getIdLong())));
event.getMongo().deleteMarriage(filter).whenComplete((result, exception) -> {
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
if (result.getDeletedCount() == 0) {
event.replyFailure("You are not married to that user").queue();
return;
}
event.replySuccess("You are no longer married to **" + member.getUser().getAsTag() + "**").queue();
});
}
}
Aggregations