From 886a17621e357129936f8b8f8c6dd4dbe9b0bdab Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 22 Oct 2024 14:15:49 +0200 Subject: [PATCH 1/2] TRANSAKCE --- .../mineconomiaCoreV2/MineconomiaCoreV2.java | 2 - .../database/DatabaseUtil.java | 11 +- .../mineconomiaCoreV2/events/PlayerInit.java | 3 +- .../mineconomiaCoreV2/variables/Group.java | 66 ++++++++ .../variables/GroupMembership.java | 41 +++++ .../mineconomiaCoreV2/variables/Island.java | 8 +- .../variables/PlayerData.java | 48 +++++- .../mineconomiaCoreV2/variables/Shop.java | 29 ++-- .../variables/Transaction.java | 142 +++++++++++++++++- 9 files changed, 315 insertions(+), 35 deletions(-) create mode 100644 src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Group.java create mode 100644 src/main/java/xyz/soukup/mineconomiaCoreV2/variables/GroupMembership.java diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java index 466a06e..1511ecc 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/MineconomiaCoreV2.java @@ -24,8 +24,6 @@ public final class MineconomiaCoreV2 extends JavaPlugin { private static MineconomiaCoreV2 instance; - public static HashMap playersData = new HashMap<>(); - @Override public void onEnable() { // Plugin startup logic diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/database/DatabaseUtil.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/DatabaseUtil.java index 24242e7..2f17b26 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/database/DatabaseUtil.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/database/DatabaseUtil.java @@ -6,10 +6,7 @@ import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.jdbc.JdbcConnectionSource; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; -import xyz.soukup.mineconomiaCoreV2.variables.Island; -import xyz.soukup.mineconomiaCoreV2.variables.PlayerData; -import xyz.soukup.mineconomiaCoreV2.variables.Shop; -import xyz.soukup.mineconomiaCoreV2.variables.Transaction; +import xyz.soukup.mineconomiaCoreV2.variables.*; import java.sql.SQLException; @@ -21,6 +18,8 @@ public class DatabaseUtil { public static Dao islandDao; public static Dao shopDao; public static Dao transactionDao; + public static Dao groupDao; + public static Dao groupMembershipDao; public static ConnectionSource getConnectionSource() throws SQLException { String host = config.getString("database.host"); @@ -39,6 +38,8 @@ public class DatabaseUtil { TableUtils.createTableIfNotExists(connectionSource, Transaction.class); TableUtils.createTableIfNotExists(connectionSource, Island.class); TableUtils.createTableIfNotExists(connectionSource, Shop.class); + TableUtils.createTableIfNotExists(connectionSource, Group.class); + TableUtils.createTableIfNotExists(connectionSource, GroupMembership.class); } public static void daoInit(ConnectionSource connectionSource) throws SQLException { @@ -46,6 +47,8 @@ public class DatabaseUtil { playerDataDao = DaoManager.createDao(connectionSource, PlayerData.class); shopDao = DaoManager.createDao(connectionSource, Shop.class); transactionDao = DaoManager.createDao(connectionSource, Transaction.class); + groupDao = DaoManager.createDao(connectionSource, Group.class); + groupMembershipDao = DaoManager.createDao(connectionSource, GroupMembership.class); } public static void databaseInit() throws SQLException { diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/events/PlayerInit.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/events/PlayerInit.java index 40c1ba6..b2e470f 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/events/PlayerInit.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/events/PlayerInit.java @@ -10,9 +10,8 @@ import xyz.soukup.mineconomiaCoreV2.variables.PlayerData; import java.sql.SQLException; -import static xyz.soukup.mineconomiaCoreV2.MineconomiaCoreV2.playersData; -import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.logger; import static xyz.soukup.mineconomiaCoreV2.database.DatabaseUtil.playerDataDao; +import static xyz.soukup.mineconomiaCoreV2.variables.PlayerData.playersData; public class PlayerInit implements Listener { diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Group.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Group.java new file mode 100644 index 0000000..7f3708c --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Group.java @@ -0,0 +1,66 @@ +package xyz.soukup.mineconomiaCoreV2.variables; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.table.DatabaseTable; + +import java.sql.SQLException; + +import static xyz.soukup.mineconomiaCoreV2.database.DatabaseUtil.groupDao; + +@DatabaseTable(tableName = "groups") +public class Group { + + @DatabaseField(generatedId = true) + private int id; + + @DatabaseField(unique = true) + private String name; + + @DatabaseField(canBeNull = false) + private String owner; + + @DatabaseField(canBeNull = false) + private float money; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public float getMoney() { + return money; + } + + public void setMoney(float money) { + this.money = money; + } + + public static Group getGroup(String name) throws SQLException { + QueryBuilder queryBuilder = groupDao.queryBuilder(); + return queryBuilder.where().eq("name", name).queryForFirst(); + } + + public void save() throws SQLException { + groupDao.update(this); + } +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/GroupMembership.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/GroupMembership.java new file mode 100644 index 0000000..d05884d --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/GroupMembership.java @@ -0,0 +1,41 @@ +package xyz.soukup.mineconomiaCoreV2.variables; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "group_memberships") +public class GroupMembership { + + @DatabaseField(generatedId = true) + private int id; + + @DatabaseField(canBeNull = false) + private String group; + + @DatabaseField(canBeNull = false) + private String member; + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public String getMember() { + return member; + } + + public void setMember(String member) { + this.member = member; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Island.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Island.java index 71e70f6..eb43dad 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Island.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Island.java @@ -9,16 +9,16 @@ public class Island { @DatabaseField(generatedId = true) private int id; - @DatabaseField + @DatabaseField(canBeNull = false) private String server; - @DatabaseField + @DatabaseField(canBeNull = false) private String name; - @DatabaseField + @DatabaseField(canBeNull = false) private String owner; - @DatabaseField + @DatabaseField(canBeNull = false) private String world; @DatabaseField(columnName = "size_x") diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java index b890ea3..06b8484 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/PlayerData.java @@ -3,26 +3,37 @@ package xyz.soukup.mineconomiaCoreV2.variables; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; +import java.sql.SQLException; +import java.util.HashMap; + +import static xyz.soukup.mineconomiaCoreV2.database.DatabaseUtil.playerDataDao; + //Definování Member classy pro databázi a další manipulace @DatabaseTable(tableName = "players") public class PlayerData { + public static HashMap playersData = new HashMap<>(); + @DatabaseField(generatedId = true) private int id; - @DatabaseField(unique = true) + @DatabaseField(unique = true, canBeNull = false) private String nickname; @DatabaseField private int online; - @DatabaseField + @DatabaseField(canBeNull = false) private float money; + @DatabaseField + private String discord; + public int getId() { return id; @@ -56,7 +67,38 @@ public class PlayerData { this.money = money; } - public PlayerData(){ + public String getDiscord() { + return discord; + } + + public void setDiscord(String discord) { + this.discord = discord; + } + + public static PlayerData getPlayerData(String nickname) throws SQLException { + PlayerData playerData = null; + Player player = Bukkit.getPlayer(nickname); + + if (player != null){ + playerData = playersData.get(player); + } + + if (playerData == null){ + playerData = playerDataDao.queryBuilder().where().eq("nickname", nickname).queryForFirst(); + } + + return playerData; + } + + public void save() throws SQLException { + Player player = Bukkit.getPlayer(this.getNickname()); + + if (player != null){ + playersData.put(player, this); + return; + } + + playerDataDao.update(this); } diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Shop.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Shop.java index 2fe8ace..a7bd5fb 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Shop.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Shop.java @@ -8,43 +8,46 @@ public class Shop { @DatabaseField(generatedId = true) private int id; - @DatabaseField + @DatabaseField(canBeNull = false) private String server; - @DatabaseField + @DatabaseField(canBeNull = false) private String owner; - @DatabaseField(columnName = "owner_type") + @DatabaseField(columnName = "owner_type", canBeNull = false) private String ownerType; - @DatabaseField - private String type; + @DatabaseField(columnName = "price_sell", canBeNull = false) + private String priceSell; - @DatabaseField - private float price; + @DatabaseField(columnName = "price_buy", canBeNull = false) + private float priceBuy; @DatabaseField private int stock; @DatabaseField + private int space; + + @DatabaseField(canBeNull = false) private int x; - @DatabaseField + @DatabaseField(canBeNull = false) private int y; - @DatabaseField + @DatabaseField(canBeNull = false) private int z; - @DatabaseField + @DatabaseField(canBeNull = false) private int world; - @DatabaseField(columnName = "storage_x") + @DatabaseField(columnName = "storage_x", canBeNull = false) private int storageX; - @DatabaseField(columnName = "storage_y") + @DatabaseField(columnName = "storage_y", canBeNull = false) private int storageY; - @DatabaseField(columnName = "storage_z") + @DatabaseField(columnName = "storage_z", canBeNull = false) private int storageZ; diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java index 4fa4eb4..9ec89b6 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java @@ -2,36 +2,46 @@ package xyz.soukup.mineconomiaCoreV2.variables; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; +import org.bukkit.entity.Player; +import java.sql.SQLException; import java.util.Date; +import static xyz.soukup.mineconomiaCoreV2.database.DatabaseUtil.transactionDao; + @DatabaseTable(tableName = "transactions") public class Transaction { @DatabaseField(generatedId = true) private int id; - @DatabaseField + @DatabaseField(canBeNull = false) private Date date; - @DatabaseField + @DatabaseField(canBeNull = false) private String type; - @DatabaseField + @DatabaseField(canBeNull = false) private float amount; - @DatabaseField + @DatabaseField(canBeNull = false) private String sender; - @DatabaseField(columnName = "sender_type") + @DatabaseField(columnName = "sender_type", canBeNull = false) private String senderType; - @DatabaseField + @DatabaseField(canBeNull = false) private String receiver; - @DatabaseField(columnName = "receiver_type") + @DatabaseField(columnName = "receiver_type", canBeNull = false) private String receiverType; + @DatabaseField + private String s1; + + @DatabaseField + private String s2; + public int getId() { return id; } @@ -96,5 +106,123 @@ public class Transaction { this.receiverType = receiverType; } + public String getS1(){ + return s1; + } + + public void setS1(String s1){ + this.s1 = s1; + } + + public String getS2(){ + return s2; + } + + public void setS2(String s2){ + this.s2 = s2; + } + + public Boolean senderHasEnough() throws SQLException { + switch (this.senderType){ + case "server": + return true; + case "group": + Group group = Group.getGroup(this.sender); + + if (group == null){ + return false; + } + + return group.getMoney() >= this.amount; + + case "player": + PlayerData playerData = PlayerData.getPlayerData(this.sender); + + if (playerData == null){ + return false; + } + + return playerData.getMoney() >= this.amount; + + default: + return false; + + + } + } + + public void process() throws SQLException { + + float money; + + switch (this.senderType){ + case "server": + break; + case "player": + PlayerData playerData = PlayerData.getPlayerData(this.sender); + money = playerData.getMoney(); + playerData.setMoney(money - amount); + playerData.save(); + break; + case "group": + Group group = Group.getGroup(this.sender); + money = group.getMoney(); + group.setMoney(money - amount); + group.save(); + } + + switch (this.receiverType){ + case "server": + break; + case "player": + PlayerData playerData = PlayerData.getPlayerData(this.receiver); + money = playerData.getMoney(); + playerData.setMoney(money + amount); + playerData.save(); + break; + case "group": + Group group = Group.getGroup(this.receiver); + money = group.getMoney(); + group.setMoney(money + amount); + group.save(); + } + + this.setDate(new Date()); + + transactionDao.create(this); + } + + public Boolean processIfSenderHasEnough() throws SQLException { + if (this.senderHasEnough()){ + this.process(); + return true; + } + return false; + }; + + public static Transaction prepareTransaction(String sender, String senderType, String receiver, String receiverType, Float amount, String type){ + Transaction transaction = new Transaction(); + + transaction.setSender(sender); + transaction.setSenderType(senderType); + transaction.setReceiver(receiver); + transaction.setReceiverType(receiverType); + transaction.setAmount(amount); + transaction.setType(type); + + return transaction; + } + + public static Transaction prepareTransaction(String sender, String senderType, String receiver, String receiverType, Float amount, String type, String s1){ + Transaction transaction = prepareTransaction(sender, senderType, receiver, receiverType, amount, type); + transaction.setS1(s1); + return transaction; + } + public static Transaction prepareTransaction(String sender, String senderType, String receiver, String receiverType, Float amount, String type, String s1, String s2){ + Transaction transaction = prepareTransaction(sender, senderType, receiver, receiverType, amount, type, s1); + transaction.setS2(s2); + return transaction; + } + } From db73025bfba06a5c21a525c44b048d554ad6107f Mon Sep 17 00:00:00 2001 From: jakub Date: Sat, 26 Oct 2024 18:56:18 +0200 Subject: [PATCH 2/2] TRANSAKCE --- .../mineconomiaCoreV2/commands/admin.java | 89 +++++++++++++------ .../mineconomiaCoreV2/commands/money.java | 21 +++++ .../variables/Transaction.java | 8 ++ src/main/resources/lang/czech.yml | 4 +- src/main/resources/plugin.yml | 12 ++- 5 files changed, 102 insertions(+), 32 deletions(-) create mode 100644 src/main/java/xyz/soukup/mineconomiaCoreV2/commands/money.java diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/admin.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/admin.java index ac572c7..a2e34f6 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/admin.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/admin.java @@ -1,5 +1,6 @@ package xyz.soukup.mineconomiaCoreV2.commands; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,8 +13,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.soukup.mineconomiaCoreV2.tools.LangManager; import xyz.soukup.mineconomiaCoreV2.tools.PDC; +import xyz.soukup.mineconomiaCoreV2.variables.Transaction; import java.io.IOException; +import java.sql.SQLException; import java.util.List; import static xyz.soukup.mineconomiaCoreV2.core.sharedValues.config; @@ -22,42 +25,31 @@ public class admin implements TabExecutor { @Override public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { - if (commandSender instanceof Player) { - Player player = (Player) commandSender; - if (!player.isOp() || strings.length == 0) { - - LangManager.message(commandSender, "error.command.admin.setruleritem.no-permissions"); - return true; + if (!commandSender.isOp()) { + LangManager.message(commandSender, "error.command.no-permissions"); + return false; } - if (strings[0].equalsIgnoreCase("setRulerItem")) { - - ItemStack playerHand = player.getInventory().getItemInMainHand(); - - if (playerHand.getType() == Material.AIR) { + if (strings.length == 0){ + LangManager.message(commandSender, "error.command.not-enough-arguments"); + } - LangManager.message(commandSender, "error.command.admin.setruleritem.invalid-item"); + switch (strings[0].toLowerCase()){ + case "setruleritem": + setRulerItem(commandSender); + return true; + case "givemoney": + try { + giveMoney(commandSender, strings); + } catch (SQLException e) { + throw new RuntimeException(e); + } return true; - } - - ItemMeta meta = playerHand.getItemMeta(); - PDC.WriteItemMetaPDC(meta, "ruler", PersistentDataType.INTEGER, 1); - playerHand.setItemMeta(meta); - - config.set("special-items.ruler", playerHand); - - try { - config.save("config.yml"); - } catch (IOException e) { - throw new RuntimeException(e); - } - LangManager.message(commandSender, "success.command.admin.setruleritem"); - return true; } - } + return false; } @@ -65,9 +57,48 @@ public class admin implements TabExecutor { public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { if (strings.length == 1 && commandSender.isOp()) { - return List.of("setRulerItem"); + return List.of("setRulerItem", "giveMoney"); } return List.of(); } + + private void giveMoney(CommandSender commandSender, String[] strings) throws SQLException { + if (strings.length < 3){ + LangManager.message(commandSender, "error.command.not-enough-arguments"); + return; + } + + Float amount = Float.valueOf(strings[2]); + + Transaction.prepareTransaction("server", "server", strings[1], "player", amount, "admin").process(); + LangManager.message(commandSender, "success.command.admin.give-money"); + } + + private void setRulerItem(CommandSender commandSender){ + Player player = (Player) commandSender; + + ItemStack playerHand = player.getInventory().getItemInMainHand(); + + if (playerHand.getType() == Material.AIR) { + LangManager.message(commandSender, "error.command.admin.setruleritem.invalid-item"); + return; + } + + ItemMeta meta = playerHand.getItemMeta(); + assert meta != null; + PDC.WriteItemMetaPDC(meta, "ruler", PersistentDataType.INTEGER, 1); + playerHand.setItemMeta(meta); + + config.set("special-items.ruler", playerHand); + + try { + config.save("config.yml"); + } catch (IOException e) { + throw new RuntimeException(e); + } + + LangManager.message(commandSender, "success.command.admin.setruleritem"); + + } } diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/money.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/money.java new file mode 100644 index 0000000..743d0e2 --- /dev/null +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/commands/money.java @@ -0,0 +1,21 @@ +package xyz.soukup.mineconomiaCoreV2.commands; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class money implements TabExecutor { + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { + return false; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { + return List.of(); + } +} diff --git a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java index 9ec89b6..6faed2e 100644 --- a/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java +++ b/src/main/java/xyz/soukup/mineconomiaCoreV2/variables/Transaction.java @@ -224,5 +224,13 @@ public class Transaction { return transaction; } + public static Transaction prepareTransaction(Player senderPlayer, Player receiverPlayer, Float amount){ + String sender = senderPlayer.getDisplayName(); + String receiver = receiverPlayer.getDisplayName(); + + return prepareTransaction(sender, "player", receiver, "player", amount, "playertoplayer"); + } + + } diff --git a/src/main/resources/lang/czech.yml b/src/main/resources/lang/czech.yml index 1139f72..090088a 100644 --- a/src/main/resources/lang/czech.yml +++ b/src/main/resources/lang/czech.yml @@ -5,6 +5,8 @@ error: wrong-argument-count: "&cNesprávný počet parametrů!" no-permissions: "&cNemáš oprávnění!" invalid-player: "&cTento hráč neexistuje!" + invalid-arguments: "&cChybně zadané parametry!" + not-enough-arguments: "&cNedostatek parametrů!" tpw: invalid-world: "&cTento svět neexistuje!" already-in-world-self: "&cJiž jsi v tomto světě" @@ -12,7 +14,7 @@ error: admin: setruleritem: invalid-item: "&cNedržíš nic v ruce!" - no-permissions: "&cNemáš oprávnění!" + success: command: tpw: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1ee1bde..ba8fe2e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,9 +5,17 @@ api-version: '1.21' commands: tpw: description: "Teleportuje tě do jiného světa" - usage: / [arguments] + usage: /tpw [player] tractor: description: "blieat" admin: description: "Utility command pro adminy" - usage: / [arguments] + usage: /admin + money: + description: "check current money balance" + usage: /money [player] + aliases: [penize, peníze, balance] + pay: + description: "let go of your money :D" + usage: /pay [group name] + aliases: [zaplatit, platit]