From e9d7a9791a4bbe818ab5158cae380060f627c8b8 Mon Sep 17 00:00:00 2001 From: okx-code Date: Sat, 1 Sep 2018 23:50:57 +0100 Subject: [PATCH] remove stats system improve operations and make them extendable more easily and let other plugins add operations, like requirements move requirements/operations out of ranks class as they will be used in prestiges --- src/main/java/sh/okx/rankup/Metrics.java | 724 +++++++++--------- src/main/java/sh/okx/rankup/Rankup.java | 34 +- src/main/java/sh/okx/rankup/Stats.java | 55 -- .../sh/okx/rankup/commands/InfoCommand.java | 5 +- src/main/java/sh/okx/rankup/gui/Gui.java | 2 +- .../okx/rankup/placeholders/Placeholders.java | 2 +- .../java/sh/okx/rankup/prestige/Prestige.java | 4 + src/main/java/sh/okx/rankup/ranks/Rank.java | 41 +- .../requirements/DeductibleRequirement.java | 2 +- .../sh/okx/rankup/requirements/Operation.java | 7 + .../requirements/OperationRegistry.java | 15 + .../rankup/requirements/ReducerOperation.java | 12 + .../{ranks => }/requirements/Requirement.java | 2 +- .../requirements/RequirementRegistry.java | 2 +- .../requirements/operation/AllOperation.java | 10 + .../requirements/operation/AnyOperation.java | 10 + .../requirements/operation/NoneOperation.java | 10 + .../requirements/operation/OneOperation.java | 10 + .../requirement}/GroupRequirement.java | 3 +- .../requirement}/MoneyRequirement.java | 4 +- .../PlaytimeMinutesRequirement.java | 3 +- .../requirement}/XpLevelRequirement.java | 4 +- src/main/resources/config.yml | 4 - src/main/resources/plugin.yml | 5 +- src/main/resources/prestiges.yml | 20 + src/main/resources/rankups.yml | 10 +- 26 files changed, 513 insertions(+), 487 deletions(-) delete mode 100644 src/main/java/sh/okx/rankup/Stats.java create mode 100644 src/main/java/sh/okx/rankup/prestige/Prestige.java rename src/main/java/sh/okx/rankup/{ranks => }/requirements/DeductibleRequirement.java (94%) create mode 100644 src/main/java/sh/okx/rankup/requirements/Operation.java create mode 100644 src/main/java/sh/okx/rankup/requirements/OperationRegistry.java create mode 100644 src/main/java/sh/okx/rankup/requirements/ReducerOperation.java rename src/main/java/sh/okx/rankup/{ranks => }/requirements/Requirement.java (97%) rename src/main/java/sh/okx/rankup/{ranks => }/requirements/RequirementRegistry.java (93%) create mode 100644 src/main/java/sh/okx/rankup/requirements/operation/AllOperation.java create mode 100644 src/main/java/sh/okx/rankup/requirements/operation/AnyOperation.java create mode 100644 src/main/java/sh/okx/rankup/requirements/operation/NoneOperation.java create mode 100644 src/main/java/sh/okx/rankup/requirements/operation/OneOperation.java rename src/main/java/sh/okx/rankup/{ranks/requirements => requirements/requirement}/GroupRequirement.java (88%) rename src/main/java/sh/okx/rankup/{ranks/requirements => requirements/requirement}/MoneyRequirement.java (85%) rename src/main/java/sh/okx/rankup/{ranks/requirements => requirements/requirement}/PlaytimeMinutesRequirement.java (92%) rename src/main/java/sh/okx/rankup/{ranks/requirements => requirements/requirement}/XpLevelRequirement.java (82%) create mode 100644 src/main/resources/prestiges.yml diff --git a/src/main/java/sh/okx/rankup/Metrics.java b/src/main/java/sh/okx/rankup/Metrics.java index fba3376..29075ff 100644 --- a/src/main/java/sh/okx/rankup/Metrics.java +++ b/src/main/java/sh/okx/rankup/Metrics.java @@ -112,6 +112,61 @@ public class Metrics { } } + /** + * Sends the data to the bStats server. + * + * @param data The data to send. + * @throws Exception If the request failed. + */ + private static void sendData(JSONObject data) throws Exception { + if (data == null) { + throw new IllegalArgumentException("Data cannot be null!"); + } + if (Bukkit.isPrimaryThread()) { + throw new IllegalAccessException("This method must not be called from the main thread!"); + } + HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); + + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + + // Add headers + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format + connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); + + // Send data + connection.setDoOutput(true); + DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); + outputStream.write(compressedData); + outputStream.flush(); + outputStream.close(); + + connection.getInputStream().close(); // We don't care about the response - Just send our data :) + } + + /** + * Gzips the given String. + * + * @param str The string to gzip. + * @return The gzipped String. + * @throws IOException If the compression failed. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + GZIPOutputStream gzip = new GZIPOutputStream(outputStream); + gzip.write(str.getBytes("UTF-8")); + gzip.close(); + return outputStream.toByteArray(); + } + /** * Adds a custom chart. * @@ -257,58 +312,318 @@ public class Metrics { } /** - * Sends the data to the bStats server. - * - * @param data The data to send. - * @throws Exception If the request failed. + * A enum which is used for custom maps. */ - private static void sendData(JSONObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); + public enum Country { + + /** + * bStats will use the country of the server. + */ + AUTO_DETECT("AUTO", "Auto Detected"), + + ANDORRA("AD", "Andorra"), + UNITED_ARAB_EMIRATES("AE", "United Arab Emirates"), + AFGHANISTAN("AF", "Afghanistan"), + ANTIGUA_AND_BARBUDA("AG", "Antigua and Barbuda"), + ANGUILLA("AI", "Anguilla"), + ALBANIA("AL", "Albania"), + ARMENIA("AM", "Armenia"), + NETHERLANDS_ANTILLES("AN", "Netherlands Antilles"), + ANGOLA("AO", "Angola"), + ANTARCTICA("AQ", "Antarctica"), + ARGENTINA("AR", "Argentina"), + AMERICAN_SAMOA("AS", "American Samoa"), + AUSTRIA("AT", "Austria"), + AUSTRALIA("AU", "Australia"), + ARUBA("AW", "Aruba"), + ÅLAND_ISLANDS("AX", "Åland Islands"), + AZERBAIJAN("AZ", "Azerbaijan"), + BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"), + BARBADOS("BB", "Barbados"), + BANGLADESH("BD", "Bangladesh"), + BELGIUM("BE", "Belgium"), + BURKINA_FASO("BF", "Burkina Faso"), + BULGARIA("BG", "Bulgaria"), + BAHRAIN("BH", "Bahrain"), + BURUNDI("BI", "Burundi"), + BENIN("BJ", "Benin"), + SAINT_BARTHÉLEMY("BL", "Saint Barthélemy"), + BERMUDA("BM", "Bermuda"), + BRUNEI("BN", "Brunei"), + BOLIVIA("BO", "Bolivia"), + BONAIRE_SINT_EUSTATIUS_AND_SABA("BQ", "Bonaire, Sint Eustatius and Saba"), + BRAZIL("BR", "Brazil"), + BAHAMAS("BS", "Bahamas"), + BHUTAN("BT", "Bhutan"), + BOUVET_ISLAND("BV", "Bouvet Island"), + BOTSWANA("BW", "Botswana"), + BELARUS("BY", "Belarus"), + BELIZE("BZ", "Belize"), + CANADA("CA", "Canada"), + COCOS_ISLANDS("CC", "Cocos Islands"), + THE_DEMOCRATIC_REPUBLIC_OF_CONGO("CD", "The Democratic Republic Of Congo"), + CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"), + CONGO("CG", "Congo"), + SWITZERLAND("CH", "Switzerland"), + CÔTE_D_IVOIRE("CI", "Côte d'Ivoire"), + COOK_ISLANDS("CK", "Cook Islands"), + CHILE("CL", "Chile"), + CAMEROON("CM", "Cameroon"), + CHINA("CN", "China"), + COLOMBIA("CO", "Colombia"), + COSTA_RICA("CR", "Costa Rica"), + CUBA("CU", "Cuba"), + CAPE_VERDE("CV", "Cape Verde"), + CURAÇAO("CW", "Curaçao"), + CHRISTMAS_ISLAND("CX", "Christmas Island"), + CYPRUS("CY", "Cyprus"), + CZECH_REPUBLIC("CZ", "Czech Republic"), + GERMANY("DE", "Germany"), + DJIBOUTI("DJ", "Djibouti"), + DENMARK("DK", "Denmark"), + DOMINICA("DM", "Dominica"), + DOMINICAN_REPUBLIC("DO", "Dominican Republic"), + ALGERIA("DZ", "Algeria"), + ECUADOR("EC", "Ecuador"), + ESTONIA("EE", "Estonia"), + EGYPT("EG", "Egypt"), + WESTERN_SAHARA("EH", "Western Sahara"), + ERITREA("ER", "Eritrea"), + SPAIN("ES", "Spain"), + ETHIOPIA("ET", "Ethiopia"), + FINLAND("FI", "Finland"), + FIJI("FJ", "Fiji"), + FALKLAND_ISLANDS("FK", "Falkland Islands"), + MICRONESIA("FM", "Micronesia"), + FAROE_ISLANDS("FO", "Faroe Islands"), + FRANCE("FR", "France"), + GABON("GA", "Gabon"), + UNITED_KINGDOM("GB", "United Kingdom"), + GRENADA("GD", "Grenada"), + GEORGIA("GE", "Georgia"), + FRENCH_GUIANA("GF", "French Guiana"), + GUERNSEY("GG", "Guernsey"), + GHANA("GH", "Ghana"), + GIBRALTAR("GI", "Gibraltar"), + GREENLAND("GL", "Greenland"), + GAMBIA("GM", "Gambia"), + GUINEA("GN", "Guinea"), + GUADELOUPE("GP", "Guadeloupe"), + EQUATORIAL_GUINEA("GQ", "Equatorial Guinea"), + GREECE("GR", "Greece"), + SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS("GS", "South Georgia And The South Sandwich Islands"), + GUATEMALA("GT", "Guatemala"), + GUAM("GU", "Guam"), + GUINEA_BISSAU("GW", "Guinea-Bissau"), + GUYANA("GY", "Guyana"), + HONG_KONG("HK", "Hong Kong"), + HEARD_ISLAND_AND_MCDONALD_ISLANDS("HM", "Heard Island And McDonald Islands"), + HONDURAS("HN", "Honduras"), + CROATIA("HR", "Croatia"), + HAITI("HT", "Haiti"), + HUNGARY("HU", "Hungary"), + INDONESIA("ID", "Indonesia"), + IRELAND("IE", "Ireland"), + ISRAEL("IL", "Israel"), + ISLE_OF_MAN("IM", "Isle Of Man"), + INDIA("IN", "India"), + BRITISH_INDIAN_OCEAN_TERRITORY("IO", "British Indian Ocean Territory"), + IRAQ("IQ", "Iraq"), + IRAN("IR", "Iran"), + ICELAND("IS", "Iceland"), + ITALY("IT", "Italy"), + JERSEY("JE", "Jersey"), + JAMAICA("JM", "Jamaica"), + JORDAN("JO", "Jordan"), + JAPAN("JP", "Japan"), + KENYA("KE", "Kenya"), + KYRGYZSTAN("KG", "Kyrgyzstan"), + CAMBODIA("KH", "Cambodia"), + KIRIBATI("KI", "Kiribati"), + COMOROS("KM", "Comoros"), + SAINT_KITTS_AND_NEVIS("KN", "Saint Kitts And Nevis"), + NORTH_KOREA("KP", "North Korea"), + SOUTH_KOREA("KR", "South Korea"), + KUWAIT("KW", "Kuwait"), + CAYMAN_ISLANDS("KY", "Cayman Islands"), + KAZAKHSTAN("KZ", "Kazakhstan"), + LAOS("LA", "Laos"), + LEBANON("LB", "Lebanon"), + SAINT_LUCIA("LC", "Saint Lucia"), + LIECHTENSTEIN("LI", "Liechtenstein"), + SRI_LANKA("LK", "Sri Lanka"), + LIBERIA("LR", "Liberia"), + LESOTHO("LS", "Lesotho"), + LITHUANIA("LT", "Lithuania"), + LUXEMBOURG("LU", "Luxembourg"), + LATVIA("LV", "Latvia"), + LIBYA("LY", "Libya"), + MOROCCO("MA", "Morocco"), + MONACO("MC", "Monaco"), + MOLDOVA("MD", "Moldova"), + MONTENEGRO("ME", "Montenegro"), + SAINT_MARTIN("MF", "Saint Martin"), + MADAGASCAR("MG", "Madagascar"), + MARSHALL_ISLANDS("MH", "Marshall Islands"), + MACEDONIA("MK", "Macedonia"), + MALI("ML", "Mali"), + MYANMAR("MM", "Myanmar"), + MONGOLIA("MN", "Mongolia"), + MACAO("MO", "Macao"), + NORTHERN_MARIANA_ISLANDS("MP", "Northern Mariana Islands"), + MARTINIQUE("MQ", "Martinique"), + MAURITANIA("MR", "Mauritania"), + MONTSERRAT("MS", "Montserrat"), + MALTA("MT", "Malta"), + MAURITIUS("MU", "Mauritius"), + MALDIVES("MV", "Maldives"), + MALAWI("MW", "Malawi"), + MEXICO("MX", "Mexico"), + MALAYSIA("MY", "Malaysia"), + MOZAMBIQUE("MZ", "Mozambique"), + NAMIBIA("NA", "Namibia"), + NEW_CALEDONIA("NC", "New Caledonia"), + NIGER("NE", "Niger"), + NORFOLK_ISLAND("NF", "Norfolk Island"), + NIGERIA("NG", "Nigeria"), + NICARAGUA("NI", "Nicaragua"), + NETHERLANDS("NL", "Netherlands"), + NORWAY("NO", "Norway"), + NEPAL("NP", "Nepal"), + NAURU("NR", "Nauru"), + NIUE("NU", "Niue"), + NEW_ZEALAND("NZ", "New Zealand"), + OMAN("OM", "Oman"), + PANAMA("PA", "Panama"), + PERU("PE", "Peru"), + FRENCH_POLYNESIA("PF", "French Polynesia"), + PAPUA_NEW_GUINEA("PG", "Papua New Guinea"), + PHILIPPINES("PH", "Philippines"), + PAKISTAN("PK", "Pakistan"), + POLAND("PL", "Poland"), + SAINT_PIERRE_AND_MIQUELON("PM", "Saint Pierre And Miquelon"), + PITCAIRN("PN", "Pitcairn"), + PUERTO_RICO("PR", "Puerto Rico"), + PALESTINE("PS", "Palestine"), + PORTUGAL("PT", "Portugal"), + PALAU("PW", "Palau"), + PARAGUAY("PY", "Paraguay"), + QATAR("QA", "Qatar"), + REUNION("RE", "Reunion"), + ROMANIA("RO", "Romania"), + SERBIA("RS", "Serbia"), + RUSSIA("RU", "Russia"), + RWANDA("RW", "Rwanda"), + SAUDI_ARABIA("SA", "Saudi Arabia"), + SOLOMON_ISLANDS("SB", "Solomon Islands"), + SEYCHELLES("SC", "Seychelles"), + SUDAN("SD", "Sudan"), + SWEDEN("SE", "Sweden"), + SINGAPORE("SG", "Singapore"), + SAINT_HELENA("SH", "Saint Helena"), + SLOVENIA("SI", "Slovenia"), + SVALBARD_AND_JAN_MAYEN("SJ", "Svalbard And Jan Mayen"), + SLOVAKIA("SK", "Slovakia"), + SIERRA_LEONE("SL", "Sierra Leone"), + SAN_MARINO("SM", "San Marino"), + SENEGAL("SN", "Senegal"), + SOMALIA("SO", "Somalia"), + SURINAME("SR", "Suriname"), + SOUTH_SUDAN("SS", "South Sudan"), + SAO_TOME_AND_PRINCIPE("ST", "Sao Tome And Principe"), + EL_SALVADOR("SV", "El Salvador"), + SINT_MAARTEN_DUTCH_PART("SX", "Sint Maarten (Dutch part)"), + SYRIA("SY", "Syria"), + SWAZILAND("SZ", "Swaziland"), + TURKS_AND_CAICOS_ISLANDS("TC", "Turks And Caicos Islands"), + CHAD("TD", "Chad"), + FRENCH_SOUTHERN_TERRITORIES("TF", "French Southern Territories"), + TOGO("TG", "Togo"), + THAILAND("TH", "Thailand"), + TAJIKISTAN("TJ", "Tajikistan"), + TOKELAU("TK", "Tokelau"), + TIMOR_LESTE("TL", "Timor-Leste"), + TURKMENISTAN("TM", "Turkmenistan"), + TUNISIA("TN", "Tunisia"), + TONGA("TO", "Tonga"), + TURKEY("TR", "Turkey"), + TRINIDAD_AND_TOBAGO("TT", "Trinidad and Tobago"), + TUVALU("TV", "Tuvalu"), + TAIWAN("TW", "Taiwan"), + TANZANIA("TZ", "Tanzania"), + UKRAINE("UA", "Ukraine"), + UGANDA("UG", "Uganda"), + UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", "United States Minor Outlying Islands"), + UNITED_STATES("US", "United States"), + URUGUAY("UY", "Uruguay"), + UZBEKISTAN("UZ", "Uzbekistan"), + VATICAN("VA", "Vatican"), + SAINT_VINCENT_AND_THE_GRENADINES("VC", "Saint Vincent And The Grenadines"), + VENEZUELA("VE", "Venezuela"), + BRITISH_VIRGIN_ISLANDS("VG", "British Virgin Islands"), + U_S__VIRGIN_ISLANDS("VI", "U.S. Virgin Islands"), + VIETNAM("VN", "Vietnam"), + VANUATU("VU", "Vanuatu"), + WALLIS_AND_FUTUNA("WF", "Wallis And Futuna"), + SAMOA("WS", "Samoa"), + YEMEN("YE", "Yemen"), + MAYOTTE("YT", "Mayotte"), + SOUTH_AFRICA("ZA", "South Africa"), + ZAMBIA("ZM", "Zambia"), + ZIMBABWE("ZW", "Zimbabwe"); + + private String isoTag; + private String name; + + Country(String isoTag, String name) { + this.isoTag = isoTag; + this.name = name; } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); - outputStream.write(compressedData); - outputStream.flush(); - outputStream.close(); - - connection.getInputStream().close(); // We don't care about the response - Just send our data :) - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { + /** + * Gets a country by it's iso tag. + * + * @param isoTag The iso tag of the county. + * @return The country with the given iso tag or null if unknown. + */ + public static Country byIsoTag(String isoTag) { + for (Country country : Country.values()) { + if (country.getCountryIsoTag().equals(isoTag)) { + return country; + } + } return null; } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(outputStream); - gzip.write(str.getBytes("UTF-8")); - gzip.close(); - return outputStream.toByteArray(); + + /** + * Gets a country by a locale. + * + * @param locale The locale. + * @return The country from the giben locale or null if unknown country or + * if the locale does not contain a country. + */ + public static Country byLocale(Locale locale) { + return byIsoTag(locale.getCountry()); + } + + /** + * Gets the name of the country. + * + * @return The name of the country. + */ + public String getCountryName() { + return name; + } + + /** + * Gets the iso tag of the country. + * + * @return The iso tag of the country. + */ + public String getCountryIsoTag() { + return isoTag; + } + } /** @@ -608,319 +923,4 @@ public class Metrics { } - /** - * A enum which is used for custom maps. - */ - public enum Country { - - /** - * bStats will use the country of the server. - */ - AUTO_DETECT("AUTO", "Auto Detected"), - - ANDORRA("AD", "Andorra"), - UNITED_ARAB_EMIRATES("AE", "United Arab Emirates"), - AFGHANISTAN("AF", "Afghanistan"), - ANTIGUA_AND_BARBUDA("AG", "Antigua and Barbuda"), - ANGUILLA("AI", "Anguilla"), - ALBANIA("AL", "Albania"), - ARMENIA("AM", "Armenia"), - NETHERLANDS_ANTILLES("AN", "Netherlands Antilles"), - ANGOLA("AO", "Angola"), - ANTARCTICA("AQ", "Antarctica"), - ARGENTINA("AR", "Argentina"), - AMERICAN_SAMOA("AS", "American Samoa"), - AUSTRIA("AT", "Austria"), - AUSTRALIA("AU", "Australia"), - ARUBA("AW", "Aruba"), - ÅLAND_ISLANDS("AX", "Åland Islands"), - AZERBAIJAN("AZ", "Azerbaijan"), - BOSNIA_AND_HERZEGOVINA("BA", "Bosnia and Herzegovina"), - BARBADOS("BB", "Barbados"), - BANGLADESH("BD", "Bangladesh"), - BELGIUM("BE", "Belgium"), - BURKINA_FASO("BF", "Burkina Faso"), - BULGARIA("BG", "Bulgaria"), - BAHRAIN("BH", "Bahrain"), - BURUNDI("BI", "Burundi"), - BENIN("BJ", "Benin"), - SAINT_BARTHÉLEMY("BL", "Saint Barthélemy"), - BERMUDA("BM", "Bermuda"), - BRUNEI("BN", "Brunei"), - BOLIVIA("BO", "Bolivia"), - BONAIRE_SINT_EUSTATIUS_AND_SABA("BQ", "Bonaire, Sint Eustatius and Saba"), - BRAZIL("BR", "Brazil"), - BAHAMAS("BS", "Bahamas"), - BHUTAN("BT", "Bhutan"), - BOUVET_ISLAND("BV", "Bouvet Island"), - BOTSWANA("BW", "Botswana"), - BELARUS("BY", "Belarus"), - BELIZE("BZ", "Belize"), - CANADA("CA", "Canada"), - COCOS_ISLANDS("CC", "Cocos Islands"), - THE_DEMOCRATIC_REPUBLIC_OF_CONGO("CD", "The Democratic Republic Of Congo"), - CENTRAL_AFRICAN_REPUBLIC("CF", "Central African Republic"), - CONGO("CG", "Congo"), - SWITZERLAND("CH", "Switzerland"), - CÔTE_D_IVOIRE("CI", "Côte d'Ivoire"), - COOK_ISLANDS("CK", "Cook Islands"), - CHILE("CL", "Chile"), - CAMEROON("CM", "Cameroon"), - CHINA("CN", "China"), - COLOMBIA("CO", "Colombia"), - COSTA_RICA("CR", "Costa Rica"), - CUBA("CU", "Cuba"), - CAPE_VERDE("CV", "Cape Verde"), - CURAÇAO("CW", "Curaçao"), - CHRISTMAS_ISLAND("CX", "Christmas Island"), - CYPRUS("CY", "Cyprus"), - CZECH_REPUBLIC("CZ", "Czech Republic"), - GERMANY("DE", "Germany"), - DJIBOUTI("DJ", "Djibouti"), - DENMARK("DK", "Denmark"), - DOMINICA("DM", "Dominica"), - DOMINICAN_REPUBLIC("DO", "Dominican Republic"), - ALGERIA("DZ", "Algeria"), - ECUADOR("EC", "Ecuador"), - ESTONIA("EE", "Estonia"), - EGYPT("EG", "Egypt"), - WESTERN_SAHARA("EH", "Western Sahara"), - ERITREA("ER", "Eritrea"), - SPAIN("ES", "Spain"), - ETHIOPIA("ET", "Ethiopia"), - FINLAND("FI", "Finland"), - FIJI("FJ", "Fiji"), - FALKLAND_ISLANDS("FK", "Falkland Islands"), - MICRONESIA("FM", "Micronesia"), - FAROE_ISLANDS("FO", "Faroe Islands"), - FRANCE("FR", "France"), - GABON("GA", "Gabon"), - UNITED_KINGDOM("GB", "United Kingdom"), - GRENADA("GD", "Grenada"), - GEORGIA("GE", "Georgia"), - FRENCH_GUIANA("GF", "French Guiana"), - GUERNSEY("GG", "Guernsey"), - GHANA("GH", "Ghana"), - GIBRALTAR("GI", "Gibraltar"), - GREENLAND("GL", "Greenland"), - GAMBIA("GM", "Gambia"), - GUINEA("GN", "Guinea"), - GUADELOUPE("GP", "Guadeloupe"), - EQUATORIAL_GUINEA("GQ", "Equatorial Guinea"), - GREECE("GR", "Greece"), - SOUTH_GEORGIA_AND_THE_SOUTH_SANDWICH_ISLANDS("GS", "South Georgia And The South Sandwich Islands"), - GUATEMALA("GT", "Guatemala"), - GUAM("GU", "Guam"), - GUINEA_BISSAU("GW", "Guinea-Bissau"), - GUYANA("GY", "Guyana"), - HONG_KONG("HK", "Hong Kong"), - HEARD_ISLAND_AND_MCDONALD_ISLANDS("HM", "Heard Island And McDonald Islands"), - HONDURAS("HN", "Honduras"), - CROATIA("HR", "Croatia"), - HAITI("HT", "Haiti"), - HUNGARY("HU", "Hungary"), - INDONESIA("ID", "Indonesia"), - IRELAND("IE", "Ireland"), - ISRAEL("IL", "Israel"), - ISLE_OF_MAN("IM", "Isle Of Man"), - INDIA("IN", "India"), - BRITISH_INDIAN_OCEAN_TERRITORY("IO", "British Indian Ocean Territory"), - IRAQ("IQ", "Iraq"), - IRAN("IR", "Iran"), - ICELAND("IS", "Iceland"), - ITALY("IT", "Italy"), - JERSEY("JE", "Jersey"), - JAMAICA("JM", "Jamaica"), - JORDAN("JO", "Jordan"), - JAPAN("JP", "Japan"), - KENYA("KE", "Kenya"), - KYRGYZSTAN("KG", "Kyrgyzstan"), - CAMBODIA("KH", "Cambodia"), - KIRIBATI("KI", "Kiribati"), - COMOROS("KM", "Comoros"), - SAINT_KITTS_AND_NEVIS("KN", "Saint Kitts And Nevis"), - NORTH_KOREA("KP", "North Korea"), - SOUTH_KOREA("KR", "South Korea"), - KUWAIT("KW", "Kuwait"), - CAYMAN_ISLANDS("KY", "Cayman Islands"), - KAZAKHSTAN("KZ", "Kazakhstan"), - LAOS("LA", "Laos"), - LEBANON("LB", "Lebanon"), - SAINT_LUCIA("LC", "Saint Lucia"), - LIECHTENSTEIN("LI", "Liechtenstein"), - SRI_LANKA("LK", "Sri Lanka"), - LIBERIA("LR", "Liberia"), - LESOTHO("LS", "Lesotho"), - LITHUANIA("LT", "Lithuania"), - LUXEMBOURG("LU", "Luxembourg"), - LATVIA("LV", "Latvia"), - LIBYA("LY", "Libya"), - MOROCCO("MA", "Morocco"), - MONACO("MC", "Monaco"), - MOLDOVA("MD", "Moldova"), - MONTENEGRO("ME", "Montenegro"), - SAINT_MARTIN("MF", "Saint Martin"), - MADAGASCAR("MG", "Madagascar"), - MARSHALL_ISLANDS("MH", "Marshall Islands"), - MACEDONIA("MK", "Macedonia"), - MALI("ML", "Mali"), - MYANMAR("MM", "Myanmar"), - MONGOLIA("MN", "Mongolia"), - MACAO("MO", "Macao"), - NORTHERN_MARIANA_ISLANDS("MP", "Northern Mariana Islands"), - MARTINIQUE("MQ", "Martinique"), - MAURITANIA("MR", "Mauritania"), - MONTSERRAT("MS", "Montserrat"), - MALTA("MT", "Malta"), - MAURITIUS("MU", "Mauritius"), - MALDIVES("MV", "Maldives"), - MALAWI("MW", "Malawi"), - MEXICO("MX", "Mexico"), - MALAYSIA("MY", "Malaysia"), - MOZAMBIQUE("MZ", "Mozambique"), - NAMIBIA("NA", "Namibia"), - NEW_CALEDONIA("NC", "New Caledonia"), - NIGER("NE", "Niger"), - NORFOLK_ISLAND("NF", "Norfolk Island"), - NIGERIA("NG", "Nigeria"), - NICARAGUA("NI", "Nicaragua"), - NETHERLANDS("NL", "Netherlands"), - NORWAY("NO", "Norway"), - NEPAL("NP", "Nepal"), - NAURU("NR", "Nauru"), - NIUE("NU", "Niue"), - NEW_ZEALAND("NZ", "New Zealand"), - OMAN("OM", "Oman"), - PANAMA("PA", "Panama"), - PERU("PE", "Peru"), - FRENCH_POLYNESIA("PF", "French Polynesia"), - PAPUA_NEW_GUINEA("PG", "Papua New Guinea"), - PHILIPPINES("PH", "Philippines"), - PAKISTAN("PK", "Pakistan"), - POLAND("PL", "Poland"), - SAINT_PIERRE_AND_MIQUELON("PM", "Saint Pierre And Miquelon"), - PITCAIRN("PN", "Pitcairn"), - PUERTO_RICO("PR", "Puerto Rico"), - PALESTINE("PS", "Palestine"), - PORTUGAL("PT", "Portugal"), - PALAU("PW", "Palau"), - PARAGUAY("PY", "Paraguay"), - QATAR("QA", "Qatar"), - REUNION("RE", "Reunion"), - ROMANIA("RO", "Romania"), - SERBIA("RS", "Serbia"), - RUSSIA("RU", "Russia"), - RWANDA("RW", "Rwanda"), - SAUDI_ARABIA("SA", "Saudi Arabia"), - SOLOMON_ISLANDS("SB", "Solomon Islands"), - SEYCHELLES("SC", "Seychelles"), - SUDAN("SD", "Sudan"), - SWEDEN("SE", "Sweden"), - SINGAPORE("SG", "Singapore"), - SAINT_HELENA("SH", "Saint Helena"), - SLOVENIA("SI", "Slovenia"), - SVALBARD_AND_JAN_MAYEN("SJ", "Svalbard And Jan Mayen"), - SLOVAKIA("SK", "Slovakia"), - SIERRA_LEONE("SL", "Sierra Leone"), - SAN_MARINO("SM", "San Marino"), - SENEGAL("SN", "Senegal"), - SOMALIA("SO", "Somalia"), - SURINAME("SR", "Suriname"), - SOUTH_SUDAN("SS", "South Sudan"), - SAO_TOME_AND_PRINCIPE("ST", "Sao Tome And Principe"), - EL_SALVADOR("SV", "El Salvador"), - SINT_MAARTEN_DUTCH_PART("SX", "Sint Maarten (Dutch part)"), - SYRIA("SY", "Syria"), - SWAZILAND("SZ", "Swaziland"), - TURKS_AND_CAICOS_ISLANDS("TC", "Turks And Caicos Islands"), - CHAD("TD", "Chad"), - FRENCH_SOUTHERN_TERRITORIES("TF", "French Southern Territories"), - TOGO("TG", "Togo"), - THAILAND("TH", "Thailand"), - TAJIKISTAN("TJ", "Tajikistan"), - TOKELAU("TK", "Tokelau"), - TIMOR_LESTE("TL", "Timor-Leste"), - TURKMENISTAN("TM", "Turkmenistan"), - TUNISIA("TN", "Tunisia"), - TONGA("TO", "Tonga"), - TURKEY("TR", "Turkey"), - TRINIDAD_AND_TOBAGO("TT", "Trinidad and Tobago"), - TUVALU("TV", "Tuvalu"), - TAIWAN("TW", "Taiwan"), - TANZANIA("TZ", "Tanzania"), - UKRAINE("UA", "Ukraine"), - UGANDA("UG", "Uganda"), - UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", "United States Minor Outlying Islands"), - UNITED_STATES("US", "United States"), - URUGUAY("UY", "Uruguay"), - UZBEKISTAN("UZ", "Uzbekistan"), - VATICAN("VA", "Vatican"), - SAINT_VINCENT_AND_THE_GRENADINES("VC", "Saint Vincent And The Grenadines"), - VENEZUELA("VE", "Venezuela"), - BRITISH_VIRGIN_ISLANDS("VG", "British Virgin Islands"), - U_S__VIRGIN_ISLANDS("VI", "U.S. Virgin Islands"), - VIETNAM("VN", "Vietnam"), - VANUATU("VU", "Vanuatu"), - WALLIS_AND_FUTUNA("WF", "Wallis And Futuna"), - SAMOA("WS", "Samoa"), - YEMEN("YE", "Yemen"), - MAYOTTE("YT", "Mayotte"), - SOUTH_AFRICA("ZA", "South Africa"), - ZAMBIA("ZM", "Zambia"), - ZIMBABWE("ZW", "Zimbabwe"); - - private String isoTag; - private String name; - - Country(String isoTag, String name) { - this.isoTag = isoTag; - this.name = name; - } - - /** - * Gets the name of the country. - * - * @return The name of the country. - */ - public String getCountryName() { - return name; - } - - /** - * Gets the iso tag of the country. - * - * @return The iso tag of the country. - */ - public String getCountryIsoTag() { - return isoTag; - } - - /** - * Gets a country by it's iso tag. - * - * @param isoTag The iso tag of the county. - * @return The country with the given iso tag or null if unknown. - */ - public static Country byIsoTag(String isoTag) { - for (Country country : Country.values()) { - if (country.getCountryIsoTag().equals(isoTag)) { - return country; - } - } - return null; - } - - /** - * Gets a country by a locale. - * - * @param locale The locale. - * @return The country from the giben locale or null if unknown country or - * if the locale does not contain a country. - */ - public static Country byLocale(Locale locale) { - return byIsoTag(locale.getCountry()); - } - - } - } \ No newline at end of file diff --git a/src/main/java/sh/okx/rankup/Rankup.java b/src/main/java/sh/okx/rankup/Rankup.java index e13c467..2351fc3 100644 --- a/src/main/java/sh/okx/rankup/Rankup.java +++ b/src/main/java/sh/okx/rankup/Rankup.java @@ -25,15 +25,19 @@ import sh.okx.rankup.messages.Variable; import sh.okx.rankup.placeholders.Placeholders; import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rankups; -import sh.okx.rankup.ranks.requirements.GroupRequirement; -import sh.okx.rankup.ranks.requirements.MoneyRequirement; -import sh.okx.rankup.ranks.requirements.PlaytimeMinutesRequirement; -import sh.okx.rankup.ranks.requirements.Requirement; -import sh.okx.rankup.ranks.requirements.RequirementRegistry; -import sh.okx.rankup.ranks.requirements.XpLevelRequirement; +import sh.okx.rankup.requirements.OperationRegistry; +import sh.okx.rankup.requirements.Requirement; +import sh.okx.rankup.requirements.RequirementRegistry; +import sh.okx.rankup.requirements.operation.AllOperation; +import sh.okx.rankup.requirements.operation.AnyOperation; +import sh.okx.rankup.requirements.operation.NoneOperation; +import sh.okx.rankup.requirements.operation.OneOperation; +import sh.okx.rankup.requirements.requirement.GroupRequirement; +import sh.okx.rankup.requirements.requirement.MoneyRequirement; +import sh.okx.rankup.requirements.requirement.PlaytimeMinutesRequirement; +import sh.okx.rankup.requirements.requirement.XpLevelRequirement; import java.io.File; -import java.io.IOException; import java.text.DecimalFormat; import java.util.List; import java.util.Map; @@ -51,6 +55,8 @@ public class Rankup extends JavaPlugin { @Getter private RequirementRegistry requirementRegistry = new RequirementRegistry(); @Getter + private OperationRegistry operationRegistry = new OperationRegistry(); + @Getter private FileConfiguration messages; @Getter private FileConfiguration config; @@ -58,7 +64,6 @@ public class Rankup extends JavaPlugin { private Rankups rankups; @Getter private Placeholders placeholders; - /** * Players who cannot rankup for a certain amount of time. */ @@ -112,14 +117,6 @@ public class Rankup extends JavaPlugin { getLogger().severe("You may then copy in your config values from the old config."); getLogger().severe("Check the changelog on the Rankup spigot page to see the changes."); } - - if(config.getBoolean("stats")) { - try { - new Stats().init(this); - } catch (IOException e) { - getLogger().warning("Could not connect to stats server"); - } - } } /** @@ -156,6 +153,11 @@ public class Rankup extends JavaPlugin { requirementRegistry.addRequirement(new XpLevelRequirement(this, "xp-level")); requirementRegistry.addRequirement(new PlaytimeMinutesRequirement(this, "playtime-minutes")); requirementRegistry.addRequirement(new GroupRequirement(this, "group")); + + operationRegistry.addOperation("all", new AllOperation()); + operationRegistry.addOperation("none", new NoneOperation()); + operationRegistry.addOperation("one", new OneOperation()); + operationRegistry.addOperation("any", new AnyOperation()); } private void setupPermissions() { diff --git a/src/main/java/sh/okx/rankup/Stats.java b/src/main/java/sh/okx/rankup/Stats.java deleted file mode 100644 index cc2e0bc..0000000 --- a/src/main/java/sh/okx/rankup/Stats.java +++ /dev/null @@ -1,55 +0,0 @@ -package sh.okx.rankup; - -import org.bukkit.Bukkit; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.URL; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.Base64; -import java.util.HashMap; -import java.util.Map; -import java.util.StringJoiner; - -public class Stats { - public void init(Rankup plugin) throws IOException { - URL url = new URL("http://rankup.okx.sh/api"); - URLConnection con = url.openConnection(); - HttpURLConnection http = (HttpURLConnection) con; - http.setRequestMethod("POST"); - http.setDoOutput(true); - Map arguments = new HashMap<>(); - arguments.put("ip", InetAddress.getLocalHost().getHostAddress() + ":" + Bukkit.getPort()); - arguments.put("spigot", Bukkit.getVersion()); - arguments.put("version", plugin.getDescription().getVersion()); - Base64.Encoder base64 = Base64.getEncoder(); - File data = plugin.getDataFolder(); - arguments.put("config", base64.encodeToString(Files.readAllBytes(data.toPath().resolve("config.yml")))); - arguments.put("messages", base64.encodeToString(Files.readAllBytes(data.toPath().resolve("messages.yml")))); - arguments.put("rankups", base64.encodeToString(Files.readAllBytes(data.toPath().resolve("rankups.yml")))); - StringJoiner sj = new StringJoiner("&"); - for (Map.Entry entry : arguments.entrySet()) { - try { - sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" - + URLEncoder.encode(entry.getValue(), "UTF-8")); - } catch (UnsupportedEncodingException e) { - throw new AssertionError("UTF-8 not found."); - } - } - byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8); - int length = out.length; - http.setFixedLengthStreamingMode(length); - http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); - http.connect(); - try (OutputStream os = http.getOutputStream()) { - os.write(out); - } - } -} diff --git a/src/main/java/sh/okx/rankup/commands/InfoCommand.java b/src/main/java/sh/okx/rankup/commands/InfoCommand.java index 5c22a3f..fa66e88 100644 --- a/src/main/java/sh/okx/rankup/commands/InfoCommand.java +++ b/src/main/java/sh/okx/rankup/commands/InfoCommand.java @@ -64,9 +64,8 @@ public class InfoCommand implements CommandExecutor { return true; } - public String getLatestVersion() throws IOException { + private String getLatestVersion() throws IOException { URL url = new URL("https://api.spigotmc.org/legacy/update.php?resource=17933"); - String result = CharStreams.toString(new InputStreamReader(url.openStream(), Charsets.UTF_8)); - return result; + return CharStreams.toString(new InputStreamReader(url.openStream(), Charsets.UTF_8)); } } diff --git a/src/main/java/sh/okx/rankup/gui/Gui.java b/src/main/java/sh/okx/rankup/gui/Gui.java index 5e07d4e..3a3d167 100644 --- a/src/main/java/sh/okx/rankup/gui/Gui.java +++ b/src/main/java/sh/okx/rankup/gui/Gui.java @@ -70,7 +70,7 @@ public class Gui implements InventoryHolder { item = new ItemStack(material); } - if(item.getType() == Material.AIR && section.getName().equalsIgnoreCase("fill")) { + if (item.getType() == Material.AIR && section.getName().equalsIgnoreCase("fill")) { return item; } diff --git a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java index 1bfa7c5..063640f 100644 --- a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java +++ b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java @@ -6,7 +6,7 @@ import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rankups; -import sh.okx.rankup.ranks.requirements.Requirement; +import sh.okx.rankup.requirements.Requirement; import java.text.DecimalFormat; import java.util.function.Function; diff --git a/src/main/java/sh/okx/rankup/prestige/Prestige.java b/src/main/java/sh/okx/rankup/prestige/Prestige.java new file mode 100644 index 0000000..9e67fa5 --- /dev/null +++ b/src/main/java/sh/okx/rankup/prestige/Prestige.java @@ -0,0 +1,4 @@ +package sh.okx.rankup.prestige; + +public class Prestige { +} diff --git a/src/main/java/sh/okx/rankup/ranks/Rank.java b/src/main/java/sh/okx/rankup/ranks/Rank.java index 6b09d10..0efbdb9 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rank.java +++ b/src/main/java/sh/okx/rankup/ranks/Rank.java @@ -9,14 +9,16 @@ import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.Variable; -import sh.okx.rankup.ranks.requirements.DeductibleRequirement; -import sh.okx.rankup.ranks.requirements.Requirement; +import sh.okx.rankup.requirements.DeductibleRequirement; +import sh.okx.rankup.requirements.Operation; +import sh.okx.rankup.requirements.Requirement; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; -import java.util.function.BinaryOperator; +import java.util.stream.Collectors; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class Rank { @@ -29,14 +31,14 @@ public class Rank { private final String rank; @Getter private final Set requirements; - private final BinaryOperator reducer; + private final Operation operation; private final List commands; public static Rank deserialize(Rankup plugin, ConfigurationSection section) { String rank = section.getString("rank"); Set requirements = new HashSet<>(); - BinaryOperator reducer = null; + Operation operation = null; ConfigurationSection requirementsSection = section.getConfigurationSection("requirements"); if (requirementsSection != null) { for (Map.Entry entry : requirementsSection.getValues(false).entrySet()) { @@ -50,26 +52,8 @@ public class Rank { } } - String operation = section.getString("operation"); - if (operation == null) { - operation = "and"; - } - switch (operation) { - case "and": - reducer = (a, b) -> a && b; - break; - case "or": - reducer = (a, b) -> a || b; - break; - case "xor": - reducer = (a, b) -> (a && !b) || (b && !a); - break; - case "none": - reducer = (a, b) -> !a && !b; - break; - default: - throw new IllegalArgumentException("Invalid operation type for rank " + rank); - } + String operationName = Optional.ofNullable(section.getString("operation")).orElse("all"); + operation = plugin.getOperationRegistry().getOperation(operationName); } return new Rank(plugin, @@ -77,15 +61,14 @@ public class Rank { section.getString("next"), rank, requirements, - reducer, + operation, section.getStringList("commands")); } public boolean checkRequirements(Player player) { - return requirements.stream() + return operation.check(requirements.stream() .map(requirement -> requirement.check(player)) - .reduce(reducer) - .orElse(true); + .collect(Collectors.toList())); } public boolean isInRank(Player player) { diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/DeductibleRequirement.java b/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java similarity index 94% rename from src/main/java/sh/okx/rankup/ranks/requirements/DeductibleRequirement.java rename to src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java index 3e57eb6..ef6113e 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/DeductibleRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java @@ -1,4 +1,4 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; diff --git a/src/main/java/sh/okx/rankup/requirements/Operation.java b/src/main/java/sh/okx/rankup/requirements/Operation.java new file mode 100644 index 0000000..29dcdd7 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/Operation.java @@ -0,0 +1,7 @@ +package sh.okx.rankup.requirements; + +import java.util.List; + +public abstract class Operation { + public abstract boolean check(List booleans); +} diff --git a/src/main/java/sh/okx/rankup/requirements/OperationRegistry.java b/src/main/java/sh/okx/rankup/requirements/OperationRegistry.java new file mode 100644 index 0000000..2df6b65 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/OperationRegistry.java @@ -0,0 +1,15 @@ +package sh.okx.rankup.requirements; + +import java.util.Map; + +public class OperationRegistry { + private Map operations; + + public void addOperation(String name, Operation operation) { + operations.put(name.toLowerCase(), operation); + } + + public Operation getOperation(String name) { + return operations.get(name.toLowerCase()); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/ReducerOperation.java b/src/main/java/sh/okx/rankup/requirements/ReducerOperation.java new file mode 100644 index 0000000..f045d75 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/ReducerOperation.java @@ -0,0 +1,12 @@ +package sh.okx.rankup.requirements; + +import java.util.List; + +public abstract class ReducerOperation extends Operation { + public abstract boolean check(boolean a, boolean b); + + @Override + public boolean check(List booleans) { + return booleans.stream().reduce(this::check).orElse(true); + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/Requirement.java b/src/main/java/sh/okx/rankup/requirements/Requirement.java similarity index 97% rename from src/main/java/sh/okx/rankup/ranks/requirements/Requirement.java rename to src/main/java/sh/okx/rankup/requirements/Requirement.java index 38d3d61..9b9fce6 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/Requirement.java +++ b/src/main/java/sh/okx/rankup/requirements/Requirement.java @@ -1,4 +1,4 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements; import lombok.Getter; import org.bukkit.entity.Player; diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/RequirementRegistry.java b/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java similarity index 93% rename from src/main/java/sh/okx/rankup/ranks/requirements/RequirementRegistry.java rename to src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java index 8123069..81331e1 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/RequirementRegistry.java +++ b/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java @@ -1,4 +1,4 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/sh/okx/rankup/requirements/operation/AllOperation.java b/src/main/java/sh/okx/rankup/requirements/operation/AllOperation.java new file mode 100644 index 0000000..0e3fd7c --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/operation/AllOperation.java @@ -0,0 +1,10 @@ +package sh.okx.rankup.requirements.operation; + +import sh.okx.rankup.requirements.ReducerOperation; + +public class AllOperation extends ReducerOperation { + @Override + public boolean check(boolean a, boolean b) { + return a && b; + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/operation/AnyOperation.java b/src/main/java/sh/okx/rankup/requirements/operation/AnyOperation.java new file mode 100644 index 0000000..f889431 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/operation/AnyOperation.java @@ -0,0 +1,10 @@ +package sh.okx.rankup.requirements.operation; + +import sh.okx.rankup.requirements.ReducerOperation; + +public class AnyOperation extends ReducerOperation { + @Override + public boolean check(boolean a, boolean b) { + return a || b; + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/operation/NoneOperation.java b/src/main/java/sh/okx/rankup/requirements/operation/NoneOperation.java new file mode 100644 index 0000000..aab791a --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/operation/NoneOperation.java @@ -0,0 +1,10 @@ +package sh.okx.rankup.requirements.operation; + +import sh.okx.rankup.requirements.ReducerOperation; + +public class NoneOperation extends ReducerOperation { + @Override + public boolean check(boolean a, boolean b) { + return !a && !b; + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/operation/OneOperation.java b/src/main/java/sh/okx/rankup/requirements/operation/OneOperation.java new file mode 100644 index 0000000..abdce20 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/operation/OneOperation.java @@ -0,0 +1,10 @@ +package sh.okx.rankup.requirements.operation; + +import sh.okx.rankup.requirements.ReducerOperation; + +public class OneOperation extends ReducerOperation { + @Override + public boolean check(boolean a, boolean b) { + return (a && !b) || (b && !a); + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/GroupRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java similarity index 88% rename from src/main/java/sh/okx/rankup/ranks/requirements/GroupRequirement.java rename to src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java index d62187e..a5a7b6c 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/GroupRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java @@ -1,7 +1,8 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements.requirement; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.Requirement; public class GroupRequirement extends Requirement { public GroupRequirement(Rankup plugin, String name) { diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/MoneyRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java similarity index 85% rename from src/main/java/sh/okx/rankup/ranks/requirements/MoneyRequirement.java rename to src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java index f1b7f4d..b6c5c29 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/MoneyRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java @@ -1,8 +1,10 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements.requirement; import net.milkbowl.vault.economy.Economy; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.DeductibleRequirement; +import sh.okx.rankup.requirements.Requirement; public class MoneyRequirement extends DeductibleRequirement { public MoneyRequirement(Rankup plugin, String name) { diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/PlaytimeMinutesRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java similarity index 92% rename from src/main/java/sh/okx/rankup/ranks/requirements/PlaytimeMinutesRequirement.java rename to src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java index 136de3c..b93038d 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/PlaytimeMinutesRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java @@ -1,8 +1,9 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements.requirement; import org.bukkit.Statistic; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.Requirement; public class PlaytimeMinutesRequirement extends Requirement { private static final int TICKS_PER_MINUTE = 20 * 60; diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/XpLevelRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java similarity index 82% rename from src/main/java/sh/okx/rankup/ranks/requirements/XpLevelRequirement.java rename to src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java index 14f8c19..b2e1945 100644 --- a/src/main/java/sh/okx/rankup/ranks/requirements/XpLevelRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java @@ -1,7 +1,9 @@ -package sh.okx.rankup.ranks.requirements; +package sh.okx.rankup.requirements.requirement; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.DeductibleRequirement; +import sh.okx.rankup.requirements.Requirement; public class XpLevelRequirement extends DeductibleRequirement { public XpLevelRequirement(Rankup plugin, String name) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3e92d8b..efb012a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,10 +1,6 @@ # this is used for letting you know that you need to update/change your config file version: 0 -# as well as bStats (which can be disabled in the plugins/bStats folder), -# this will send more detailed stats privately, to help see what features are being used. -stats: true - # whether /ranks should be enabled (true) or disabled (false) # /rankup3 reload will not do anything if this is changed, # you will have to restart your server. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4437ef6..1e29070 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -27,7 +27,6 @@ permissions: rankup.ranks: true rankup.reload: true rankup.ranks: true - rankup.sign: true rankup.info: default: true rankup.rankup: @@ -39,6 +38,4 @@ permissions: rankup.reload: default: op rankup.ranks: - default: true - rankup.sign: - default: op \ No newline at end of file + default: true \ No newline at end of file diff --git a/src/main/resources/prestiges.yml b/src/main/resources/prestiges.yml new file mode 100644 index 0000000..f772a4e --- /dev/null +++ b/src/main/resources/prestiges.yml @@ -0,0 +1,20 @@ +P1example: + # the rank people must be to use this prestige + from: 'D' + # the rank to change it to + to: 'A' + # the rank to also add + rank: 'P1' + # requirements are the same as in rankups.yml + requirements: + money: 10000 + # optional + operation: all + # commands & prestige messages can be added as per rankups.yml too. +P1example: + from: 'D' + to: 'A' + rank: 'P2' + requirements: + money: 20000 + xp-level: 5 \ No newline at end of file diff --git a/src/main/resources/rankups.yml b/src/main/resources/rankups.yml index 1e49894..408d6cb 100644 --- a/src/main/resources/rankups.yml +++ b/src/main/resources/rankups.yml @@ -16,13 +16,13 @@ Aexample: requirements: money: 1000 # What requirements players need to match to /rankup. - # this is optional - if you don't use it, it defaults to "and" + # this is optional - if you don't use it, it defaults to "all" # n.b. if there are no requirements players will always be able to /rankup. - # and: all requirements - # or: at least one requirement - # xor: only one requirement + # all: all requirements + # any: at least one requirement + # one: only one requirement # none: no requirements - operation: and + operation: all # the console will run these commands when a player ranks up #commands: # this will run when a player ranks up from A to B.