Compare commits

..

150 Commits

Author SHA1 Message Date
HaHaWTH 304eca4b6a B50 release 2024-06-04 20:56:24 +08:00
HaHaWTH 13315e6132 pom cleanup 2024-06-04 17:49:53 +08:00
DGun Otto 90684451d8 Merge pull request #162 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-javadoc-plugin-3.7.0
Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.4.1 to 3.7.0
2024-06-04 04:11:17 +08:00
DGun Otto 799849920f Merge pull request #161 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-shade-plugin-3.6.0
Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.3 to 3.6.0
2024-06-04 04:11:05 +08:00
DGun Otto f7d83f1459 Merge pull request #155 from Dreeam-qwq/feat/i18n
i18n messages sending support
2024-06-03 23:55:23 +08:00
Dreeam fbf5f32415 Instantly return null if didn't receive locale packet before calling messages sending method 2024-06-03 20:04:54 +08:00
Dreeam e922422922 Adjust code style 2024-06-03 19:58:44 +08:00
Dreeam b9648393a7 Remove deprecated feature lang 2024-06-03 19:54:03 +08:00
dependabot[bot] d20cc6514b Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.4.1 to 3.7.0
Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.4.1 to 3.7.0.
- [Release notes](https://github.com/apache/maven-javadoc-plugin/releases)
- [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.4.1...maven-javadoc-plugin-3.7.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-javadoc-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 04:37:24 +00:00
dependabot[bot] 6a20976370 Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.3 to 3.6.0
Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.3 to 3.6.0.
- [Release notes](https://github.com/apache/maven-shade-plugin/releases)
- [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.3...maven-shade-plugin-3.6.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-shade-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 04:37:07 +00:00
HaHaWTH 3e56aacb4e Improved inventory whitelist check & prepare for better MiniMessage support 2024-06-03 00:21:03 +08:00
Dreeam a8e18d1bb8 Decrease timeout limit to prevent main thread waiting too long 2024-06-02 21:19:52 +08:00
Dreeam 32ed70f099 Use Protocollib to get locale packet for lower server version (< 1.15.2) 2024-06-02 18:59:27 +08:00
Dreeam e89b6182a7 Merge remote-tracking branch 'upstream/master' into feat/i18n 2024-06-02 17:19:47 +08:00
HaHaWTH 41d04c7604 Merge remote-tracking branch 'origin/master' 2024-06-01 15:14:50 +08:00
HaHaWTH d7a5869e99 Cleanup & Fix 2024-06-01 15:13:04 +08:00
DGun Otto 3139902b37 [ci skip] Update README.md 2024-06-01 05:04:42 +08:00
HaHaWTH dc599fe5c3 Completely removed gui captcha things 2024-05-31 23:48:12 +08:00
Dreeam 5829bfeaa2 [ci skip] Update messages translations 2024-05-31 22:00:36 +08:00
Dreeam 100805da8b Merge branch 'master' into feat/i18n 2024-05-31 20:36:27 +08:00
Dreeam 0679087e53 Try to reduce complexity 2024-05-31 20:23:47 +08:00
Dreeam b6476dcb79 Revert 2024-05-31 20:17:02 +08:00
Dreeam 471e1c0d2c [ci skip] Update messages translations 2024-05-31 20:13:19 +08:00
Dreeam 3d6b1a059c [ci skip] Update messages translations 2024-05-31 18:20:42 +08:00
Dreeam f56ca830cf [ci skip] Update messages_en.yml 2024-05-31 17:26:57 +08:00
HaHaWTH 0fbe7d99cb Fixes 2024-05-31 16:32:54 +08:00
DGun Otto bbdf64415c Merge pull request #159 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-enforcer-plugin-3.5.0
Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.2.1 to 3.5.0
2024-05-31 16:26:34 +08:00
HaHaWTH 5981af630a Merge remote-tracking branch 'origin/master' 2024-05-31 14:38:12 +08:00
HaHaWTH 7e14bd8675 skip Paper plugin remap 2024-05-31 14:37:51 +08:00
dependabot[bot] 0f407f9658 Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.2.1 to 3.5.0
Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.2.1 to 3.5.0.
- [Release notes](https://github.com/apache/maven-enforcer/releases)
- [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.2.1...enforcer-3.5.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-enforcer-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-31 05:00:31 +00:00
DGun Otto 9439098472 Merge pull request #140 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-install-plugin-3.1.2
Bump org.apache.maven.plugins:maven-install-plugin from 3.1.0 to 3.1.2
2024-05-31 02:37:58 +08:00
DGun Otto 6618c004c3 Merge pull request #154 from HaHaWTH/dependabot/maven/org.xerial-sqlite-jdbc-3.46.0.0
Bump org.xerial:sqlite-jdbc from 3.45.3.0 to 3.46.0.0
2024-05-31 02:37:23 +08:00
DGun Otto 18ab6623ff Support for latest Leaves 2024-05-31 02:24:22 +08:00
HaHaWTH 2fe0da569b Cleanup 2024-05-30 23:53:08 +08:00
HaHaWTH 42e907580c Async teleport is now default >v< 2024-05-30 22:15:21 +08:00
DGun Otto ae76066db6 Merge pull request #158 from HaHaWTH/feat/minimessage
Minimessage support
2024-05-30 18:40:59 +08:00
HaHaWTH 5c74580866 Revert message changes 2024-05-30 18:04:19 +08:00
HaHaWTH 2dd5ebcb8c Fix Folia compatibility 2024-05-30 13:38:04 +08:00
HaHaWTH 69f3d9838d Change default quickCommandProtection value 2024-05-30 02:17:10 +08:00
Dreeam e8010782fd Cleanup reflection 2024-05-30 01:39:40 +08:00
Dreeam 4e54d86712 Fix getting locale in lower version client by delaying message sending 2024-05-30 01:21:57 +08:00
Dreeam fdc0d31632 Fix reflect error 2024-05-30 00:27:38 +08:00
Dreeam 0d903d23b0 Add strict locale-code-redirect config format check 2024-05-29 23:20:34 +08:00
Dreeam e79036d42f Revert "[ci skip] Try to decrease complexity"
This reverts commit 39e94c6ea7.
2024-05-29 23:06:47 +08:00
Dreeam 39e94c6ea7 [ci skip] Try to decrease complexity 2024-05-29 23:04:58 +08:00
Dreeam 0c10cb0ead Fix code style 2024-05-29 22:55:19 +08:00
Dreeam 7301a22d44 [ci skip] Update docs/config.md 2024-05-29 21:05:11 +08:00
Dreeam 89817d420c Move utils to I18NUtils 2024-05-29 20:34:27 +08:00
Dreeam c53f622e94 Cleanup 2024-05-29 20:19:33 +08:00
Dreeam eb43dc3960 Clean up locale to language code matching 2024-05-29 18:59:41 +08:00
Dreeam 6001ee6979 Add configurable locale code to AuthMe language code redirect 2024-05-29 18:46:57 +08:00
Dreeam d09e545554 Add hard mapping to convert to AuthMe language code from locale code 2024-05-29 17:07:30 +08:00
HaHaWTH 642270e4c3 Reapply "Always save quit location and fixes #2769 issue 1"
This reverts commit 8c4da6288e.
2024-05-29 14:44:28 +08:00
HaHaWTH d648725b10 Silent login for BedrockAutoLoginListener 2024-05-29 13:40:46 +08:00
HaHaWTH 0f6ecb8f03 Merge remote-tracking branch 'origin/master' 2024-05-29 13:38:35 +08:00
HaHaWTH ce60648233 Expose silentForceLogin to api (#2819) 2024-05-29 13:37:37 +08:00
DGun Otto 186860c1fa Merge pull request #156 from F3F5/master
yay the Russian translation is up to date
2024-05-29 13:12:19 +08:00
MISHA 3beed667b4 refresh the translation 2024-05-29 00:34:13 +04:00
Dreeam 2219dd55dd Intial i18n messages support
Send different languages of messages based on player's client setting
2024-05-29 00:11:25 +08:00
DGun Otto 3e73a5090a Merge pull request #139 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-deploy-plugin-3.1.2
Bump org.apache.maven.plugins:maven-deploy-plugin from 3.0.0 to 3.1.2
2024-05-28 19:36:20 +08:00
HaHaWTH 583a275100 Exclude bungee-chat
Nothing uses this lol
2024-05-28 14:20:31 +08:00
dependabot[bot] a4c1dd6f5b Bump org.xerial:sqlite-jdbc from 3.45.3.0 to 3.46.0.0
Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.45.3.0 to 3.46.0.0.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.45.3.0...3.46.0.0)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-28 04:31:50 +00:00
HaHaWTH de69919c01 Fix some issues with Velocity support 2024-05-27 19:40:50 +08:00
HaHaWTH 6dea065ed2 Support plain text password storage method (NOCRYPT) 2024-05-27 05:11:15 +08:00
HaHaWTH 9e208532d3 Initial MiniMessage support 2024-05-27 04:56:50 +08:00
DGun Otto c0b6d87678 Allow dot in the email username 2024-05-27 00:56:40 +08:00
HaHaWTH 778edac895 B49 release 2024-05-24 16:41:36 +08:00
HaHaWTH 17d1cf1665 Update SpigotAPI 2024-05-24 00:55:58 +08:00
HaHaWTH 3f3671c95c Fix #146 and cleanup 2024-05-24 00:42:47 +08:00
HaHaWTH 52c06917c3 Add repository 2024-05-23 18:02:47 +08:00
HaHaWTH b2ea5cbef8 Dynamically download H2 2024-05-23 17:55:42 +08:00
HaHaWTH 99c7466b37 Better handling teleportUnAuthedToSpawn 2024-05-22 23:55:34 +08:00
HaHaWTH e60c18d8a8 Merge remote-tracking branch 'origin/master' 2024-05-22 23:49:33 +08:00
HaHaWTH 8c4da6288e Revert "Always save quit location and fixes #2769 issue 1"
This reverts commit c1eee8e139.
2024-05-22 23:48:28 +08:00
DGun Otto 1a73adf414 Remove relocation 2024-05-11 14:28:38 +08:00
HaHaWTH cb76ae01e1 Fix potential NPE when using velocity 2024-05-08 08:32:19 +08:00
HaHaWTH 89df4e451c B48 release 2024-04-30 22:58:53 +08:00
dependabot[bot] f99b4bd0ad Bump org.apache.maven.plugins:maven-install-plugin from 3.1.0 to 3.1.2
Bumps [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin) from 3.1.0 to 3.1.2.
- [Release notes](https://github.com/apache/maven-install-plugin/releases)
- [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.0...maven-install-plugin-3.1.2)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-install-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-30 04:24:30 +00:00
dependabot[bot] 930f889745 Bump org.apache.maven.plugins:maven-deploy-plugin from 3.0.0 to 3.1.2
Bumps [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) from 3.0.0 to 3.1.2.
- [Release notes](https://github.com/apache/maven-deploy-plugin/releases)
- [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.0.0...maven-deploy-plugin-3.1.2)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-deploy-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-30 04:24:10 +00:00
DGun Otto fe39310eca Merge pull request #138 from HaHaWTH/HaHaWTH-patch-1
Update workflows
2024-04-30 00:40:07 +08:00
DGun Otto b9790d458e Update workflows 2024-04-30 00:30:28 +08:00
DGun Otto dc8d5f741a [ci skip] Update README.md 2024-04-25 23:46:55 +08:00
DGun Otto b3288e9c72 [ci skip] Update LICENSE 2024-04-25 23:44:25 +08:00
DGun Otto c88aa79377 [ci skip] Update LICENSE 2024-04-25 23:42:27 +08:00
HaHaWTH 2327c07f9a Revert email dependency update 2024-04-24 16:46:22 +08:00
DGun Otto 8e93d4cd19 Merge pull request #133 from HaHaWTH/dependabot/maven/org.apache.commons-commons-email-1.6.0
Bump org.apache.commons:commons-email from 1.6-SNAPSHOT to 1.6.0
2024-04-24 15:31:23 +08:00
HaHaWTH a963bde749 Merge remote-tracking branch 'origin/master' 2024-04-24 15:26:57 +08:00
HaHaWTH 10b6997c32 Don't apply relocation and fixes #999 again 2024-04-24 15:26:20 +08:00
DGun Otto 970c77678b Merge pull request #132 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-shade-plugin-3.5.3
Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.2 to 3.5.3
2024-04-24 14:22:30 +08:00
dependabot[bot] 07c479746b Bump org.apache.commons:commons-email from 1.6-SNAPSHOT to 1.6.0
Bumps org.apache.commons:commons-email from 1.6-SNAPSHOT to 1.6.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-email
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-24 04:38:47 +00:00
dependabot[bot] d90a8a36cf Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.2 to 3.5.3
Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.2 to 3.5.3.
- [Release notes](https://github.com/apache/maven-shade-plugin/releases)
- [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.2...maven-shade-plugin-3.5.3)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-shade-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-24 04:38:40 +00:00
HaHaWTH c1eee8e139 Always save quit location and fixes #2769 issue 1 2024-04-24 02:21:40 +08:00
DGun Otto dd831a65a5 Downgrade email dependency version 2024-04-24 00:56:24 +08:00
DGun Otto 51783604c6 Merge pull request #130 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-jar-plugin-3.4.1
Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.0 to 3.4.1
2024-04-22 12:37:00 +08:00
dependabot[bot] 9f8471d4e9 Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.0 to 3.4.1
Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/apache/maven-jar-plugin/releases)
- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.0...maven-jar-plugin-3.4.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-22 04:11:25 +00:00
HaHaWTH c4ac2601ad Merge remote-tracking branch 'origin/master' 2024-04-20 03:53:59 +08:00
HaHaWTH b4a0994871 Update GeoLite2 database 2024-04-20 03:53:41 +08:00
DGun Otto b619e1dac5 Merge pull request #128 from HaHaWTH/dependabot/maven/org.xerial-sqlite-jdbc-3.45.3.0
Bump org.xerial:sqlite-jdbc from 3.45.2.0 to 3.45.3.0
2024-04-16 14:24:56 +08:00
dependabot[bot] ba1703c684 Bump org.xerial:sqlite-jdbc from 3.45.2.0 to 3.45.3.0
Bumps [org.xerial:sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.45.2.0 to 3.45.3.0.
- [Release notes](https://github.com/xerial/sqlite-jdbc/releases)
- [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG)
- [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.45.2.0...3.45.3.0)

---
updated-dependencies:
- dependency-name: org.xerial:sqlite-jdbc
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-16 04:52:25 +00:00
DGun Otto 131b5b7805 Merge pull request #127 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-jar-plugin-3.4.0
Bump org.apache.maven.plugins:maven-jar-plugin from 3.3.0 to 3.4.0
2024-04-15 16:19:11 +08:00
dependabot[bot] 099415e823 Bump org.apache.maven.plugins:maven-jar-plugin from 3.3.0 to 3.4.0
Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/apache/maven-jar-plugin/releases)
- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-15 04:46:39 +00:00
HaHaWTH 91261f4315 Update config comment 2024-04-15 02:20:19 +08:00
HaHaWTH 548be5042d Merge remote-tracking branch 'origin/master' 2024-04-07 12:37:57 +08:00
HaHaWTH e9fd7fd80f B47 release 2024-04-07 12:37:34 +08:00
DGun Otto e44cd3edc6 Merge pull request #124 from HaHaWTH/dependabot/maven/org.apache.maven.plugins-maven-source-plugin-3.3.1
Bump org.apache.maven.plugins:maven-source-plugin from 3.3.0 to 3.3.1
2024-04-05 13:16:21 +08:00
dependabot[bot] 219a7a3493 Bump org.apache.maven.plugins:maven-source-plugin from 3.3.0 to 3.3.1
Bumps [org.apache.maven.plugins:maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.3.0 to 3.3.1.
- [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.3.0...maven-source-plugin-3.3.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-source-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-05 04:57:38 +00:00
DGun Otto 6876a6dd9f Update workflows 2024-04-04 14:51:02 +08:00
DGun Otto d04a69f481 Update workflows 2024-04-04 13:26:41 +08:00
DGun Otto dfa8317706 Update workflows 2024-04-04 13:21:27 +08:00
HaHaWTH 555514f7dd Add warning for H2 database 2024-04-03 19:02:19 +08:00
HaHaWTH 74633937bc Revert stupid changes made by the original upstream 2024-04-03 16:40:37 +08:00
HaHaWTH 948736b5ea Merge upstream pull request #2777 2024-04-03 16:11:06 +08:00
HaHaWTH 5e54b8b105 Update build 2024-04-03 13:55:42 +08:00
DGun Otto 0d818dd00f Merge pull request #121 from HaHaWTH/dependabot/maven/org.jacoco-jacoco-maven-plugin-0.8.12
Bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12
2024-04-03 13:07:47 +08:00
dependabot[bot] 22586e601f Bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12
Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.11 to 0.8.12.
- [Release notes](https://github.com/jacoco/jacoco/releases)
- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.11...v0.8.12)

---
updated-dependencies:
- dependency-name: org.jacoco:jacoco-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 05:02:43 +00:00
DGun Otto 9938df3c28 [ci skip] Update feature_request.yml 2024-04-02 20:16:08 +08:00
DGun Otto ec2e8d3654 [ci skip] Update bug_report.yml 2024-04-02 20:14:50 +08:00
DGun Otto 71a9c0c98f [ci skip] Update README.md 2024-04-02 19:59:44 +08:00
HaHaWTH 54cef57ea5 Configurable send delay 2024-04-02 17:34:03 +08:00
HaHaWTH 73c1116047 Delayed more 2024-04-02 01:27:58 +08:00
HaHaWTH abb85f005d Delayed more 2024-04-02 01:23:53 +08:00
HaHaWTH 5e91ee9844 B46 release 2024-04-01 00:46:46 +08:00
HaHaWTH 8e781651a9 [ci skip] Update README 2024-04-01 00:39:43 +08:00
DGun Otto 74db202cd9 Merge pull request #120 from lilingfengdev/master
简体中文支持
2024-03-31 13:10:15 +08:00
DGun Otto 26b3b3ea78 Update README-zh.md 2024-03-31 13:08:42 +08:00
lilingfengdev bfc2197089 Update README.md 2024-03-31 12:16:19 +08:00
lilingfengdev 49c515169e 修复翻译错误 2024-03-31 12:10:34 +08:00
lilingfengdev d9c04a58c0 Create README-zh.md 2024-03-31 12:07:37 +08:00
HaHaWTH 57be7b2dfe Remove stupid warnings on Velocity 2024-03-31 01:22:25 +08:00
HaHaWTH 07b62d4bf2 Purge dat_old file 2024-03-30 22:15:00 +08:00
HaHaWTH 726aead1c1 Initial Velocity support 2024-03-30 21:15:20 +08:00
DGun Otto a1af29dff9 [ci skip] Update README.md 2024-03-30 16:02:20 +08:00
DGun Otto 388e80ee92 [ci skip] Update README.md 2024-03-30 16:01:17 +08:00
HaHaWTH 7d09faf528 Change floodgate hook 2024-03-30 13:35:04 +08:00
HaHaWTH f2876d79fb Synchronized something 2024-03-30 03:02:48 +08:00
HaHaWTH 1155bed754 Fix build 2024-03-30 01:32:52 +08:00
HaHaWTH c6278b17e9 Fix haveIBeenPwned check 2024-03-30 01:24:25 +08:00
HaHaWTH 3a0d5f6347 Delete samples(reduce repo size) 2024-03-30 01:05:00 +08:00
HaHaWTH 7e6d511ae4 Merge remote-tracking branch 'origin/master' 2024-03-29 23:31:05 +08:00
HaHaWTH f35ac01399 Remove rakamak converter settings 2024-03-29 23:30:44 +08:00
DGun Otto 64807852ff [ci skip] Update README.md 2024-03-29 21:22:11 +08:00
HaHaWTH 342d9c96ee Fix javadoc 2024-03-29 03:28:30 +08:00
HaHaWTH eaa0cdd600 Add H2ToSqlite converter 2024-03-29 03:27:19 +08:00
HaHaWTH 7507fb9ea2 Remove VAuth converter 2024-03-29 03:11:00 +08:00
HaHaWTH 839e192711 Remove Rakamak converter 2024-03-29 03:07:19 +08:00
HaHaWTH 2ad33f4567 Use 0.1.6 2024-03-28 23:49:38 +08:00
HaHaWTH 8db573a789 typo 2024-03-28 20:51:27 +08:00
HaHaWTH c50a413fcd Reapply "Fix relocation"
This reverts commit 640eb9335e.
2024-03-28 20:42:06 +08:00
HaHaWTH 6a96d993e1 Virtual Threads for database caching 2024-03-28 15:21:22 +08:00
HaHaWTH a93f0546e3 Leaves compatibility 2024-03-28 07:39:29 +08:00
114 changed files with 2846 additions and 48927 deletions
+6 -1
View File
@@ -47,8 +47,10 @@ body:
description: Which server implementation are you using?
multiple: false
options:
- Standalone server (no proxy)
- Standalone(Spigot)
- Standalone(Folia)
- BungeeCord
- Velocity
validations:
required: true
@@ -60,6 +62,9 @@ body:
options:
- SQLite
- MySQL
- H2
- MariaDB
- PostgreSQL
validations:
required: true
+1 -1
View File
@@ -1,6 +1,6 @@
name: Feature request
description: Suggest an idea for AuthMe
labels: 'Type: enhancement'
labels: 'enhancement'
body:
- type: markdown
+9 -7
View File
@@ -10,11 +10,11 @@ jobs:
Build:
strategy:
matrix:
jdkversion: [ 17 ]
jdkversion: [ 21 ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.jdkversion }}
@@ -22,10 +22,10 @@ jobs:
- name: Build
run: mvn -V -B clean package --file pom.xml
- name: Upload Artifacts
uses: actions/upload-artifact@v3.1.2
uses: actions/upload-artifact@v4
with:
name: Download
path: ./target/AuthMe-5.6.0-FORK-Spigot-Universal.jar
path: ./target/AuthMe-5.6.0-FORK-Universal.jar
runtime-test:
name: Plugin Runtime Test
needs: [Build]
@@ -37,8 +37,10 @@ jobs:
javaVersion: '8'
- mcVersion: '1.12.2'
javaVersion: '8'
- mcVersion: '1.20.2'
javaVersion: '20'
- mcVersion: '1.18.2'
javaVersion: '17'
- mcVersion: '1.20.4'
javaVersion: '21'
steps:
- uses: HaHaWTH/minecraft-plugin-runtime-test@paper
with:
+1
View File
@@ -114,3 +114,4 @@ nb-configuration.xml
### Git ###
# Don't exclude the .gitignore itself
!.gitignore
/samples/
+51
View File
@@ -0,0 +1,51 @@
# AuthMeReReloaded
**"Bukkit 的最佳身份验证插件的分支!"**
![Graph](https://bstats.org/signatures/bukkit/AuthMeReloaded-Fork.svg)
<p align="center">
<img src="https://img.shields.io/github/languages/code-size/HaHaWTH/AuthMeReReloaded.svg" alt="Code size"/>
<img src="https://img.shields.io/github/repo-size/HaHaWTH/AuthMeReReloaded.svg" alt="GitHub repo size"/>
<img src="https://www.codefactor.io/repository/github/hahawth/authmerereloaded/badge" alt="CodeFactor" />
<img src="https://img.shields.io/github/downloads/HaHaWTH/AuthMeReReloaded/total" alt="Downloads" />
</p>
**详细改动:**
1. 改进邮件发送逻辑,支持更多邮件
2. 关闭邮件发送(当服务器关闭时,向您发送邮件)
3. 原有漏洞修复
4. 反幽灵玩家(重复登录错误)
5. 按服务器分支使用最佳性能方法
6. 基岩兼容性(需要Floodgate)(基于 UUID
7. 更新检查器
8. 集成 GUI 验证码功能(需要 Bedrock 兼容性和 ProtocolLib)(70% 异步)
9. 改进监听器
10. 改进玩家登录逻辑以减少延迟
11. 自动清除机器人数据
12. 支持**Folia(正在测试中)**
13. F键菜单兼容
14. 自动修复传送卡传送门/地底问题
15. **Velocity支持 (详见 [Velocity Support](./vc-support.md))**
16. 基岩版玩家自动登录(可配置)
17. 修复旧版本(MC 1.13-)中的 "潜影盒 "崩溃问题
18. 支持 **H2 数据库**
19. 虚拟线程支持
20. **100% 兼容原版 authme 和扩展**
21. 更多......
**下载链接:**
[Release](https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest)
[Actions(开发版,使用风险自负!)](https://github.com/HaHaWTH/AuthMeReReloaded/actions/workflows/maven.yml)
如果您的服务器使用 FRP(内网穿透),此插件可能会有所帮助 [HAProxy-Detector](https://github.com/HaHaWTH/HAProxy-Detector)
**欢迎提出请求和建议!**
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://api.star-history.com/svg?repos=HaHaWTH/AuthMeReReloaded&type=Date&theme=dark
"
/>
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=HaHaWTH/AuthMeReReloaded&type=Date" />
</picture>
+19 -7
View File
@@ -1,11 +1,17 @@
# AuthMeReReloaded
**"A fork of the best authentication plugin for the Bukkit modding API!⭐"**
[English](https://github.com/HaHaWTH/AuthMeReReloaded) | [简体中文](https://github.com/HaHaWTH/AuthMeReReloaded/blob/master/README-zh.md)
![Graph](https://bstats.org/signatures/bukkit/AuthMeReloaded-Fork.svg)
<p align="center">
<img src="https://img.shields.io/github/languages/code-size/HaHaWTH/AuthMeReReloaded.svg" alt="Code size"/>
<img src="https://img.shields.io/github/repo-size/HaHaWTH/AuthMeReReloaded.svg" alt="GitHub repo size"/>
<img src="https://www.codefactor.io/repository/github/hahawth/authmerereloaded/badge" alt="CodeFactor" />
<img alt="GitHub Downloads (all assets, all releases)" src="https://img.shields.io/github/downloads/HaHaWTH/AuthMeReReloaded/total?logo=github&label=GitHub%20Downloads&color=black">
<img alt="Spiget Downloads" src="https://img.shields.io/spiget/downloads/114010?logo=spigotmc&label=SpigotMC%20Downloads&color=orange">
<img alt="Modrinth Downloads" src="https://img.shields.io/modrinth/dt/3IEZ9vol?logo=modrinth&label=Modrinth%20Downloads&color=light-green">
<img alt="Hangar Downloads" src="https://img.shields.io/hangar/dt/AuthMeReReloaded?logo=hangar&label=Hangar%20Downloads&color=white">
</p>
**Detailed Changes:**
@@ -20,14 +26,16 @@
9. Improved listeners
10. Player login logic improvement to reduce lag
11. Automatically purge bot data
12. Folia compatibility (Still WIP)
12. **Folia support (in active testing)**
13. Offhand Menu compatibility(Thats amazing)
14. Automatically fix portal stuck issue
15. Automatically login for Bedrock players(configurable)
16. Fix shulker box crash bug on legacy versions(MC 1.13-)
17. **H2 database support**
18. **100% compatibility with original authme and extensions**
19. More......
14. **Velocity support (See [Velocity Support](./vc-support.md))**
15. Support Virtual Threads caching
16. Automatically fix portal stuck issue
17. Automatically login for Bedrock players(configurable)
18. Fix shulker box crash bug on legacy versions(MC 1.13-)
19. **H2 database support**
20. **100% compatibility with original authme and extensions**
21. More......
**Download links:**
[Releases](https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest)
@@ -37,6 +45,10 @@ If you are using FRP(内网穿透) for your server, this plugin may help [HAProx
**Pull Requests and suggestions are welcome!**
## License
Only modifications to AuthMeReloaded is under AGPL-3.0 license, AuthMeReloaded is licensed under GPL-3.0.
<picture>
<source
media="(prefers-color-scheme: dark)"
+1 -1
View File
@@ -108,4 +108,4 @@ brackets; optional arguments are enclosed in square brackets (`[ ]`).
---
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sun Apr 04 21:31:42 CEST 2021
This page was automatically generated on the [HaHaWTH/AuthMeReReloaded repository](https://github.com/HaHaWTH/AuthMeReReloaded/tree/master/docs/) on Sun Apr 04 21:31:42 CEST 2021
+667 -558
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -80,4 +80,4 @@ or bad.
---
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sun Apr 04 21:31:44 CEST 2021
This page was automatically generated on the [HaHaWTH/AuthMeReReloaded repository](https://github.com/HaHaWTH/AuthMeReReloaded/tree/master/docs/) on Sun Apr 04 21:31:44 CEST 2021
+1 -1
View File
@@ -73,4 +73,4 @@ The following are the permission nodes that are currently supported by the lates
---
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Sun Apr 04 21:31:44 CEST 2021
This page was automatically generated on the [HaHaWTH/AuthMeReReloaded repository](https://github.com/HaHaWTH/AuthMeReReloaded/tree/master/docs/) on Sun Apr 04 21:31:44 CEST 2021
+40 -38
View File
@@ -1,47 +1,49 @@
<!-- AUTO-GENERATED FILE! Do not edit this directly -->
<!-- File auto-generated on Wed Jun 21 12:14:29 CEST 2023. See docs/translations/translations.tpl.md -->
<!-- File auto-generated on Fri May 31 22:00:00 CST 2024. See docs/translations/translations.tpl.md -->
# AuthMe Translations
The following translations are available in AuthMe. Set `messagesLanguage` to the language code
in your config.yml to use the language, or use another language code to start a new translation.
Code | Language | Translated | &nbsp;
---- | -------- | ---------: | ------
[en](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_en.yml) | English | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[bg](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_bg.yml) | Bulgarian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[br](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_br.yml) | Brazilian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[cz](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_cz.yml) | Czech | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[de](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_de.yml) | German | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[eo](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_eo.yml) | Esperanto | 79% | <img src="https://via.placeholder.com/79x7/bb9900?text=%20" alt="79" />
[es](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_es.yml) | Spanish | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[et](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_et.yml) | Estonian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[eu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_eu.yml) | Basque | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[fi](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fi.yml) | Finnish | 45% | <img src="https://via.placeholder.com/45x7/aa5500?text=%20" alt="45" />
[fr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fr.yml) | French | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[gl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_gl.yml) | Galician | 48% | <img src="https://via.placeholder.com/48x7/aa5500?text=%20" alt="48" />
[hu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_hu.yml) | Hungarian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[id](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_id.yml) | Indonesian | 93% | <img src="https://via.placeholder.com/93x7/77dd44?text=%20" alt="93" />
[it](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_it.yml) | Italian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[ja](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ja.yml) | Japanese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[ko](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ko.yml) | Korean | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[lt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_lt.yml) | Lithuanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[nl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_nl.yml) | Dutch | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[pt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pt.yml) | Portuguese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[ro](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ro.yml) | Romanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[ru](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ru.yml) | Russian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[si](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_si.yml) | Slovenian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[sk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sk.yml) | Slovakian | 79% | <img src="https://via.placeholder.com/79x7/bb9900?text=%20" alt="79" />
[sr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sr.yml) | Serbian | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[tr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_tr.yml) | Turkish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[uk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_uk.yml) | Ukrainian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[vn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_vn.yml) | Vietnamese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[zhcn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhcn.yml) | Chinese (China) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
[zhhk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhhk.yml) | Chinese (Hong Kong) | 99% | <img src="https://via.placeholder.com/99x7/66ee55?text=%20" alt="99" />
[zhmc](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhmc.yml) | Chinese (Macau) | 64% | <img src="https://via.placeholder.com/64x7/bb7700?text=%20" alt="64" />
[zhtw](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhtw.yml) | Chinese (Taiwan) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" />
| Code | Language | Translated | &nbsp; |
|------------------------------------------------------------------------------------------------------------|---------------------|-----------:|---------------------------------------------------------------------------|
| [en](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_en.yml) | English | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [bg](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_bg.yml) | Bulgarian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [br](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_br.yml) | Brazilian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [cz](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_cz.yml) | Czech | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [de](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_de.yml) | German | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [eo](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_eo.yml) | Esperanto | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [es](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_es.yml) | Spanish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [et](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_et.yml) | Estonian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [eu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_eu.yml) | Basque | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [fi](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fi.yml) | Finnish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [fr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_fr.yml) | French | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [gl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_gl.yml) | Galician | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [hu](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_hu.yml) | Hungarian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [id](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_id.yml) | Indonesian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [it](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_it.yml) | Italian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [ja](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ja.yml) | Japanese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [ko](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ko.yml) | Korean | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [lt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_lt.yml) | Lithuanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [nl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_nl.yml) | Dutch | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [pl](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pl.yml) | Polish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [pt](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_pt.yml) | Portuguese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [ro](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ro.yml) | Romanian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [ru](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_ru.yml) | Russian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [si](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_si.yml) | Slovenian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [sk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sk.yml) | Slovakian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [sr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_sr.yml) | Serbian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [tr](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_tr.yml) | Turkish | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [uk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_uk.yml) | Ukrainian | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [vn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_vn.yml) | Vietnamese | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [zhcn](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhcn.yml) | Chinese (China) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [zhhk](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhhk.yml) | Chinese (Hong Kong) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [zhmc](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhmc.yml) | Chinese (Macau) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
| [zhtw](https://github.com/AuthMe/AuthMeReloaded/blob/master/src/main/resources/messages/messages_zhtw.yml) | Chinese (Taiwan) | 100% | <img src="https://via.placeholder.com/100x7/66ff66?text=%20" alt="100" /> |
---
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Wed Jun 21 12:14:29 CEST 2023
This page was automatically generated on
the [HaHaWTH/AuthMeReReloaded repository](https://github.com/HaHaWTH/AuthMeReReloaded/tree/master/docs/) on Fri May 31
22:00:00 CST 2024
+120 -112
View File
@@ -67,7 +67,7 @@
<maven.minimumVersion>3.6.3</maven.minimumVersion>
<!-- Dependencies versions -->
<spigot.version>1.20.4-R0.1-SNAPSHOT</spigot.version>
<spigot.version>1.20.6-R0.1-SNAPSHOT</spigot.version>
<!-- Versioning properties -->
<project.outputName>AuthMe</project.outputName>
@@ -82,54 +82,11 @@
<pluginDescription.authors>sgdc3, games647, Hex3l, krusic22</pluginDescription.authors>
</properties>
<!-- Jenkins profile -->
<profiles>
<!-- Set the buildNumber using the jenkins env. variable -->
<profile>
<id>jenkins</id>
<activation>
<property>
<name>env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<project.buildNumber>${env.BUILD_NUMBER}</project.buildNumber>
</properties>
</profile>
<!-- Skip long hash tests, reduce the test time of 20-30 seconds -->
<profile>
<id>skipLongHashTests</id>
<activation>
<property>
<name>skipLongHashTests</name>
</property>
</activation>
<properties>
<project.skipExtendedHashTests>true</project.skipExtendedHashTests>
</properties>
</profile>
<!-- Skip javadoc generation for faster local build -->
<profile>
<id>skipJavadocGeneration</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<defaultGoal>clean package</defaultGoal>
<!-- Little hack to make the shade plugin output a file with the right name -->
<finalName>${project.finalNameBase}-noshade</finalName>
<resources>
<resource>
<directory>.</directory>
@@ -154,7 +111,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.4.1</version>
<version>3.7.0</version>
<configuration>
<failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings>
@@ -169,7 +126,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.2.1</version>
<version>3.5.0</version>
<executions>
<execution>
<id>enforce-environment</id>
@@ -222,7 +179,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<version>0.8.12</version>
<executions>
<execution>
<id>pre-unit-test</id>
@@ -238,27 +195,18 @@
</execution>
</executions>
</plugin>
<!-- Unit testing -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- Force the right file encoding during unit testing -->
<!-- Set language to English in order to get consistent results for localized time formatting -->
<argLine>-Dfile.encoding=${project.build.sourceEncoding} -Duser.language=en @{argLine}</argLine>
<systemPropertyVariables>
<project.skipExtendedHashTests>${project.skipExtendedHashTests}</project.skipExtendedHashTests>
</systemPropertyVariables>
<!-- Don't trim stack traces -->
<trimStackTrace>false</trimStackTrace>
</configuration>
</plugin>
<!-- Generate a jar containing classes and resources -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<version>3.4.1</version>
<configuration>
<archive>
<manifestEntries>
<paperweight-mappings-namespace>mojang</paperweight-mappings-namespace>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- Generate a jar containing the source javadoc -->
<plugin>
@@ -282,7 +230,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<version>3.3.1</version>
<configuration>
<finalName>${project.finalNameBase}</finalName>
</configuration>
@@ -299,7 +247,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<version>3.6.0</version>
<executions>
<execution>
<id>shaded-jar</id>
@@ -308,6 +256,7 @@
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.finalNameBase}-Lite</finalName>
<artifactSet>
<excludes>
<!-- Guava -->
@@ -318,18 +267,46 @@
<exclude>com.google.j2objc:j2objc-annotations</exclude>
<!-- Gson -->
<exclude>com.google.code.gson:gson</exclude>
</excludes>
</excludes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.apache.http</pattern>
<shadedPattern>fr.xephi.authme.libs.org.apache.http</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.commons</pattern>
<shadedPattern>fr.xephi.authme.libs.org.apache.commons</shadedPattern>
</relocation>
<relocation>
<pattern>waffle</pattern>
<shadedPattern>fr.xephi.authme.libs.waffle</shadedPattern>
</relocation>
<relocation>
<pattern>com.github.benmanes.caffeine</pattern>
<shadedPattern>fr.xephi.authme.libs.com.github.benmanes.caffeine</shadedPattern>
</relocation>
</relocations>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
<execution>
<id>shaded-jar-legacy</id>
<id>shaded-jar-relocate</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.finalNameBase}-Spigot-Universal</finalName>
<finalName>${project.finalNameBase}-Universal</finalName>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
@@ -352,8 +329,20 @@
<shadedPattern>fr.xephi.authme.libs.com.google.gson</shadedPattern>
</relocation>
<relocation>
<pattern>org.h2</pattern>
<shadedPattern>fr.xephi.authme.libs.org.h2</shadedPattern>
<pattern>org.apache.http</pattern>
<shadedPattern>fr.xephi.authme.libs.org.apache.http</shadedPattern>
</relocation>
<relocation>
<pattern>org.apache.commons</pattern>
<shadedPattern>fr.xephi.authme.libs.org.apache.commons</shadedPattern>
</relocation>
<relocation>
<pattern>waffle</pattern>
<shadedPattern>fr.xephi.authme.libs.waffle</shadedPattern>
</relocation>
<relocation>
<pattern>com.github.benmanes.caffeine</pattern>
<shadedPattern>fr.xephi.authme.libs.com.github.benmanes.caffeine</shadedPattern>
</relocation>
</relocations>
</configuration>
@@ -461,6 +450,22 @@
<pattern>org.apache.commons.validator</pattern>
<shadedPattern>fr.xephi.authme.libs.org.apache.commons.validator</shadedPattern>
</relocation>
<relocation>
<pattern>com.alessiodp.libby</pattern>
<shadedPattern>fr.xephi.authme.libs.com.alessiodp.libby</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori.adventure</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.adventure</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori.examination</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.examination</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori.option</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.option</shadedPattern>
</relocation>
</relocations>
<filters>
@@ -473,7 +478,6 @@
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>META-INF/*.MF</exclude>
<exclude>META-INF/DEPENDENCIES</exclude>
<exclude>META-INF/**/module-info.class</exclude>
</excludes>
@@ -493,13 +497,13 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>3.1.0</version>
<version>3.1.2</version>
</plugin>
<!-- Deploy the jars as artifacts into the remote repository -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.0.0</version>
<version>3.1.2</version>
</plugin>
<!-- Handle documentation generation, required by other plugins -->
<plugin>
@@ -537,6 +541,12 @@
<url>https://repo.opencollab.dev/maven-snapshots/</url>
</repository>
<!-- Adventure API -->
<repository>
<id>sonatype-oss-snapshots1</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
<!-- Apache snapshots repo -->
<repository>
<id>apache-snapshots</id>
@@ -607,6 +617,12 @@
</snapshots>
</repository>
<!-- Maven Central Snapshots Repository -->
<repository>
<id>maven-snapshots</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
<!-- Multiverse Repo -->
<repository>
<id>onarandombox-repo-releases</id>
@@ -709,7 +725,7 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.6.0</version>
<version>1.6-SNAPSHOT</version>
<optional>true</optional>
</dependency>
@@ -721,6 +737,14 @@
<scope>provided</scope>
</dependency>
<!-- Libby -->
<dependency>
<groupId>com.alessiodp.libby</groupId>
<artifactId>libby-bukkit</artifactId>
<version>2.0.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- Database Connection Pool -->
<dependency>
<groupId>com.zaxxer</groupId>
@@ -791,10 +815,6 @@
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-chat</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
@@ -866,6 +886,23 @@
</exclusions>
</dependency>
<!-- Adventure API -->
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.17.0</version>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId>
<version>4.3.2</version>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-gson</artifactId>
<version>4.17.0</version>
</dependency>
<!-- LuckPerms plugin -->
<dependency>
<groupId>net.luckperms</groupId>
@@ -1087,35 +1124,6 @@
</exclusions>
</dependency>
<!-- Unit Testing Libraries -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>java-hamcrest</artifactId>
<scope>test</scope>
<version>2.0.0.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
<version>5.2.0</version>
<exclusions>
<exclusion>
<artifactId>hamcrest-core</artifactId>
<groupId>org.hamcrest</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- Required to mock the LuckPerms API-->
<dependency>
<groupId>org.checkerframework</groupId>
@@ -1126,9 +1134,9 @@
<!-- Universal Scheduler -->
<dependency>
<groupId>com.github.HomoMC</groupId>
<groupId>com.github.Anon8281</groupId>
<artifactId>UniversalScheduler</artifactId>
<version>0.1.7</version>
<version>0.1.6</version>
<scope>compile</scope>
</dependency>
@@ -1136,14 +1144,14 @@
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.45.2.0</version>
<version>3.46.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
<scope>compile</scope>
<scope>provided</scope>
</dependency>
</dependencies>
-564
View File
@@ -1,564 +0,0 @@
# =======================================================================================================
# _____ __ .__ _____ __________ .__ .___ .___
# / _ \ __ ___/ |_| |__ / \ ____\______ \ ____ | | _________ __| _/____ __| _/
# / /_\ \| | \ __| | \ / \ / \_/ __ \| __/ __ \| | / _ \__ \ / __ _/ __ \ / __ |
# / | | | /| | | Y / Y \ ___/| | \ ___/| |_( <_> / __ \/ /_/ \ ___// /_/ |
# \____|__ |____/ |__| |___| \____|__ /\___ |____|_ /\___ |____/\____(____ \____ |\___ \____ |
# \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
#
# =======================================================================================================
#
# Authme Main Configuration File.
#
# =======================================================================================================
# Plugin infos (overwritten on start, just a simple way to find out your plugin version).
authors: ${pluginAuthors}
version: ${project.version}
buildNumber: ${buildNumber}
# Set this setting to true when you have configured the plugin,
# when false the server will be stopped with a warning message.
enabled: false
# Database settings.
data_source:
# ===========================
# Database general settings.
# ===========================
# Database backend (sqlite, mysql).
backend: sqlite
# Enable database queries caching, should improve performance.
caching: true
# ===========================
# SqLite db parameters.
# ===========================
sqlite:
# The name of the database storage file.
filename: 'authme.db'
# ===========================
# MySql db parameters.
# ===========================
mysql:
# Connection parameters.
host: '127.0.0.1'
port: 3306
username: 'change_me'
password: 'change_me'
database: 'my_minecraft_server'
tablename: 'authme'
# Column names.
column_names:
id: id
# Column for storing nicknames (ignore case nickname).
name: username
# Column for storing the realname (case sensitive nickname).
real_name: realname
# Column for storing passwords.
password: password
# Column for storing email addresses.
email: email
# Column for storing the authentication status (logged or not).
login_status: isLogged
# Column for storing player IPs.
ip: ip
# Column for storing lastlogins date and time.
last_login_timestamp: lastlogin
# Latest logout location of the players.
last_location:
world: world
x: x
y: y
z: z
# Enabled only if the bungeecord integration is activated.
server: world
# Support for registrations via WebInterfaces/CSM.
# Disable some backend caching parameters.
disableAggressiveCaching: false
# Main settings
settings:
# ===========================
# Bungeecord integration
# ===========================
bungeecord:
# Enable bungeecord integration features
enabled: true
# Server name (must be unique, please use the name in the bungeecord configuration).
# Use 'auto' for auto configuration (requires the bungeecord module).
serverName: LoginLobby1
# Keep the auth status when the player moves between servers.
# Required if you're using the bungeecord module.
keepAuthBetweenServers: true
# Target server after login
send_after_login:
enabled: false
message: ''
delay: 5
# Server name ("ServerName") or group ("G:GroupName")
# Groups are avariable only when the bungeecord module is avariable.
# If the server change fails the player will be kicked.
target: Lobby1
failKickMessage: 'Failed to connect to the lobby! Please try to join the server again!'
# Target server after logout
send_after_logout:
enabled: false
message: ''
delay: 5
# Server name ("ServerName") or group ("G:GroupName")
# Groups are avariable only when the bungeecord module is avariable.
# If the server change fails the player will be kicked.
target: LoginLobby1
failKickMessage: 'Failed to connect to the lobby! Please try to join the server again!'
# Variables:
# %p playername
bungee_commands:
player_command_after_register:
enabled: false
cmd: ''
console_command_after_register:
enabled: false
cmd: 'alert %p joined for the first time the network!'
player_command_after_login:
enabled: false
cmd: 'glist'
console_command_after_login:
enabled: false
cmd: 'alert %p logged in correctly!'
player_command_after_join:
enabled: false
cmd: ''
console_command_after_join:
enabled: false
cmd: 'alert %p joined the network!'
player_command_first_join:
enabled: false
cmd: ''
console_command_first_join:
enabled: false
cmd: 'alert %p joined for the first time the network!'
# ===========================
# Sessions configuration.
# ===========================
sessions:
# Enable sessions.
# When a player is authenticated, his IP and his nickname is saved.
# The next time the player will join the server, if his IP is the same
# of the last time, and the timeout time hasn't expired, he will be
# automatically authenticated.
enabled: false
# Session timeout.
# 0 for unlimited time (Very dangerous, use it at your own risk!)
# Consider that if player's ip has changed but the timeout hasn't
# expired, player will be kicked out of the sever!
timeout: 10
# When enabled a player's session will expire if someone tries to
# login with a different IP Address.
expire_on_ip_change: true
# ===========================
# Registration settings.
# ===========================
registration:
# After how many time unregistered players should be kicked?
# Set to 0 to disable. (default: 30)
timeout: 30
nickname:
min_length: 4
max_lenght: 16
# Regex syntax.
allowed_characters: '[a-zA-Z0-9_]*'
password:
# Enable double check of password on registration:
# /register <password> <confirmPassword>
double_check: true
# Minimum password lenght.
min_length: 5
# Regex syntax.
allowed_characters: '[\x21-\x7E]*'
# Denied unsafe passwords.
unsafePasswords:
- '123456'
- 'password'
- 'qwerty'
- '12345'
- '54321'
# ===========================
# Login settings.
# ===========================
login:
# After how many time unlogged players should be kicked?
# Set to 0 to disable. (default: 30)
timeout: 30
# ===========================
# Encryption parameters.
# ===========================
password_encryption:
# The hashing algorithm.
# Possible values: MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB, MYBB, IPB3,
# PHPFUSION, SMF, XENFORO, SALTED2MD5, JOOMLA, BCRYPT, WBB3, SHA512, DOUBLEMD5,
# PBKDF2, PBKDF2DJANGO, WORDPRESS, ROYALAUTH, CUSTOM (developpers only).
encryption_algorithm: SHA256
# The salt length for the SALTED2MD5 and MD5(MD5(password)+salt) algorithms.
md5_salt_length: 8
# If password check fails try all the other hash algorithm.
# AuthMe will update the password to the new passwordHash.
enable_convertion: false
# ===========================
# Unlogged user restrictions.
# ===========================
unlogged_restrictions:
# Deny chat messages send for unlogged users.
deny_chat: true
# Hide chat to unlogged users.
# Only player messages, plugins will be able to send messages to the player anyway.
hide_chat: false
# Deny any command message not in the whitelist below.
deny_commands: true
command_whitelist:
- /login
- /register
- /l
- /reg
- /email
- /captcha
movements:
# Restrict player movements.
restrict: true
# Allowed radius.
allowed_radius: 0
# Should unlogged players have speed = 0?
# After the login the walking/flying speeed will be reset to the default value.
removeSpeed: true
# End is there atm xD
# This option will save the quit location of the players.
SaveQuitLocation: false
# Should not logged in players be teleported to the spawn?
# After the authentication, if SaveQuitLocation is enabled,
# they will be teleported back to their normal position.
teleportUnAuthedToSpawn: false
# If enabled, after the login, if the ForceSpawnOnTheseWorlds setting contains
# the player's world, he will be teleported to the world spawnpoint.
# The quit location of the player will be overwritten.
# This is different from "teleportUnAuthedToSpawn" that teleports player
# back to his quit location after the authentication.
ForceSpawnLocOnJoinEnabled: false
# WorldNames where we need to force the spawn location
# Warning: This setting is Case Sensitive!
ForceSpawnOnTheseWorlds:
- world
- world_nether
- world_the_end
# this is very important options,
# every time player join the server,
# if they are registered, AuthMe will switch him
# to unLoggedInGroup, this
# should prevent all major exploit.
# So you can set up on your Permission Plugin
# this special group with 0 permissions, or permissions to chat,
# or permission to
# send private message or all other perms that you want,
# the better way is to set up
# this group with few permissions,
# so if player try to exploit some account,
# they can
# do anything except what you set in perm Group.
# After a correct logged-in player will be
# moved to his correct permissions group!
# Pay attention group name is case sensitive,
# so Admin is different from admin,
# otherwise your group will be wiped,
# and player join in default group []!
# Example unLoggedinGroup: NotLogged
unLoggedinGroup: unLoggedinGroup
# ===========================
# Address restrictions
# ===========================
# Max number of registrations per IP (default: 1)
maxRegPerIp: 1
# Maximum allowed number of Logins per IP, 0 to disable (default: 0)
maxLoginPerIp: 0
# Maximum allowed number of Joins per IP, 0 to disable (default: 0)
maxJoinPerIp: 0
# When this setting is enabled, online players can't be kicked out
# due to "Logged in from another Location"
# This setting will prevent potential security exploits.
ForceSingleSession: true
# To activate the restricted user feature you need
# to enable this option and configure the
# AllowedRestrictedUser field.
AllowRestrictedUser: false
# The restricted user feature will kick players listed below
# if they dont match of the defined ip address.
# Example:
# AllowedRestrictedUser:
# - playername;127.0.0.1
AllowedRestrictedUser:
- playername;127.0.0.
# Ban ip when the ip is not the ip registered in database
banUnsafedIP: false
# ===============================
# Other restrictions
# ===============================
# Should we protect the player inventory before logging in?
# Warning: Requires the latest version of ProtocolLib!
ProtectInventoryBeforeLogIn: true
# Should unregistered players be kicked immediately?
kickNonRegistered: false
# Should players be kicked on wrong password?
kickOnWrongPassword: false
# Should we display all other accounts of a player when he joins?
# Required permission: authme.admin.accounts
displayOtherAccounts: true
# ===============================
# Restrictions compatibility
# ===============================
# Spawn Priority. Avariable values : authme, essentials, multiverse, default
spawnPriority: authme,essentials,multiverse,default
# AuthMe will NEVER teleport players!
noTeleport: false
GameMode:
# Do you want to set player's gamemode to survival when he joins?
# This enables also the settings below.
ForceSurvivalMode: false
# Do you want to reset player's inventory if player joins with creative mode?
ResetInventoryIfCreative: false
# Do you want to force the survival mode ONLY after the /login process?
ForceOnlyAfterLogin: false
# sgdc3: Ok, our configuration is shit.... xD Today I will stop there
registration:
# enable registration on the server?
enabled: true
# Send every X seconds a message to a player to
# remind him that he has to login/register
messageInterval: 5
# Only registered and logged in players can play.
# See restrictions for exceptions
force: true
# Does we replace password registration by an Email registration method ?
enableEmailRegistrationSystem: false
# Enable double check of email when you register
# when it's true, registration require that kind of command:
# /register <email> <confirmEmail>
doubleEmailCheck: false
# Do we force kicking player after a successful registration ?
# Do not use with login feature below
forceKickAfterRegister: false
# Does AuthMe need to enforce a /login after a successful registration ?
forceLoginAfterRegister: false
unrestrictions:
# below you can list all your account name, that
# AuthMe will ignore for registration or login, configure it
# at your own risk!! Remember that if you are going to add
# nickname with [], you have to delimit name with ' '.
# this option add compatibility with BuildCraft and some
# other mods.
# It is CaseSensitive!
UnrestrictedName: []
# Message language, available : en, de, br, cz, pl, fr, ru, hu, sk, es, zhtw, fi, zhcn, lt, it, ko, pt
messagesLanguage: en
# Force these commands after /login, without any '/', use %p for replace with player name
forceCommands: []
# Force these commands after /login as a server console, without any '/', use %p for replace with player name
forceCommandsAsConsole: []
# Force these commands after /register, without any '/', use %p for replace with player name
forceRegisterCommands: []
# Force these commands after /register as a server console, without any '/', use %p for replace with player name
forceRegisterCommandsAsConsole: []
# Do we need to broadcast the welcome message to all server or only to the player? set true for server or false for player
broadcastWelcomeMessage: false
# Do we need to delay the join/leave message to be displayed only when the player is authenticated ?
delayJoinMessage: false
removeJoinMessage: false
removeLeaveMessage: false
# Do we need to add potion effect Blinding before login/register ?
applyBlindEffect: false
ExternalBoardOptions:
# MySQL column for the salt , needed for some forum/cms support
mySQLColumnSalt: ''
# MySQL column for the group, needed for some forum/cms support
mySQLColumnGroup: ''
# -1 mean disabled. If u want that only
# activated player can login in your server
# u can put in this options the group number
# of unactivated user, needed for some forum/cms support
nonActivedUserGroup: -1
# Other MySQL columns where we need to put the Username (case sensitive)
mySQLOtherUsernameColumns: []
# How much Log to Round needed in BCrypt(do not change it if you do not know what's your doing)
bCryptLog2Round: 10
# phpBB prefix defined during phpbb installation process
phpbbTablePrefix: 'phpbb_'
# phpBB activated group id , 2 is default registered group defined by phpbb
phpbbActivatedGroupId: 2
# WordPress prefix defined during WordPress installation process
wordpressTablePrefix: 'wp_'
permission:
# Take care with this options, if you dont want
# to use Vault and Group Switching of
# AuthMe for unloggedIn players put true
# below, default is false.
EnablePermissionCheck: false
BackupSystem:
# Enable or Disable Automatic Backup
ActivateBackup: false
# set Backup at every start of Server
OnServerStart: false
# set Backup at every stop of Server
OnServerStop: true
# Windows only mysql installation Path
MysqlWindowsPath: 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\'
Security:
SQLProblem:
# Stop the server if we can't contact the sql database
# Take care with this, if you set that to false,
# AuthMe automatically disable and the server is not protected!
stopServer: true
ReloadCommand:
# /reload support
useReloadCommandSupport: true
console:
# Remove spam console
noConsoleSpam: false
captcha:
# Player need to put a captcha when he fails too lot the password
useCaptcha: false
# Max allowed tries before request a captcha
maxLoginTry: 5
# Captcha length
captchaLength: 5
Converter:
Rakamak:
# Rakamak file name
fileName: users.rak
# Rakamak use ip ?
useIP: false
# IP file name for rakamak
ipFileName: UsersIp.rak
CrazyLogin:
# CrazyLogin database file
fileName: accounts.db
Email:
# Email SMTP server host
mailSMTP: smtp.gmail.com
# Email SMTP server port
mailPort: 465
# Email account that send the mail
mailAccount: ''
# Email account password
mailPassword: ''
# Custom SenderName, that replace the mailAccount name in the email
mailSenderName: ''
# Random password length
RecoveryPasswordLength: 8
# Email subject of password get
mailSubject: 'Your new AuthMe Password'
# Email text here
mailText: 'Dear <playername>, <br /><br /> This is your new AuthMe password for the server <br /><br /> <servername> : <br /><br /> <generatedpass><br /><br />Do not forget to change password after login! <br /> /changepassword <generatedpass> newPassword'
# Like maxRegPerIp but with email
maxRegPerEmail: 1
# Recall players to add an email ?
recallPlayers: false
# Delay in minute for the recall scheduler
delayRecall: 5
# Blacklist these domains for emails
emailBlacklisted:
- 10minutemail.com
# WhiteList only these domains for emails
emailWhitelisted: []
# Do we need to send new password draw in an image ?
generateImage: false
Hooks:
# Do we need to hook with multiverse for spawn checking?
multiverse: true
# Do we need to hook with BungeeCord for get the real Player ip ?
bungeecord: false
# Do we need to disable Essentials SocialSpy on join ?
disableSocialSpy: true
# Do we need to force /motd Essentials command on join ?
useEssentialsMotd: false
# Do we need to cache custom Attributes ?
customAttributes: false
Purge:
# On Enable , does AuthMe need to purge automatically old accounts unused ?
useAutoPurge: false
# Number of Days an account become Unused
daysBeforeRemovePlayer: 60
# Do we need to remove the player.dat file during purge process ?
removePlayerDat: false
# Do we need to remove the Essentials/users/player.yml file during purge process ?
removeEssentialsFile: false
# World where are players.dat stores
defaultWorld: 'world'
# Do we need to remove LimitedCreative/inventories/player.yml , player_creative.yml files during purge process ?
removeLimitedCreativesInventories: false
# Do we need to remove the AntiXRayData/PlayerData/player file during purge process ?
removeAntiXRayFile: false
# Do we need to remove permissions ?
removePermissions: false
Protection:
# Enable some servers protection ( country based login, antibot )
enableProtection: false
# Countries allowed to join the server and register, see http://dev.bukkit.org/bukkit-plugins/authme-reloaded/pages/countries-codes/ for countries' codes
countries:
- US
- GB
# Countries blacklisted automatically ( without any needed to enable protection )
countriesBlacklist:
- A1
# Do we need to enable automatic antibot system?
enableAntiBot: false
# Max number of player allowed to login in 5 secs before enable AntiBot system automatically
antiBotSensibility: 5
# Duration in minutes of the antibot automatic system
antiBotDuration: 10
VeryGames:
# These features are only available on VeryGames Server Provider
enableIpCheck: false
-199
View File
@@ -1,199 +0,0 @@
name: ${pluginName}
authors: [${pluginAuthors}]
website: ${project.url}
description: ${project.description}
main: ${mainClass}
version: ${project.version}-b${buildNumber}
softdepend:
- Vault
- PermissionsBukkit
- PermissionsEX
- EssentialsGroupManager
- Multiverse-Core
- Essentials
- EssentialsSpawn
- ProtocolLib
commands:
authme:
description: AuthMe admin commands
usage: '/authme reload|register playername password|changepassword playername password|unregister playername|version|converter datatype'
permission: authme.admin
register:
description: Register an account
usage: /register password confirmpassword
aliases: [reg]
permission: authme.player.register
login:
description: Login into a account
usage: /login password
aliases: [l,log]
permission: authme.player.login
changepassword:
description: Change password of a account
usage: /changepassword oldPassword newPassword
permission: authme.player.changepassword
logout:
description: Logout from the server
usage: /logout
permission: authme.player.logout
unregister:
description: unregister your account
usage: /unregister password
permission: authme.player.unregister
email:
description: Add Email or recover password
usage: '/email add your@email.com your@email.com|change oldEmail newEmail|recovery your@email.com'
permission: authme.player.email
captcha:
description: Captcha command
usage: /captcha theCaptcha
permission: authme.player.captcha
permissions:
authme.canbeforced:
description: Allow the user to be forced-logged via API
default: true
authme.player:
description: Gives access to all authme player commands
default: true
children:
authme.player.login: true
authme.player.logout: true
authme.player.register: true
authme.player.unregister: true
authme.player.changepassword: true
authme.player.captcha: true
authme.player.email: true
authme.player.register:
description: Register your account
default: false
authme.player.unregister:
description: Unregister your account
default: false
authme.player.login:
description: Login into your account
default: false
authme.player.logout:
description: Logout from your account
default: false
authme.player.changepassword:
description: Change password of your account
default: false
authme.player.email:
description: Gives access to player's email commands
default: false
children:
authme.player.email.add: true
authme.player.email.change: true
authme.player.email.recover: true
authme.player.email.add:
description: Add an email to your account
default: false
authme.player.email.change:
description: Change email of your account
default: false
authme.player.email.recover:
description: Recover your account
default: false
authme.player.captcha:
description: Captcha command
default: false
authme.admin:
description: Gives access to all authme admin commands
default: op
children:
authme.admin.forcelogin: true
authme.admin.forcelogout: true
authme.admin.register: true
authme.admin.unregister: true
authme.admin.changemail: true
authme.admin.changepassword: true
authme.admin.lastlogin: true
authme.admin.accounts: true
authme.admin.getemail: true
authme.admin.getip: true
authme.admin.setspawn: true
authme.admin.spawn: true
authme.admin.setfirstspawn: true
authme.admin.firstspawn: true
authme.admin.purge: true
authme.admin.purgebannedplayers: true
authme.admin.purgelastpos: true
authme.admin.converter: true
authme.admin.reload: true
authme.admin.switchantibot: true
authme.admin.seeotheraccounts: true
authme.admin.register:
description: Register an account
default: false
authme.admin.unregister:
description: Unregister an account
default: false
authme.admin.forcelogin:
description: Force login for that player
default: false
authme.admin.forcelogout:
description: Force logout for that player
default: false
authme.admin.changepassword:
description: Change the password of an account
default: false
authme.admin.getemail:
description: Get last email about a player
default: false
authme.admin.changeemail:
description: Change a player email
default: false
authme.admin.accounts:
description: Display Players Accounts
default: false
authme.admin.seeotheraccounts:
description: Display other accounts about a player when he logs in
default: false
authme.admin.lastlogin:
description: Get last login date about a player
default: false
authme.admin.getip:
description: Get IP from a player (fake and real)
default: false
authme.admin.setspawn:
description: Set the AuthMe spawn point
default: false
authme.admin.spawn:
description: Teleport to AuthMe spawn point
default: false
authme.admin.setfirstspawn:
description: Set the AuthMe First Spawn Point
default: false
authme.admin.firstspawn:
description: Teleport to AuthMe First Spawn Point
default: false
authme.admin.switchantibot:
description: Switch AntiBot mode on/off
default: false
authme.admin.purge:
description: Database purge command
default: false
authme.admin.purgebannedplayers:
description: Purge banned players
default: false
authme.admin.purgelastpos:
description: Purge last position of a player/players
default: false
authme.admin.converter:
description: Allow the /authme converter command
default: false
authme.admin.reload:
description: Reload the plugin
default: false
authme.vip:
description: Allow vip slot when the server is full
default: false
authme.bypassantibot:
description: Bypass the AntiBot check
default: false
authme.allowmultipleaccounts:
description: Allow more accounts for same ip
default: false
authme.bypassforcesurvival:
description: Bypass all ForceSurvival features
default: false
File diff suppressed because one or more lines are too long
@@ -1,148 +0,0 @@
<?php
/*****************************************************************************
* AuthMe website integration logic *
* ------------------------------------------------------------------------- *
* Allows interaction with the AuthMe database (registration, password *
* verification). Don't forget to update the AUTHME_TABLE value and your *
* database credentials in getAuthmeMySqli(). *
* *
* Source: https://github.com/AuthMe/AuthMeReloaded/ *
*****************************************************************************/
abstract class AuthMeController {
const AUTHME_TABLE = 'authme';
/**
* Entry point function to check supplied credentials against the AuthMe database.
*
* @param string $username the username
* @param string $password the password
* @return bool true iff the data is correct, false otherwise
*/
function checkPassword($username, $password) {
if (is_scalar($username) && is_scalar($password)) {
$hash = $this->getHashFromDatabase($username);
if ($hash) {
return $this->isValidPassword($password, $hash);
}
}
return false;
}
/**
* Returns whether the user exists in the database or not.
*
* @param string $username the username to check
* @return bool true if the user exists; false otherwise
*/
function isUserRegistered($username) {
$mysqli = $this->getAuthmeMySqli();
if ($mysqli !== null) {
$stmt = $mysqli->prepare('SELECT 1 FROM ' . self::AUTHME_TABLE . ' WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
return $stmt->fetch();
}
// Defensive default to true; we actually don't know
return true;
}
/**
* Registers a player with the given username.
*
* @param string $username the username to register
* @param string $password the password to associate to the user
* @param string $email the email (may be empty)
* @return bool whether or not the registration was successful
*/
function register($username, $password, $email) {
$email = $email ? $email : 'your@email.com';
$mysqli = $this->getAuthmeMySqli();
if ($mysqli !== null) {
$hash = $this->hash($password);
$stmt = $mysqli->prepare('INSERT INTO ' . self::AUTHME_TABLE . ' (username, realname, password, email, ip) '
. 'VALUES (?, ?, ?, ?, ?)');
$username_low = strtolower($username);
$stmt->bind_param('sssss', $username_low, $username, $hash, $email, $_SERVER['REMOTE_ADDR']);
return $stmt->execute();
}
return false;
}
/**
* Changes password for player.
*
* @param string $username the username
* @param string $password the password
* @return bool true whether or not password change was successful
*/
function changePassword($username, $password) {
$mysqli = $this->getAuthmeMySqli();
if ($mysqli !== null) {
$hash = $this->hash($password);
$stmt = $mysqli->prepare('UPDATE ' . self::AUTHME_TABLE . ' SET password=? '
. 'WHERE username=?');
$username_low = strtolower($username);
$stmt->bind_param('ss', $hash, $username_low);
return $stmt->execute();
}
return false;
}
/**
* Hashes the given password.
*
* @param $password string the clear-text password to hash
* @return string the resulting hash
*/
protected abstract function hash($password);
/**
* Checks whether the given password matches the hash.
*
* @param $password string the clear-text password
* @param $hash string the password hash
* @return boolean true if the password matches, false otherwise
*/
protected abstract function isValidPassword($password, $hash);
/**
* Returns a connection to the database.
*
* @return mysqli|null the mysqli object or null upon error
*/
private function getAuthmeMySqli() {
// CHANGE YOUR DATABASE DETAILS HERE BELOW: host, user, password, database name
$mysqli = new mysqli('localhost', 'root', '', 'authme');
if (mysqli_connect_error()) {
printf('Could not connect to AuthMe database. Errno: %d, error: "%s"',
mysqli_connect_errno(), mysqli_connect_error());
return null;
}
return $mysqli;
}
/**
* Retrieves the hash associated with the given user from the database.
*
* @param string $username the username whose hash should be retrieved
* @return string|null the hash, or null if unavailable (e.g. username doesn't exist)
*/
private function getHashFromDatabase($username) {
$mysqli = $this->getAuthmeMySqli();
if ($mysqli !== null) {
$stmt = $mysqli->prepare('SELECT password FROM ' . self::AUTHME_TABLE . ' WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($password);
if ($stmt->fetch()) {
return $password;
}
}
return null;
}
}
-20
View File
@@ -1,20 +0,0 @@
<?php
/***********************************************************
* AuthMe website integration logic for BCrypt *
* ------------------------------------------------------- *
* See AuthMeController for details. *
* *
* Source: https://github.com/AuthMe/AuthMeReloaded/ *
***********************************************************/
class Bcrypt extends AuthMeController {
protected function hash($password) {
return password_hash($password, PASSWORD_BCRYPT);
}
protected function isValidPassword($password, $hash) {
return password_verify($password, $hash);
}
}
-53
View File
@@ -1,53 +0,0 @@
<?php
/***********************************************************
* AuthMe website integration logic for PBKDF2 *
* ------------------------------------------------------- *
* See AuthMeController for details. *
* *
* Source: https://github.com/AuthMe/AuthMeReloaded/ *
***********************************************************/
class Pbkdf2 extends AuthMeController {
/** @var string[] range of characters for salt generation */
private $CHARS;
const SALT_LENGTH = 16;
const NUMBER_OF_ITERATIONS = 10000;
public function __construct() {
$this->CHARS = self::initCharRange();
}
protected function isValidPassword($password, $hash) {
// hash := pbkdf2_sha256$iterations$salt$hash
$parts = explode('$', $hash);
return count($parts) === 4 && $hash === $this->computeHash($parts[1], $parts[2], $password);
}
protected function hash($password) {
$salt = $this->generateSalt();
return $this->computeHash(self::NUMBER_OF_ITERATIONS, $salt, $password);
}
private function computeHash($iterations, $salt, $password) {
return 'pbkdf2_sha256$' . self::NUMBER_OF_ITERATIONS . '$' . $salt
. '$' . hash_pbkdf2('sha256', $password, $salt, self::NUMBER_OF_ITERATIONS, 64, false);
}
/**
* @return string randomly generated salt
*/
private function generateSalt() {
$maxCharIndex = count($this->CHARS) - 1;
$salt = '';
for ($i = 0; $i < self::SALT_LENGTH; ++$i) {
$salt .= $this->CHARS[mt_rand(0, $maxCharIndex)];
}
return $salt;
}
private static function initCharRange() {
return array_merge(range('0', '9'), range('a', 'f'));
}
}
-48
View File
@@ -1,48 +0,0 @@
<?php
/***********************************************************
* AuthMe website integration logic for SHA256 *
* ------------------------------------------------------- *
* See AuthMeController for details. *
* *
* Source: https://github.com/AuthMe/AuthMeReloaded/ *
***********************************************************/
class Sha256 extends AuthMeController {
/** @var string[] range of characters for salt generation */
private $CHARS;
const SALT_LENGTH = 16;
public function __construct() {
$this->CHARS = self::initCharRange();
}
protected function isValidPassword($password, $hash) {
// $SHA$salt$hash, where hash := sha256(sha256(password) . salt)
$parts = explode('$', $hash);
return count($parts) === 4 && $parts[3] === hash('sha256', hash('sha256', $password) . $parts[2]);
}
protected function hash($password) {
$salt = $this->generateSalt();
return '$SHA$' . $salt . '$' . hash('sha256', hash('sha256', $password) . $salt);
}
/**
* @return string randomly generated salt
*/
private function generateSalt() {
$maxCharIndex = count($this->CHARS) - 1;
$salt = '';
for ($i = 0; $i < self::SALT_LENGTH; ++$i) {
$salt .= $this->CHARS[mt_rand(0, $maxCharIndex)];
}
return $salt;
}
private static function initCharRange() {
return array_merge(range('0', '9'), range('a', 'f'));
}
}
-102
View File
@@ -1,102 +0,0 @@
<!--
This is a demo page for AuthMe website integration.
See AuthMeController.php and the extending classes for the PHP code you need.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<title>AuthMe Integration Sample</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
error_reporting(E_ALL);
require 'AuthMeController.php';
// Change this to the file of the hash encryption you need, e.g. Bcrypt.php or Sha256.php
require 'Sha256.php';
// The class name must correspond to the file you have in require above! e.g. require 'Sha256.php'; and new Sha256();
$authme_controller = new Sha256();
$action = get_from_post_or_empty('action');
$user = get_from_post_or_empty('username');
$pass = get_from_post_or_empty('password');
$email = get_from_post_or_empty('email');
$was_successful = false;
if ($action && $user && $pass) {
if ($action === 'Log in') {
$was_successful = process_login($user, $pass, $authme_controller);
} else if ($action === 'Register') {
$was_successful = process_register($user, $pass, $email, $authme_controller);
}
}
if (!$was_successful) {
echo '<h1>Login sample</h1>
This is a demo form for AuthMe website integration. Enter your AuthMe login details
into the following form to test it.
<form method="post">
<table>
<tr><td>Name</td><td><input type="text" value="' . htmlspecialchars($user) . '" name="username" /></td></tr>
<tr><td>Email</td><td><input type="text" value="' . htmlspecialchars($email) . '" name="email" /></td></tr>
<tr><td>Pass</td><td><input type="password" value="' . htmlspecialchars($pass) . '" name="password" /></td></tr>
<tr>
<td><input type="submit" name="action" value="Log in" /></td>
<td><input type="submit" name="action" value="Register" /></td>
</tr>
</table>
</form>';
}
function get_from_post_or_empty($index_name) {
return trim(
filter_input(INPUT_POST, $index_name, FILTER_UNSAFE_RAW, FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_LOW)
?: '');
}
// Login logic
function process_login($user, $pass, AuthMeController $controller) {
if ($controller->checkPassword($user, $pass)) {
printf('<h1>Hello, %s!</h1>', htmlspecialchars($user));
echo 'Successful login. Nice to have you back!'
. '<br /><a href="index.php">Back to form</a>';
return true;
} else {
echo '<h1>Error</h1> Invalid username or password.';
}
return false;
}
// Register logic
function process_register($user, $pass, $email, AuthMeController $controller) {
if ($controller->isUserRegistered($user)) {
echo '<h1>Error</h1> This user already exists.';
} else if (!is_email_valid($email)) {
echo '<h1>Error</h1> The supplied email is invalid.';
} else {
// Note that we don't validate the password or username at all in this demo...
$register_success = $controller->register($user, $pass, $email);
if ($register_success) {
printf('<h1>Welcome, %s!</h1>Thanks for registering', htmlspecialchars($user));
echo '<br /><a href="index.php">Back to form</a>';
return true;
} else {
echo '<h1>Error</h1>Unfortunately, there was an error during the registration.';
}
}
return false;
}
function is_email_valid($email) {
return trim($email) === ''
? true // accept no email
: filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
</body>
</html>
+28 -66
View File
@@ -2,6 +2,7 @@ package fr.xephi.authme;
import ch.jalu.injector.Injector;
import ch.jalu.injector.InjectorBuilder;
import com.alessiodp.libby.BukkitLibraryManager;
import com.github.Anon8281.universalScheduler.UniversalScheduler;
import com.github.Anon8281.universalScheduler.scheduling.schedulers.TaskScheduler;
import fr.xephi.authme.api.v3.AuthMeApi;
@@ -19,7 +20,6 @@ import fr.xephi.authme.listener.BedrockAutoLoginListener;
import fr.xephi.authme.listener.BlockListener;
import fr.xephi.authme.listener.DoubleLoginFixListener;
import fr.xephi.authme.listener.EntityListener;
import fr.xephi.authme.listener.GuiCaptchaHandler;
import fr.xephi.authme.listener.LoginLocationFixListener;
import fr.xephi.authme.listener.PlayerListener;
import fr.xephi.authme.listener.PlayerListener111;
@@ -35,6 +35,7 @@ import fr.xephi.authme.service.BackupService;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.MigrationService;
import fr.xephi.authme.service.bungeecord.BungeeReceiver;
import fr.xephi.authme.service.velocity.VelocityReceiver;
import fr.xephi.authme.service.yaml.YamlParseException;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.SettingsWarner;
@@ -42,6 +43,7 @@ import fr.xephi.authme.settings.properties.EmailSettings;
import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.task.CleanupTask;
import fr.xephi.authme.task.Updater;
import fr.xephi.authme.task.purge.PurgeService;
import fr.xephi.authme.util.ExceptionUtils;
import org.bukkit.Server;
@@ -53,15 +55,10 @@ import org.jetbrains.annotations.NotNull;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.logging.Level;
import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE;
import static fr.xephi.authme.util.Utils.isClassLoaded;
@@ -79,7 +76,7 @@ public class AuthMe extends JavaPlugin {
// Version and build number values
private static String pluginVersion = "5.6.0-Fork";
private static final String pluginBuild = "b";
private static String pluginBuildNumber = "45";
private static String pluginBuildNumber = "50";
// Private instances
private EmailService emailService;
private CommandHandler commandHandler;
@@ -142,6 +139,11 @@ public class AuthMe extends JavaPlugin {
return scheduler;
}
/**
* The library manager
*/
public static BukkitLibraryManager libraryManager;
/**
* Method called when the server enables the plugin.
*/
@@ -150,6 +152,7 @@ public class AuthMe extends JavaPlugin {
// Load the plugin version data from the plugin description file
loadPluginInfo(getDescription().getVersion());
scheduler = UniversalScheduler.getScheduler(this);
libraryManager = new BukkitLibraryManager(this);
// Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
@@ -210,14 +213,15 @@ public class AuthMe extends JavaPlugin {
}
//detect server brand with classloader
checkServerType();
Objects.requireNonNull(getCommand("register")).setTabCompleter(new TabCompleteHandler());
Objects.requireNonNull(getCommand("login")).setTabCompleter(new TabCompleteHandler());
try {
Objects.requireNonNull(getCommand("register")).setTabCompleter(new TabCompleteHandler());
Objects.requireNonNull(getCommand("login")).setTabCompleter(new TabCompleteHandler());
} catch (NullPointerException ignored) {
}
logger.info("AuthMeReReloaded is enabled successfully!");
// Purge on start if enabled
PurgeService purgeService = injector.getSingleton(PurgeService.class);
purgeService.runAutoPurge();
// 注册玩家加入事件监听
// register3rdPartyListeners();
logger.info("GitHub: https://github.com/HaHaWTH/AuthMeReReloaded/");
if (settings.getProperty(SecuritySettings.CHECK_FOR_UPDATES)) {
checkForUpdates();
@@ -225,8 +229,6 @@ public class AuthMe extends JavaPlugin {
}
//Migrated
/**
* Load the version and build number of the plugin from the description file.
*
@@ -300,6 +302,7 @@ public class AuthMe extends JavaPlugin {
// Trigger instantiation (class not used elsewhere)
injector.getSingleton(BungeeReceiver.class);
injector.getSingleton(VelocityReceiver.class);
// Trigger construction of API classes; they will keep track of the singleton
injector.getSingleton(AuthMeApi.class);
@@ -343,13 +346,6 @@ public class AuthMe extends JavaPlugin {
}
//Register 3rd party listeners
if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") != null) {
pluginManager.registerEvents(injector.getSingleton(GuiCaptchaHandler.class), this);
logger.info("(Beta)GUICaptcha is enabled successfully!");
logger.info("These features are still in early development, if you encountered any problem, please report.");
} else if (settings.getProperty(SecuritySettings.GUI_CAPTCHA) && getServer().getPluginManager().getPlugin("ProtocolLib") == null) {
logger.warning("ProtocolLib is not loaded, can't enable GUI Captcha.");
}
if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && getServer().getPluginManager().getPlugin("floodgate") != null) {
pluginManager.registerEvents(injector.getSingleton(BedrockAutoLoginListener.class), this);
} else if (settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && (!settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) || getServer().getPluginManager().getPlugin("floodgate") == null)) {
@@ -364,7 +360,7 @@ public class AuthMe extends JavaPlugin {
if (settings.getProperty(SecuritySettings.ADVANCED_SHULKER_FIX) && !isClassLoaded("org.bukkit.event.player.PlayerCommandSendEvent")) {
pluginManager.registerEvents(injector.getSingleton(AdvancedShulkerFixListener.class), this);
} else if (settings.getProperty(SecuritySettings.ADVANCED_SHULKER_FIX) && isClassLoaded("org.bukkit.event.player.PlayerCommandSendEvent")) {
logger.warning("You are running an 1.13+ minecraft server, advancedShulkerFix won't enable.");
logger.warning("You are running an 1.13+ minecraft server, AdvancedShulkerFix won't enable.");
}
if (settings.getProperty(SecuritySettings.PURGE_DATA_ON_QUIT)) {
pluginManager.registerEvents(injector.getSingleton(PurgeListener.class), this);
@@ -393,7 +389,7 @@ public class AuthMe extends JavaPlugin {
if (onShutdownPlayerSaver != null) {
onShutdownPlayerSaver.saveAllPlayers();
}
if (settings.getProperty(EmailSettings.SHUTDOWN_MAIL)){
if (settings != null && settings.getProperty(EmailSettings.SHUTDOWN_MAIL)) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'.'MM'.'dd'.' HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
emailService.sendShutDown(settings.getProperty(EmailSettings.SHUTDOWN_MAIL_ADDRESS),dateFormat.format(date));
@@ -413,59 +409,25 @@ public class AuthMe extends JavaPlugin {
ConsoleLogger.closeFileWriter();
}
private static final String owner = "HaHaWTH";
// private static final String owner_gitee = "Shixuehan114514";
private static final String repo = "AuthMeReReloaded";
private void checkForUpdates() {
logger.info("Checking for updates...");
Updater updater = new Updater(pluginBuild + pluginBuildNumber);
bukkitService.runTaskAsynchronously(() -> {
try {
// 从南通集线器获取最新版本号
URL url = new URL("https://api.github.com/repos/" + owner + "/" + repo + "/releases/latest");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000); // 设置连接超时为10秒
conn.setReadTimeout(10000); // 设置读取超时为10秒
Scanner scanner = new Scanner(conn.getInputStream());
String response = scanner.useDelimiter("\\Z").next();
scanner.close();
// 处理JSON响应
String latestVersion = response.substring(response.indexOf("tag_name") + 11);
latestVersion = latestVersion.substring(0, latestVersion.indexOf("\""));
if (isUpdateAvailable(latestVersion)) {
String message = "New version available! Latest:" + latestVersion + " Current:" + pluginBuild + pluginBuildNumber;
getLogger().log(Level.WARNING, message);
getLogger().log(Level.WARNING, "Download from here: https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest");
} else {
getLogger().log(Level.INFO, "You are running the latest version.");
}
} catch (IOException ignored) {
if (updater.isUpdateAvailable()) {
String message = "New version available! Latest:" + updater.getLatestVersion() + " Current:" + pluginBuild + pluginBuildNumber;
logger.warning(message);
logger.warning("Download from here: https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest");
} else {
logger.info("You are running the latest version.");
}
});
}
private boolean isUpdateAvailable(String latestVersion) {
// Extract the first character and the remaining digits from the version string
char latestChar = latestVersion.charAt(0);
int latestNumber = Integer.parseInt(latestVersion.substring(1));
char currentChar = pluginBuild.charAt(0);
int currentNumber = Integer.parseInt(pluginBuildNumber);
// Compare the characters first
if (latestChar > currentChar) {
return true;
} else if (latestChar < currentChar) {
return false;
} else {
// If the characters are the same, compare the numbers
return latestNumber > currentNumber;
}
}
private void checkServerType() {
if (isClassLoaded("com.destroystokyo.paper.PaperConfig")) {
if (isClassLoaded("io.papermc.paper.threadedregions.RegionizedServer")) {
logger.info("AuthMeReReloaded is running on Folia");
} else if (isClassLoaded("com.destroystokyo.paper.PaperConfig")) {
logger.info("AuthMeReReloaded is running on Paper");
} else if (isClassLoaded("catserver.server.CatServerConfig")) {
logger.info("AuthMeReReloaded is running on CatServer");
@@ -265,6 +265,16 @@ public class AuthMeApi {
management.forceLogin(player);
}
/**
* Force a player to login, i.e. the player is logged in without needing his password.
*
* @param player The player to log in
* @param quiet Whether to suppress the login message
*/
public void forceLogin(Player player, boolean quiet) {
management.forceLogin(player, quiet);
}
/**
* Force a player to logout.
*
@@ -7,13 +7,12 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.datasource.converter.Converter;
import fr.xephi.authme.datasource.converter.CrazyLoginConverter;
import fr.xephi.authme.datasource.converter.H2ToSqlite;
import fr.xephi.authme.datasource.converter.LoginSecurityConverter;
import fr.xephi.authme.datasource.converter.MySqlToSqlite;
import fr.xephi.authme.datasource.converter.RakamakConverter;
import fr.xephi.authme.datasource.converter.RoyalAuthConverter;
import fr.xephi.authme.datasource.converter.SqliteToH2;
import fr.xephi.authme.datasource.converter.SqliteToSql;
import fr.xephi.authme.datasource.converter.VAuthConverter;
import fr.xephi.authme.datasource.converter.XAuthConverter;
import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.output.ConsoleLoggerFactory;
@@ -85,12 +84,11 @@ public class ConverterCommand implements ExecutableCommand {
return ImmutableSortedMap.<String, Class<? extends Converter>>naturalOrder()
.put("xauth", XAuthConverter.class)
.put("crazylogin", CrazyLoginConverter.class)
.put("rakamak", RakamakConverter.class)
.put("royalauth", RoyalAuthConverter.class)
.put("vauth", VAuthConverter.class)
.put("sqlitetosql", SqliteToSql.class)
.put("mysqltosqlite", MySqlToSqlite.class)
.put("sqlitetoh2", SqliteToH2.class)
.put("h2tosqlite", H2ToSqlite.class)
.put("loginsecurity", LoginSecurityConverter.class)
.build();
}
@@ -1,9 +1,9 @@
package fr.xephi.authme.command.executable.authme;
import fr.xephi.authme.command.PlayerCommand;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.util.TeleportUtils;
import org.bukkit.entity.Player;
@@ -18,17 +18,17 @@ public class FirstSpawnCommand extends PlayerCommand {
private Settings settings;
@Inject
private SpawnLoader spawnLoader;
@Inject
private BukkitService bukkitService;
@Override
public void runCommand(Player player, List<String> arguments) {
if (spawnLoader.getFirstSpawn() == null) {
player.sendMessage("[AuthMe] First spawn has failed, please try to define the first spawn");
} else {
//String name= player.getName();
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
bukkitService.runTaskIfFolia(player, () -> {
TeleportUtils.teleport(player, spawnLoader.getFirstSpawn());
} else {
player.teleport(spawnLoader.getFirstSpawn());
}
});
//player.teleport(spawnLoader.getFirstSpawn());
}
}
@@ -1,7 +1,9 @@
package fr.xephi.authme.command.executable.authme;
import fr.xephi.authme.command.PlayerCommand;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.util.TeleportUtils;
import org.bukkit.entity.Player;
import javax.inject.Inject;
@@ -11,13 +13,15 @@ public class SpawnCommand extends PlayerCommand {
@Inject
private SpawnLoader spawnLoader;
@Inject
private BukkitService bukkitService;
@Override
public void runCommand(Player player, List<String> arguments) {
if (spawnLoader.getSpawn() == null) {
player.sendMessage("[AuthMe] Spawn has failed, please try to define the spawn");
} else {
player.teleport(spawnLoader.getSpawn());
bukkitService.runTaskIfFolia(player, () -> TeleportUtils.teleport(player, spawnLoader.getSpawn()));
}
}
}
@@ -15,6 +15,7 @@ import fr.xephi.authme.process.register.executors.PasswordRegisterParams;
import fr.xephi.authme.process.register.executors.RegistrationMethod;
import fr.xephi.authme.process.register.executors.TwoFactorRegisterParams;
import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.settings.properties.EmailSettings;
@@ -24,8 +25,6 @@ import org.bukkit.entity.Player;
import javax.inject.Inject;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import static fr.xephi.authme.process.register.RegisterSecondaryArgument.CONFIRMATION;
import static fr.xephi.authme.process.register.RegisterSecondaryArgument.EMAIL_MANDATORY;
@@ -46,6 +45,9 @@ public class RegisterCommand extends PlayerCommand {
@Inject
private CommonService commonService;
@Inject
private BukkitService bukkitService;
@Inject
private DataSource dataSource;
@@ -175,20 +177,15 @@ public class RegisterCommand extends PlayerCommand {
} else if (isSecondArgValidForEmailRegistration(player, arguments)) {
management.performRegister(RegistrationMethod.EMAIL_REGISTRATION,
EmailRegisterParams.of(player, email));
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if (commonService.getProperty(RegistrationSettings.UNREGISTER_ON_EMAIL_VERIFICATION_FAILURE) && commonService.getProperty(RegistrationSettings.UNREGISTER_AFTER_MINUTES) > 0) {
bukkitService.runTaskLater(player, () -> {
if (dataSource.getAuth(player.getName()) != null) {
if (dataSource.getAuth(player.getName()).getLastLogin() == null) {
management.performUnregisterByAdmin(null, player.getName(), player);
timer.cancel();
}
} else {
timer.cancel();
}
}
}, 600000);
}, 60 * 20 * commonService.getProperty(RegistrationSettings.UNREGISTER_AFTER_MINUTES));
}
}
}
@@ -9,18 +9,22 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.data.auth.PlayerAuth;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.settings.properties.DatabaseSettings;
import fr.xephi.authme.util.Utils;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -28,11 +32,10 @@ import java.util.stream.Collectors;
public class CacheDataSource implements DataSource {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(CacheDataSource.class);
private final DataSource source;
private final PlayerCache playerCache;
private final LoadingCache<String, Optional<PlayerAuth>> cachedAuths;
private final ListeningExecutorService executorService;
private ListeningExecutorService executorService;
/**
* Constructor for CacheDataSource.
@@ -43,13 +46,30 @@ public class CacheDataSource implements DataSource {
public CacheDataSource(DataSource source, PlayerCache playerCache) {
this.source = source;
this.playerCache = playerCache;
executorService = MoreExecutors.listeningDecorator(
Executors.newCachedThreadPool(new ThreadFactoryBuilder()
.setDaemon(true)
.setNameFormat("AuthMe-CacheLoader")
.build())
);
if (AuthMe.settings.getProperty(DatabaseSettings.USE_VIRTUAL_THREADS)) {
try {
Method method = Executors.class.getMethod("newVirtualThreadPerTaskExecutor");
method.setAccessible(true);
ExecutorService ex = (ExecutorService) method.invoke(null);
executorService = MoreExecutors.listeningDecorator(ex);
logger.info("Using virtual threads for cache loader");
} catch (Exception e) {
executorService = MoreExecutors.listeningDecorator(
Executors.newCachedThreadPool(new ThreadFactoryBuilder()
.setDaemon(true)
.setNameFormat("AuthMe-CacheLoader")
.build())
);
logger.info("Cannot enable virtual threads, fallback to CachedThreadPool");
}
} else {
executorService = MoreExecutors.listeningDecorator(
Executors.newCachedThreadPool(new ThreadFactoryBuilder()
.setDaemon(true)
.setNameFormat("AuthMe-CacheLoader")
.build())
);
}
cachedAuths = CacheBuilder.newBuilder()
.refreshAfterWrite(5, TimeUnit.MINUTES)
.expireAfterAccess(15, TimeUnit.MINUTES)
@@ -41,6 +41,7 @@ public class MySQL extends AbstractSqlDataSource {
private boolean useSsl;
private boolean serverCertificateVerification;
private boolean allowPublicKeyRetrieval;
private String mariaDbSslMode;
private String host;
private String port;
private String username;
@@ -121,6 +122,7 @@ public class MySQL extends AbstractSqlDataSource {
this.useSsl = settings.getProperty(DatabaseSettings.MYSQL_USE_SSL);
this.serverCertificateVerification = settings.getProperty(DatabaseSettings.MYSQL_CHECK_SERVER_CERTIFICATE);
this.allowPublicKeyRetrieval = settings.getProperty(DatabaseSettings.MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL);
this.mariaDbSslMode = settings.getProperty(DatabaseSettings.MARIADB_SSL_MODE);
}
/**
@@ -145,12 +147,19 @@ public class MySQL extends AbstractSqlDataSource {
ds.setDriverClassName(this.getDriverClassName());
// Request mysql over SSL
ds.addDataSourceProperty("useSSL", String.valueOf(useSsl));
if (this instanceof MariaDB) {
ds.addDataSourceProperty("sslMode", mariaDbSslMode);
} else {
ds.addDataSourceProperty("useSSL", String.valueOf(useSsl));
// Disabling server certificate verification on need
if (!serverCertificateVerification) {
ds.addDataSourceProperty("verifyServerCertificate", String.valueOf(false));
}
}
// Disabling server certificate verification on need
if (!serverCertificateVerification) {
ds.addDataSourceProperty("verifyServerCertificate", String.valueOf(false));
} // Disabling server certificate verification on need
if (allowPublicKeyRetrieval) {
ds.addDataSourceProperty("allowPublicKeyRetrieval", String.valueOf(true));
}
@@ -0,0 +1,33 @@
package fr.xephi.authme.datasource.converter;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.datasource.DataSourceType;
import fr.xephi.authme.datasource.H2;
import fr.xephi.authme.initialization.DataFolder;
import fr.xephi.authme.settings.Settings;
import javax.inject.Inject;
import java.io.File;
import java.sql.SQLException;
/**
* Converts H2 to SQLite.
*
*/
public class H2ToSqlite extends AbstractDataSourceConverter<H2>{
private final Settings settings;
private final File dataFolder;
@Inject
H2ToSqlite(Settings settings, DataSource dataSource, @DataFolder File dataFolder) {
super(dataSource, DataSourceType.SQLITE);
this.settings = settings;
this.dataFolder = dataFolder;
}
@Override
protected H2 getSource() throws SQLException {
return new H2(settings, dataFolder);
}
}
@@ -1,96 +0,0 @@
package fr.xephi.authme.datasource.converter;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.data.auth.PlayerAuth;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.initialization.DataFolder;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.ConverterSettings;
import fr.xephi.authme.util.Utils;
import org.bukkit.command.CommandSender;
import javax.inject.Inject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* @author Xephi59
*/
public class RakamakConverter implements Converter {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(RakamakConverter.class);
private final DataSource database;
private final Settings settings;
private final File pluginFolder;
private final PasswordSecurity passwordSecurity;
@Inject
RakamakConverter(@DataFolder File dataFolder, DataSource dataSource, Settings settings,
PasswordSecurity passwordSecurity) {
this.database = dataSource;
this.settings = settings;
this.pluginFolder = dataFolder;
this.passwordSecurity = passwordSecurity;
}
@Override
//TODO ljacqu 20151229: Restructure this into smaller portions
public void execute(CommandSender sender) {
boolean useIp = settings.getProperty(ConverterSettings.RAKAMAK_USE_IP);
String fileName = settings.getProperty(ConverterSettings.RAKAMAK_FILE_NAME);
String ipFileName = settings.getProperty(ConverterSettings.RAKAMAK_IP_FILE_NAME);
File source = new File(pluginFolder, fileName);
File ipFiles = new File(pluginFolder, ipFileName);
Map<String, String> playerIp = new HashMap<>();
Map<String, HashedPassword> playerPassword = new HashMap<>();
try {
BufferedReader ipFile = new BufferedReader(new FileReader(ipFiles));
String line;
if (useIp) {
String tempLine;
while ((tempLine = ipFile.readLine()) != null) {
if (tempLine.contains("=")) {
String[] args = tempLine.split("=");
playerIp.put(args[0], args[1]);
}
}
}
ipFile.close();
BufferedReader users = new BufferedReader(new FileReader(source));
while ((line = users.readLine()) != null) {
if (line.contains("=")) {
String[] arguments = line.split("=");
HashedPassword hashedPassword = passwordSecurity.computeHash(arguments[1], arguments[0]);
playerPassword.put(arguments[0], hashedPassword);
}
}
users.close();
for (Entry<String, HashedPassword> m : playerPassword.entrySet()) {
String playerName = m.getKey();
HashedPassword psw = playerPassword.get(playerName);
String ip = playerIp.get(playerName);
PlayerAuth auth = PlayerAuth.builder()
.name(playerName)
.realName(playerName)
.lastIp(ip)
.password(psw)
.build();
database.saveAuth(auth);
database.updateSession(auth);
}
Utils.logAndSendMessage(sender, "Rakamak database has been imported successfully");
} catch (IOException ex) {
logger.logException("Can't open the rakamak database file! Does it exist?", ex);
}
}
}
@@ -1,81 +0,0 @@
package fr.xephi.authme.datasource.converter;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.data.auth.PlayerAuth;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.initialization.DataFolder;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.Scanner;
import java.util.UUID;
import static fr.xephi.authme.util.FileUtils.makePath;
public class VAuthConverter implements Converter {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(VAuthConverter.class);
private final DataSource dataSource;
private final File vAuthPasswordsFile;
@Inject
VAuthConverter(@DataFolder File dataFolder, DataSource dataSource) {
vAuthPasswordsFile = new File(dataFolder.getParent(), makePath("vAuth", "passwords.yml"));
this.dataSource = dataSource;
}
@Override
public void execute(CommandSender sender) {
try (Scanner scanner = new Scanner(vAuthPasswordsFile)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String name = line.split(": ")[0];
String password = line.split(": ")[1];
PlayerAuth auth;
if (isUuidInstance(password)) {
String pname;
try {
pname = Bukkit.getOfflinePlayer(UUID.fromString(name)).getName();
} catch (Exception | NoSuchMethodError e) {
pname = getName(UUID.fromString(name));
}
if (pname == null) {
continue;
}
auth = PlayerAuth.builder()
.name(pname.toLowerCase(Locale.ROOT))
.realName(pname)
.password(password, null).build();
} else {
auth = PlayerAuth.builder()
.name(name.toLowerCase(Locale.ROOT))
.realName(name)
.password(password, null).build();
}
dataSource.saveAuth(auth);
}
} catch (IOException e) {
logger.logException("Error while trying to import some vAuth data", e);
}
}
private static boolean isUuidInstance(String s) {
return s.length() > 8 && s.charAt(8) == '-';
}
private String getName(UUID uuid) {
for (OfflinePlayer op : Bukkit.getOfflinePlayers()) {
if (op.getUniqueId().compareTo(uuid) == 0) {
return op.getName();
}
}
return null;
}
}
@@ -1,5 +1,6 @@
package fr.xephi.authme.initialization;
import com.alessiodp.libby.Library;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.datasource.CacheDataSource;
@@ -21,6 +22,8 @@ import javax.inject.Provider;
import java.io.File;
import java.sql.SQLException;
import static fr.xephi.authme.AuthMe.libraryManager;
/**
* Creates the AuthMe data source.
*/
@@ -78,6 +81,13 @@ public class DataSourceProvider implements Provider<DataSource> {
dataSource = new SQLite(settings, dataFolder);
break;
case H2:
Library h2 = Library.builder()
.groupId("com.h2database")
.artifactId("h2")
.version("2.2.224")
.build();
libraryManager.addMavenCentral();
libraryManager.loadLibrary(h2);
dataSource = new H2(settings, dataFolder);
break;
default:
@@ -39,14 +39,16 @@ public class BedrockAutoLoginListener implements Listener {
return settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && settings.getProperty(SecuritySettings.FORCE_LOGIN_BEDROCK) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid) && getServer().getPluginManager().getPlugin("floodgate") != null;
}
@EventHandler(priority = EventPriority.HIGHEST)
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
String name = event.getPlayer().getName();
UUID uuid = event.getPlayer().getUniqueId();
if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) {
authmeApi.forceLogin(player);
messages.send(player, MessageKey.BEDROCK_AUTO_LOGGED_IN);
}
bukkitService.runTaskLater(player, () -> {
if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) {
authmeApi.forceLogin(player, true);
messages.send(player, MessageKey.BEDROCK_AUTO_LOGGED_IN);
}
},20L);
}
}
@@ -1,263 +0,0 @@
package fr.xephi.authme.listener;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.api.v3.AuthMeApi;
import fr.xephi.authme.events.LoginEvent;
import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.message.Messages;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.settings.properties.SecuritySettings;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import javax.inject.Inject;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import static fr.xephi.authme.util.PlayerUtils.getPlayerIp;
import static fr.xephi.authme.util.PlayerUtils.isNpc;
import static org.bukkit.Bukkit.getLogger;
import static org.bukkit.Bukkit.getServer;
/**
* This class handles ALL the GUI captcha features in the plugin.
*/
public class GuiCaptchaHandler implements Listener {
//define AuthMeApi
private final AuthMeApi authmeApi = AuthMeApi.getInstance();
@Inject
private BukkitService bukkitService;
@Inject
private AuthMe plugin;
@Inject
private Messages messages;
@Inject
private CommonService service;
@Inject
private Settings settings;
private PacketAdapter chatPacketListener;
private PacketAdapter windowPacketListener;
//define timesLeft
private int timesLeft = 3;
//Use ConcurrentHashMap to store player and their close reason
/* We used many async tasks so there is concurrent**/
public static ConcurrentHashMap<Player, String> closeReasonMap = new ConcurrentHashMap<>();
//define randomStringSet
String randomSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz!@#%&*()_+";
String randomString = "";
Random randomItemSet = new Random();
Random howManyRandom = new Random();
private Material captchaMaterial = getRandomMaterial();
private boolean isPacketListenersActive = false;
public GuiCaptchaHandler() {
}
private StringBuilder sb;
private final List<String> whiteList = AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA_COUNTRY_WHITELIST);
private boolean isBedrockPlayer(UUID uuid) {
if (getServer().getPluginManager().getPlugin("floodgate") != null) {
return settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && settings.getProperty(SecuritySettings.GUI_CAPTCHA_BE_COMPATIBILITY) && org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(uuid);
}
return false;
}
private void initializePacketListeners() {
if (!isPacketListenersActive) {
ProtocolLibrary.getProtocolManager().addPacketListener(windowPacketListener);
ProtocolLibrary.getProtocolManager().addPacketListener(chatPacketListener);
isPacketListenersActive = true;
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player) {
Player player = (Player) event.getWhoClicked();
ItemStack currentItem = event.getCurrentItem();
if (!authmeApi.isRegistered(player.getName())) {
if (isBedrockPlayer(player.getUniqueId())) {
return;
}
if (currentItem != null && currentItem.getType().equals(captchaMaterial)) {
event.setCancelled(true);
if (!closeReasonMap.containsKey(player)) {
closeReasonMap.put(player, "verified");
}
player.closeInventory();
messages.send(player, MessageKey.GUI_CAPTCHA_VERIFIED);
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerLogin(PlayerLoginEvent event) {
Player player = event.getPlayer();
bukkitService.runTaskAsynchronously(() -> {
sb = new StringBuilder();
int howLongIsRandomString = (howManyRandom.nextInt(3) + 1);
for (int i = 0; i < howLongIsRandomString; i++) {
//生成随机索引号
int index = randomItemSet.nextInt(randomSet.length());
// 从字符串中获取由索引 index 指定的字符
char randomChar = randomSet.charAt(index);
// 将字符追加到字符串生成器
sb.append(randomChar);
}
if (!whiteList.isEmpty()) {
String ip = getPlayerIp(player);
if (whiteList.contains(authmeApi.getCountryCode(ip)) && ip != null) {
if (!closeReasonMap.containsKey(player)) {
closeReasonMap.put(player, "verified:whitelist");
}
}
}
});
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerJoin(PlayerJoinEvent event) {
randomString = "";
Player playerunreg = event.getPlayer();
String name = playerunreg.getName();
if (!authmeApi.isRegistered(name) && !isNpc(playerunreg) && !closeReasonMap.containsKey(playerunreg)) {
if (isBedrockPlayer(playerunreg.getUniqueId())) {
if (!closeReasonMap.containsKey(playerunreg)) {
closeReasonMap.put(playerunreg, "verified:bedrock");
}
messages.send(playerunreg, MessageKey.GUI_CAPTCHA_VERIFIED_AUTO_BEDROCK);
return;
}
randomString = sb.toString();
Random random_blockpos = new Random();
AtomicInteger random_num = new AtomicInteger(random_blockpos.nextInt(27));
Inventory menu = Bukkit.createInventory(playerunreg, 27, messages.retrieveSingle(playerunreg, MessageKey.GUI_CAPTCHA_WINDOW_NAME, randomString));
ItemStack item = new ItemStack(captchaMaterial);
ItemMeta meta = item.getItemMeta();
try {
if (meta != null) {
meta.setDisplayName(messages.retrieveSingle(playerunreg, MessageKey.GUI_CAPTCHA_CLICKABLE_NAME, randomString));
item.setItemMeta(meta);
}
} catch (NullPointerException e) {
getLogger().log(Level.WARNING, "Unexpected error occurred while setting item meta.");
}
windowPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CLOSE_WINDOW) {
@Override
public void onPacketReceiving(PacketEvent event) {
Player packetPlayer = event.getPlayer();
if (!closeReasonMap.containsKey(packetPlayer) && !authmeApi.isRegistered(packetPlayer.getName())) {
if (timesLeft <= 0) {
bukkitService.runTask(() -> {
packetPlayer.kickPlayer(service.retrieveSingleMessage(packetPlayer, MessageKey.GUI_CAPTCHA_KICK_FAILED));
});
timesLeft = 3;
} else {
--timesLeft;
if (timesLeft <= 0) {
bukkitService.runTask(() -> {
packetPlayer.kickPlayer(service.retrieveSingleMessage(packetPlayer, MessageKey.GUI_CAPTCHA_KICK_FAILED));
});
timesLeft = 3;
return;
}
messages.send(packetPlayer, MessageKey.GUI_CAPTCHA_RETRY_MESSAGE, String.valueOf(timesLeft));
event.setCancelled(true);
random_num.set(random_blockpos.nextInt(26));
bukkitService.runTask(() -> {
menu.clear();
menu.setItem(random_num.get(), item);
packetPlayer.openInventory(menu);
});
}
}
}
};
chatPacketListener = new PacketAdapter(this.plugin, ListenerPriority.HIGHEST, PacketType.Play.Client.CHAT) {
@Override
public void onPacketReceiving(PacketEvent event) {
Player packetPlayer = event.getPlayer();
if (!closeReasonMap.containsKey(packetPlayer) && !authmeApi.isRegistered(packetPlayer.getName())) {
messages.send(packetPlayer, MessageKey.GUI_CAPTCHA_DENIED_MESSAGE);
event.setCancelled(true);
}
}
};
initializePacketListeners();
//Open captcha inventory
menu.setItem(random_num.get(), item);
playerunreg.openInventory(menu);
if (settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > 0) {
long timeOut = settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT);
if (settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) > settings.getProperty(RestrictionSettings.TIMEOUT)) {
bukkitService.runTask(() -> {
getLogger().warning("AuthMe detected that your GUI captcha timeout seconds(" + settings.getProperty(SecuritySettings.GUI_CAPTCHA_TIMEOUT) + ") is bigger than the Login timeout seconds(" +
settings.getProperty(RestrictionSettings.TIMEOUT) + "). To prevent issues, we will let the GUI captcha follow the Login timeout seconds, please check and modify your config.");
});
timeOut = settings.getProperty(RestrictionSettings.TIMEOUT);
}
long finalTimeOut = timeOut;
bukkitService.runTaskLater(() -> {
if (!closeReasonMap.containsKey(playerunreg) && !authmeApi.isRegistered(playerunreg.getName())) {
playerunreg.kickPlayer(service.retrieveSingleMessage(playerunreg, MessageKey.GUI_CAPTCHA_KICK_TIMEOUT));
timesLeft = 3; // Reset the attempt counter
}
}, finalTimeOut * 20L);
}
}
}
//This prevents players from unregistering by Admins
@EventHandler
public void onPlayerAuthMeLogin(LoginEvent event) {
Player player = event.getPlayer();
if (!closeReasonMap.containsKey(player)) {
closeReasonMap.put(player, "verified:login");
}
}
private Material getRandomMaterial() {
Material[] allMaterials = Material.values();
Random random = new Random();
return allMaterials[random.nextInt(allMaterials.length)];
}
}
@@ -1,14 +1,11 @@
package fr.xephi.authme.listener;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.api.v3.AuthMeApi;
import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@@ -21,7 +18,6 @@ import javax.inject.Inject;
* Service class for the AuthMe listeners to determine whether an event should be canceled.
*/
class ListenerService implements SettingsDependent {
private final AuthMeApi authmeApi = AuthMeApi.getInstance();
private final DataSource dataSource;
private final PlayerCache playerCache;
private final ValidationService validationService;
@@ -84,14 +80,6 @@ class ListenerService implements SettingsDependent {
return player != null && !checkAuth(player.getName()) && !PlayerUtils.isNpc(player);
}
public boolean shouldCancelInvEvent(Player player) {
try {
return !AuthMe.settings.getProperty(SecuritySettings.GUI_CAPTCHA) || authmeApi.isRegistered(player.getName()) || GuiCaptchaHandler.closeReasonMap.containsKey(player)/* || !player.getOpenInventory().getTitle().equals("请验证你是真人")*/;
} catch (Exception e) {
return true;
}
}
@Override
public void reload(Settings settings) {
isRegistrationForced = settings.getProperty(RegistrationSettings.FORCE);
@@ -75,11 +75,7 @@ public class LoginLocationFixListener implements Listener {
boolean solved = false;
for (BlockFace face : faces) {
if (JoinBlock.getRelative(face).getType().equals(Material.AIR) && JoinBlock.getRelative(face).getRelative(BlockFace.UP).getType().equals(Material.AIR)) {
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
TeleportUtils.teleport(player, JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
} else {
player.teleport(JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
}
TeleportUtils.teleport(player, JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
solved = true;
break;
}
@@ -107,20 +103,12 @@ public class LoginLocationFixListener implements Listener {
if (JoinBlock.getRelative(BlockFace.DOWN).getType().equals(Material.LAVA)) {
JoinBlock.getRelative(BlockFace.DOWN).setType(Material.DIRT);
}
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 0.1, 0.5));
} else {
player.teleport(JoinBlock.getLocation().add(0.5, 0.1, 0.5));
}
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 0.1, 0.5));
messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND);
break;
}
if (i == MaxHeight) {
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 1.1, 0.5));
} else {
player.teleport(JoinBlock.getLocation().add(0.5, 1.1, 0.5));
}
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 1.1, 0.5));
messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND_CANT_FIX);
}
}
@@ -1,6 +1,5 @@
package fr.xephi.authme.listener;
import fr.xephi.authme.api.v3.AuthMeApi;
import fr.xephi.authme.data.QuickCommandsProtectionManager;
import fr.xephi.authme.data.auth.PlayerAuth;
import fr.xephi.authme.datasource.DataSource;
@@ -19,8 +18,8 @@ import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.util.TeleportUtils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.HumanEntity;
@@ -64,12 +63,7 @@ import static org.bukkit.Bukkit.getServer;
/**
* Listener class for player events.
*/
public class PlayerListener implements Listener{
private final AuthMeApi authmeApi = AuthMeApi.getInstance();
public class PlayerListener implements Listener {
@Inject
private Settings settings;
@Inject
@@ -119,7 +113,7 @@ public class PlayerListener implements Listener{
if (validationService.isUnrestricted(name)) {
return;
}
if (settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER)) {
if (settings.getProperty(HooksSettings.HOOK_FLOODGATE_PLAYER) && settings.getProperty(HooksSettings.IGNORE_BEDROCK_NAME_CHECK)) {
if (getServer().getPluginManager().getPlugin("floodgate") != null) {
if (org.geysermc.floodgate.api.FloodgateApi.getInstance().isFloodgateId(event.getUniqueId())) return;
}
@@ -193,7 +187,6 @@ public class PlayerListener implements Listener{
@EventHandler(priority = EventPriority.NORMAL)
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
final AuthMeApi authmeApi = AuthMeApi.getInstance();
if (!PlayerListener19Spigot.isPlayerSpawnLocationEventCalled()) {
teleportationService.teleportOnJoin(player);
}
@@ -220,7 +213,7 @@ public class PlayerListener implements Listener{
String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE);
if (!customJoinMessage.isEmpty()) {
customJoinMessage = ChatColor.translateAlternateColorCodes('&', customJoinMessage);
customJoinMessage = ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(customJoinMessage));
event.setJoinMessage(customJoinMessage
.replace("{PLAYERNAME}", player.getName())
.replace("{DISPLAYNAME}", player.getDisplayName())
@@ -375,17 +368,9 @@ public class PlayerListener implements Listener{
Location spawn = spawnLoader.getSpawnLocation(player);
if (spawn != null && spawn.getWorld() != null) {
if (!player.getWorld().equals(spawn.getWorld())) {
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
TeleportUtils.teleport(player,spawn);
} else {
player.teleport(spawn);
}
TeleportUtils.teleport(player,spawn);
} else if (spawn.distance(player.getLocation()) > settings.getProperty(ALLOWED_MOVEMENT_RADIUS)) {
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
TeleportUtils.teleport(player,spawn);
} else {
player.teleport(spawn);
}
TeleportUtils.teleport(player,spawn);
}
}
}
@@ -504,21 +489,33 @@ public class PlayerListener implements Listener{
}
}
@SuppressWarnings("all")
private boolean isInventoryWhitelisted(InventoryView inventory) {
if (inventory == null) {
return false;
}
Set<String> whitelist = settings.getProperty(RestrictionSettings.UNRESTRICTED_INVENTORIES);
if (whitelist.isEmpty()) {
return false;
}
//append a string for String whitelist
return whitelist.contains(ChatColor.stripColor(inventory.getTitle()).toLowerCase(Locale.ROOT));
String invName = ChatColor.stripColor(inventory.getTitle()).toLowerCase(Locale.ROOT);
if (settings.getProperty(RestrictionSettings.STRICT_UNRESTRICTED_INVENTORIES_CHECK)) {
return whitelist.contains(invName);
}
for (String wl : whitelist) {
if (invName.contains(wl)) {
return true;
}
}
return false;
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerInventoryOpen(InventoryOpenEvent event) {
final HumanEntity player = event.getPlayer();
Player ply = (Player) event.getPlayer();
if (listenerService.shouldCancelEvent(player)
&& !isInventoryWhitelisted(event.getView()) && listenerService.shouldCancelInvEvent(ply)) {
&& !isInventoryWhitelisted(event.getView())) {
event.setCancelled(true);
/*
@@ -52,11 +52,15 @@ public class PurgeListener implements Listener {
// 构建玩家数据文件路径
File playerDataFile = new File(playerDataFolder, File.separator + playerUUID + ".dat");
File playerDataOldFile = new File(playerDataFolder, File.separator + playerUUID + ".dat_old");
// 删除玩家数据文件
if (playerDataFile.exists()) {
playerDataFile.delete();
}
if (playerDataOldFile.exists()) {
playerDataOldFile.delete();
}
}
private void deleteAuthMePlayerData(UUID playerUUID) {
@@ -0,0 +1,36 @@
package fr.xephi.authme.listener.protocollib;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.util.message.I18NUtils;
import java.util.UUID;
class I18NGetLocalePacketAdapter extends PacketAdapter {
I18NGetLocalePacketAdapter(AuthMe plugin) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.SETTINGS);
}
@Override
public void onPacketReceiving(PacketEvent event) {
if (event.getPacketType() == PacketType.Play.Client.SETTINGS) {
String locale = event.getPacket().getStrings().read(0).toLowerCase();
UUID uuid = event.getPlayer().getUniqueId();
I18NUtils.addLocale(uuid, locale);
}
}
public void register() {
ProtocolLibrary.getProtocolManager().addPacketListener(this);
}
public void unregister() {
ProtocolLibrary.getProtocolManager().removePacketListener(this);
}
}
@@ -9,7 +9,9 @@ import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.util.Utils;
import org.bukkit.entity.Player;
import javax.inject.Inject;
@@ -22,10 +24,12 @@ public class ProtocolLibService implements SettingsDependent {
/* Packet Adapters */
private InventoryPacketAdapter inventoryPacketAdapter;
private TabCompletePacketAdapter tabCompletePacketAdapter;
private I18NGetLocalePacketAdapter i18nGetLocalePacketAdapter;
/* Settings */
private boolean protectInvBeforeLogin;
private boolean denyTabCompleteBeforeLogin;
private boolean i18nMessagesSending;
/* Service */
private boolean isEnabled;
@@ -58,6 +62,10 @@ public class ProtocolLibService implements SettingsDependent {
logger.warning("WARNING! The denyTabComplete feature requires ProtocolLib! Disabling it...");
}
if (i18nMessagesSending) {
logger.warning("WARNING! The i18n Messages feature requires ProtocolLib on lower version (< 1.15.2)! Disabling it...");
}
this.isEnabled = false;
return;
}
@@ -84,6 +92,16 @@ public class ProtocolLibService implements SettingsDependent {
tabCompletePacketAdapter = null;
}
if (i18nMessagesSending) {
if (i18nGetLocalePacketAdapter == null) {
i18nGetLocalePacketAdapter = new I18NGetLocalePacketAdapter(plugin);
i18nGetLocalePacketAdapter.register();
}
} else if (i18nGetLocalePacketAdapter != null) {
i18nGetLocalePacketAdapter.unregister();
i18nGetLocalePacketAdapter = null;
}
this.isEnabled = true;
}
@@ -101,6 +119,10 @@ public class ProtocolLibService implements SettingsDependent {
tabCompletePacketAdapter.unregister();
tabCompletePacketAdapter = null;
}
if (i18nGetLocalePacketAdapter != null) {
i18nGetLocalePacketAdapter.unregister();
i18nGetLocalePacketAdapter = null;
}
}
/**
@@ -120,6 +142,7 @@ public class ProtocolLibService implements SettingsDependent {
this.protectInvBeforeLogin = settings.getProperty(RestrictionSettings.PROTECT_INVENTORY_BEFORE_LOGIN);
this.denyTabCompleteBeforeLogin = settings.getProperty(RestrictionSettings.DENY_TABCOMPLETE_BEFORE_LOGIN);
this.i18nMessagesSending = settings.getProperty(PluginSettings.I18N_MESSAGES) && Utils.MAJOR_VERSION <= 15;
//it was true and will be deactivated now, so we need to restore the inventory for every player
if (oldProtectInventory && !protectInvBeforeLogin && inventoryPacketAdapter != null) {
@@ -158,7 +158,7 @@ public class EmailService {
try {
htmlEmail = sendMailSsl.initializeMail(email);
} catch (EmailException e) {
logger.logException("Failed to create email for recovery code:", e);
logger.logException("Failed to create email for shutdown:", e);
return;
}
@@ -8,12 +8,15 @@ import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.util.FileUtils;
import fr.xephi.authme.util.message.I18NUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static fr.xephi.authme.message.MessagePathHelper.DEFAULT_LANGUAGE;
@@ -33,6 +36,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
private String filename;
private FileConfiguration configuration;
private Map<String, FileConfiguration> i18nConfiguration;
private final String defaultFile;
protected AbstractMessageFileHandler() {
@@ -46,6 +50,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
filename = createFilePath(language);
File messagesFile = initializeFile(filename);
configuration = YamlConfiguration.loadConfiguration(messagesFile);
i18nConfiguration = null;
}
protected String getLanguage() {
@@ -83,6 +88,24 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
: message;
}
/**
* Returns the i18n message for the given key and given locale.
*
* @param key the key to retrieve the message for
* @param locale the locale that player client setting uses
* @return the message
*/
public String getMessageByLocale(String key, String locale) {
if (locale == null || !settings.getProperty(PluginSettings.I18N_MESSAGES)) {
return getMessage(key);
}
String message = getI18nConfiguration(locale).getString(key);
return message == null
? "Error retrieving message '" + key + "'"
: message;
}
/**
* Returns the message for the given key only if it exists,
* i.e. without falling back to the default file.
@@ -94,6 +117,27 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
return configuration.getString(key);
}
public FileConfiguration getI18nConfiguration(String locale) {
if (i18nConfiguration == null) {
i18nConfiguration = new ConcurrentHashMap<>();
}
locale = I18NUtils.localeToCode(locale, settings);
if (i18nConfiguration.containsKey(locale)) {
return i18nConfiguration.get(locale);
} else {
// Sync with reload();
String i18nFilename = createFilePath(locale);
File i18nMessagesFile = initializeFile(i18nFilename);
FileConfiguration config = YamlConfiguration.loadConfiguration(i18nMessagesFile);
i18nConfiguration.put(locale, config);
return config;
}
}
/**
* Creates the path to the messages file for the given language code.
*
@@ -29,46 +29,6 @@ public enum MessageKey {
*/
BEDROCK_AUTO_LOGGED_IN("bedrock_auto_login.success"),
/**
* %random Verification
*/
GUI_CAPTCHA_WINDOW_NAME("gui_captcha.captcha_window_name", "%random"),
/**
* %random I am human
*/
GUI_CAPTCHA_CLICKABLE_NAME("gui_captcha.captcha_clickable_name", "%random"),
/**
* Verification failed, you have %times retries left
*/
GUI_CAPTCHA_RETRY_MESSAGE("gui_captcha.message_on_retry", "%times"),
/**
* Bedrock verification success!
*/
GUI_CAPTCHA_VERIFIED_AUTO_BEDROCK("gui_captcha.bedrock_auto_verify_success"),
/**
* Please be verified before chatting!
*/
GUI_CAPTCHA_DENIED_MESSAGE("gui_captcha.denied_message_sending"),
/**
* Verification timed out!
*/
GUI_CAPTCHA_KICK_TIMEOUT("gui_captcha.kick_on_timeout"),
/**
* Please complete the verification!
*/
GUI_CAPTCHA_KICK_FAILED("gui_captcha.kick_on_failed"),
/**
* Verification success!
*/
GUI_CAPTCHA_VERIFIED("gui_captcha.success"),
/**
* In order to use this command you must be authenticated!
*/
@@ -5,6 +5,8 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.mail.EmailService;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.util.expiring.Duration;
import fr.xephi.authme.util.message.I18NUtils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -120,13 +122,16 @@ public class Messages {
* @return The message from the file
*/
private String retrieveMessage(MessageKey key, CommandSender sender) {
String message = messagesFileHandler.getMessage(key.getKey());
String locale = sender instanceof Player
? I18NUtils.getLocale((Player) sender)
: null;
String message = messagesFileHandler.getMessageByLocale(key.getKey(), locale);
String displayName = sender.getName();
if (sender instanceof Player) {
displayName = ((Player) sender).getDisplayName();
}
return ChatColor.translateAlternateColorCodes('&', message)
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message))
.replace(NEWLINE_TAG, "\n")
.replace(USERNAME_TAG, sender.getName())
.replace(DISPLAYNAME_TAG, displayName);
@@ -142,7 +147,7 @@ public class Messages {
private String retrieveMessage(MessageKey key, String name) {
String message = messagesFileHandler.getMessage(key.getKey());
return ChatColor.translateAlternateColorCodes('&', message)
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message))
.replace(NEWLINE_TAG, "\n")
.replace(USERNAME_TAG, name)
.replace(DISPLAYNAME_TAG, name);
@@ -149,7 +149,6 @@ public class MessageUpdater {
.put("verification", "Verification code")
.put("time", "Time units")
.put("two_factor", "Two-factor authentication")
.put("gui_captcha", "3rd party features: GUI Captcha")
.put("bedrock_auto_login", "3rd party features: Bedrock Auto Login")
.put("login_location_fix", "3rd party features: Login Location Fix")
.put("double_login_fix", "3rd party features: Double Login Fix")
@@ -171,7 +170,7 @@ public class MessageUpdater {
// Create ConfigurationData instance
Map<String, List<String>> commentsMap = comments.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> singletonList(e.getValue())));
.collect(Collectors.toMap(Map.Entry::getKey, e -> singletonList(e.getValue())));
return new MessageKeyConfigurationData(builder, commentsMap);
}
@@ -17,6 +17,9 @@ import fr.xephi.authme.service.SessionService;
import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.commandconfig.CommandManager;
import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
@@ -45,6 +48,9 @@ public class AsynchronousJoin implements AsynchronousProcess {
@Inject
private Server server;
@Inject
private Settings settings;
@Inject
private DataSource database;
@@ -75,6 +81,9 @@ public class AsynchronousJoin implements AsynchronousProcess {
@Inject
private BungeeSender bungeeSender;
@Inject
private VelocitySender velocitySender;
@Inject
private ProxySessionManager proxySessionManager;
@@ -128,6 +137,10 @@ public class AsynchronousJoin implements AsynchronousProcess {
// Session logic
if (sessionService.canResumeSession(player)) {
if (velocitySender.isEnabled()) {
bukkitService.scheduleSyncDelayedTask(() ->
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), service.getProperty(HooksSettings.PROXY_SEND_DELAY));
}
service.send(player, MessageKey.SESSION_RECONNECTION);
// Run commands
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(
@@ -152,7 +165,11 @@ public class AsynchronousJoin implements AsynchronousProcess {
// As described at https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/
// "Keep in mind that you can't send plugin messages directly after a player joins."
bukkitService.scheduleSyncDelayedTask(() ->
bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), 5L);
bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY));
}
if (velocitySender.isEnabled()) {
bukkitService.scheduleSyncDelayedTask(() ->
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY));
}
return;
}
@@ -26,6 +26,8 @@ import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.SessionService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.DatabaseSettings;
import fr.xephi.authme.settings.properties.EmailSettings;
import fr.xephi.authme.settings.properties.HooksSettings;
@@ -81,9 +83,12 @@ public class AsynchronousLogin implements AsynchronousProcess {
@Inject
private SessionService sessionService;
@Inject
private Settings settings;
@Inject
private BungeeSender bungeeSender;
@Inject
private VelocitySender velocitySender;
AsynchronousLogin() {
}
@@ -112,7 +117,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
*
* @param player the player to log in
*/
public void forceLogin(Player player) {
public synchronized void forceLogin(Player player) {
PlayerAuth auth = getPlayerAuth(player);
if (auth != null) {
performLogin(player, auth);
@@ -306,7 +311,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
// As described at https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/
// "Keep in mind that you can't send plugin messages directly after a player joins."
bukkitService.scheduleSyncDelayedTask(() ->
bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), 5L);
bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGIN), settings.getProperty(HooksSettings.PROXY_SEND_DELAY));
}
// As the scheduling executes the Task most likely after the current
@@ -14,7 +14,10 @@ import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.JoinMessageService;
import fr.xephi.authme.service.TeleportationService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.settings.commandconfig.CommandManager;
import fr.xephi.authme.settings.properties.HooksSettings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
@@ -30,6 +33,9 @@ public class ProcessSyncPlayerLogin implements SynchronousProcess {
@Inject
private BungeeSender bungeeSender;
@Inject
private VelocitySender velocitySender;
@Inject
private LimboService limboService;
@@ -102,6 +108,13 @@ public class ProcessSyncPlayerLogin implements SynchronousProcess {
player.removePotionEffect(PotionEffectType.BLINDNESS);
}
// AuthMeVelocity start - send on player login
if (velocitySender.isEnabled()) {
bukkitService.scheduleSyncDelayedTask(() ->
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGIN), commonService.getProperty(HooksSettings.PROXY_SEND_DELAY));
}
// AuthMeVelocity end
// The Login event now fires (as intended) after everything is processed
bukkitService.callEvent(new LoginEvent(player));
@@ -11,7 +11,8 @@ import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.SessionService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import org.bukkit.entity.Player;
import javax.inject.Inject;
@@ -42,6 +43,8 @@ public class AsynchronousLogout implements AsynchronousProcess {
@Inject
private BungeeSender bungeeSender;
@Inject
private VelocitySender velocitySender;
AsynchronousLogout() {
}
@@ -61,17 +64,18 @@ public class AsynchronousLogout implements AsynchronousProcess {
PlayerAuth auth = playerCache.getAuth(name);
database.updateSession(auth);
// TODO: send an update when a messaging service will be implemented (SESSION)
if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
auth.setQuitLocation(player.getLocation());
database.updateQuitLoc(auth);
//if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
auth.setQuitLocation(player.getLocation());
database.updateQuitLoc(auth);
// TODO: send an update when a messaging service will be implemented (QUITLOC)
}
//} AuthMeReReloaded - Always save quit location
playerCache.removePlayer(name);
codeManager.unverify(name);
database.setUnlogged(name);
sessionService.revokeSession(name);
bungeeSender.sendAuthMeBungeecordMessage(player, MessageType.LOGOUT);
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.LOGOUT);
syncProcessManager.processSyncPlayerLogout(player);
}
}
@@ -12,7 +12,6 @@ import fr.xephi.authme.service.SessionService;
import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -68,13 +67,16 @@ public class AsynchronousQuit implements AsynchronousProcess {
boolean wasLoggedIn = playerCache.isAuthenticated(name);
if (wasLoggedIn) {
if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
Location loc = spawnLoader.getPlayerLocationOrSpawn(player);
PlayerAuth auth = PlayerAuth.builder()
.name(name).location(loc)
.realName(player.getName()).build();
database.updateQuitLoc(auth);
}
//if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
// AuthMeReReloaded - Always save quit location on quit
Location loc = spawnLoader.getPlayerLocationOrSpawn(player);
PlayerAuth authLoc = PlayerAuth.builder()
.name(name).location(loc)
.realName(player.getName()).build();
database.updateQuitLoc(authLoc);
// AuthMeReReloaded - Fix AuthMe#2769 -1
//}
String ip = PlayerUtils.getPlayerIp(player);
PlayerAuth auth = PlayerAuth.builder()
@@ -1,5 +1,6 @@
package fr.xephi.authme.process.quit;
import com.github.Anon8281.universalScheduler.UniversalScheduler;
import fr.xephi.authme.data.limbo.LimboService;
import fr.xephi.authme.process.SynchronousProcess;
import fr.xephi.authme.settings.commandconfig.CommandManager;
@@ -27,7 +28,9 @@ public class ProcessSyncPlayerQuit implements SynchronousProcess {
commandManager.runCommandsOnLogout(player);
} else {
limboService.restoreData(player);
player.saveData(); // #1238: Speed is sometimes not restored properly
if (!UniversalScheduler.isFolia) { // AuthMeReReloaded - Fix #146 (Very stupid solution, but works)
player.saveData(); // #1238: Speed is sometimes not restored properly
}
}
player.leaveVehicle();
}
@@ -50,7 +50,7 @@ public class AsyncRegister implements AsynchronousProcess {
* @param parameters the parameters
* @param <P> parameters type
*/
public <P extends RegistrationParameters> void register(RegistrationMethod<P> variant, P parameters) {
public synchronized <P extends RegistrationParameters> void register(RegistrationMethod<P> variant, P parameters) {
if (preRegisterCheck(variant, parameters.getPlayer())) {
RegistrationExecutor<P> executor = registrationExecutorFactory.getSingleton(variant.getExecutorClass());
if (executor.isRegistrationAdmitted(parameters)) {
@@ -8,6 +8,8 @@ import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.process.SynchronousProcess;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.entity.Player;
@@ -28,6 +30,8 @@ public class ProcessSyncEmailRegister implements SynchronousProcess {
@Inject
private LimboService limboService;
@Inject
private VelocitySender velocitySender;
ProcessSyncEmailRegister() {
}
@@ -40,7 +44,7 @@ public class ProcessSyncEmailRegister implements SynchronousProcess {
public void processEmailRegister(Player player) {
service.send(player, MessageKey.ACCOUNT_NOT_ACTIVATED);
limboService.replaceTasksAfterRegistration(player);
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER);
bukkitService.callEvent(new RegisterEvent(player));
logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player));
}
@@ -9,6 +9,8 @@ import fr.xephi.authme.process.SynchronousProcess;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.settings.commandconfig.CommandManager;
import fr.xephi.authme.settings.properties.EmailSettings;
import fr.xephi.authme.settings.properties.RegistrationSettings;
@@ -27,6 +29,9 @@ public class ProcessSyncPasswordRegister implements SynchronousProcess {
@Inject
private BungeeSender bungeeSender;
@Inject
private VelocitySender velocitySender;
@Inject
private CommonService service;
@@ -66,7 +71,7 @@ public class ProcessSyncPasswordRegister implements SynchronousProcess {
if (!service.getProperty(EmailSettings.MAIL_ACCOUNT).isEmpty()) {
service.send(player, MessageKey.ADD_EMAIL_MESSAGE);
}
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.REGISTER);
bukkitService.callEvent(new RegisterEvent(player));
logger.fine(player.getName() + " registered " + PlayerUtils.getPlayerIp(player));
@@ -16,6 +16,8 @@ import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.TeleportationService;
import fr.xephi.authme.service.bungeecord.BungeeSender;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.service.velocity.VMessageType;
import fr.xephi.authme.service.velocity.VelocitySender;
import fr.xephi.authme.settings.commandconfig.CommandManager;
import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
@@ -56,6 +58,9 @@ public class AsynchronousUnregister implements AsynchronousProcess {
@Inject
private CommandManager commandManager;
@Inject
private VelocitySender velocitySender;
@Inject
private BungeeSender bungeeSender;
@@ -76,6 +81,7 @@ public class AsynchronousUnregister implements AsynchronousProcess {
if (dataSource.removeAuth(name)) {
performPostUnregisterActions(name, player);
logger.info(name + " unregistered himself");
velocitySender.sendAuthMeVelocityMessage(player, VMessageType.UNREGISTER);
bukkitService.createAndCallEvent(isAsync -> new UnregisterByPlayerEvent(player, isAsync));
} else {
service.send(player, MessageKey.ERROR);
@@ -97,8 +103,8 @@ public class AsynchronousUnregister implements AsynchronousProcess {
public void adminUnregister(CommandSender initiator, String name, Player player) {
if (dataSource.removeAuth(name)) {
performPostUnregisterActions(name, player);
if (player != null) velocitySender.sendAuthMeVelocityMessage(player, VMessageType.FORCE_UNREGISTER);
bukkitService.createAndCallEvent(isAsync -> new UnregisterByAdminEvent(player, name, isAsync, initiator));
if (initiator == null) {
logger.info(name + " was unregistered");
} else {
@@ -32,6 +32,7 @@ public enum HashAlgorithm {
WORDPRESS(fr.xephi.authme.security.crypts.Wordpress.class),
XAUTH(fr.xephi.authme.security.crypts.XAuth.class),
XFBCRYPT(fr.xephi.authme.security.crypts.XfBCrypt.class),
NOCRYPT(fr.xephi.authme.security.crypts.NoCrypt.class),
CUSTOM(null),
@Deprecated DOUBLEMD5(fr.xephi.authme.security.crypts.DoubleMd5.class),
@@ -0,0 +1,15 @@
package fr.xephi.authme.security.crypts;
import fr.xephi.authme.security.crypts.description.Recommendation;
import fr.xephi.authme.security.crypts.description.Usage;
@Deprecated
@Recommendation(Usage.DEPRECATED)
public class NoCrypt extends UnsaltedMethod {
@Override
public String computeHash(String password) {
return password;
}
}
@@ -1,12 +1,12 @@
package fr.xephi.authme.service;
import com.github.Anon8281.universalScheduler.UniversalRunnable;
import com.github.Anon8281.universalScheduler.UniversalScheduler;
import com.github.Anon8281.universalScheduler.scheduling.tasks.MyScheduledTask;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.util.Utils;
import org.bukkit.BanEntry;
import org.bukkit.BanList;
import org.bukkit.Bukkit;
@@ -38,7 +38,7 @@ public class BukkitService implements SettingsDependent {
/** Number of ticks per minute. */
public static final int TICKS_PER_MINUTE = 60 * TICKS_PER_SECOND;
/** Whether the server is running Folia. */
private static final boolean IS_FOLIA = Utils.isClassLoaded("io.papermc.paper.threadedregions.RegionizedServer");
private static final boolean isFolia = UniversalScheduler.isFolia;
private final AuthMe authMe;
private boolean useAsyncTasks;
@@ -68,7 +68,7 @@ public class BukkitService implements SettingsDependent {
* @param delay Delay in server ticks before executing task
*/
public void scheduleSyncDelayedTask(Runnable task, long delay) {
if (IS_FOLIA) {
if (isFolia) {
runTaskLater(task, delay);
} else {
Bukkit.getScheduler().runTaskLater(authMe, task, delay); // We must do this to keep compatibility
@@ -98,11 +98,19 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if task is null
*/
public void runTask(Runnable task) {
getScheduler().runTask(task);
if (isFolia) {
getScheduler().runTask(task);
} else {
Bukkit.getScheduler().runTask(authMe, task);
}
}
public void runTask(Entity entity, Runnable task) {
getScheduler().runTask(entity, task);
if (isFolia) {
getScheduler().runTask(entity, task);
} else {
Bukkit.getScheduler().runTask(authMe, task);
}
}
public void runTask(Location location, Runnable task) {
@@ -114,7 +122,7 @@ public class BukkitService implements SettingsDependent {
* @param task the task to be run
*/
public void runTaskIfFolia(Runnable task) {
if (IS_FOLIA) {
if (isFolia) {
runTask(task);
} else {
task.run();
@@ -126,7 +134,7 @@ public class BukkitService implements SettingsDependent {
* @param task the task to be run
*/
public void runTaskIfFolia(Entity entity, Runnable task) {
if (IS_FOLIA) {
if (isFolia) {
runTask(entity, task);
} else {
task.run();
@@ -138,7 +146,7 @@ public class BukkitService implements SettingsDependent {
* @param task the task to be run
*/
public void runTaskIfFolia(Location location, Runnable task) {
if (IS_FOLIA) {
if (isFolia) {
runTask(location, task);
} else {
task.run();
@@ -159,6 +167,10 @@ public class BukkitService implements SettingsDependent {
return getScheduler().runTaskLater(task, delay);
}
public MyScheduledTask runTaskLater(Entity entity, Runnable task, long delay) {
return getScheduler().runTaskLater(entity, task, delay);
}
/**
* Schedules this task to run asynchronously or immediately executes it based on
* AuthMe's configuration.
@@ -184,7 +196,7 @@ public class BukkitService implements SettingsDependent {
* @throws IllegalArgumentException if task is null
*/
public void runTaskAsynchronously(Runnable task) {
if (IS_FOLIA) {
if (isFolia) {
getScheduler().runTaskAsynchronously(task);
} else {
Bukkit.getScheduler().runTaskAsynchronously(authMe, task);
@@ -361,6 +373,17 @@ public class BukkitService implements SettingsDependent {
player.sendPluginMessage(authMe, "BungeeCord", bytes);
}
/**
* Send the specified bytes to bungeecord using the specified player connection.
*
* @param player the player
* @param bytes the message
*/
public void sendVelocityMessage(Player player, byte[] bytes) {
player.sendPluginMessage(authMe, "authmevelocity:main", bytes);
}
/**
* Adds a ban to the list. If a previous ban exists, this will
* update the previous entry.
@@ -14,7 +14,6 @@ import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.util.TeleportUtils;
import org.bukkit.Location;
import org.bukkit.World;
@@ -144,7 +143,9 @@ public class TeleportationService implements Reloadable {
} else if (settings.getProperty(TELEPORT_UNAUTHED_TO_SPAWN)) {
if (settings.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
Location location = buildLocationFromAuth(player, auth);
if (location.equals(player.getLocation())) return;
Location playerLoc = player.getLocation();
if (location.getX() == playerLoc.getX() && location.getY() == location.getY() && location.getZ() == playerLoc.getZ()
&& location.getWorld() == playerLoc.getWorld()) return;
logger.debug("Teleporting `{0}` after login, based on the player auth", player.getName());
teleportBackFromSpawn(player, location);
} else if (limbo != null && limbo.getLocation() != null) {
@@ -187,10 +188,8 @@ public class TeleportationService implements Reloadable {
private void performTeleportation(final Player player, final AbstractTeleportEvent event) {
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> {
bukkitService.callEvent(event);
if (player.isOnline() && isEventValid(event) && settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
if (player.isOnline() && isEventValid(event)) {
TeleportUtils.teleport(player, event.getTo());
} else if (player.isOnline() && isEventValid(event)) {
player.teleport(event.getTo());
}
});
}
@@ -272,10 +272,9 @@ public class ValidationService implements Reloadable {
}
return new HaveIBeenPwnedResults(false, 0);
} catch (java.io.IOException e) {
logger.warning("验证密码时出现错误,这可能是由于网络问题,如果无法解决,请关闭HaveIBeenPwned检查");
logger.warning("Error occurred while checking password online, check your connection.\nWhen this error shows, the player's password won't be check");
return null;
}
return null;
}
@@ -0,0 +1,5 @@
package fr.xephi.authme.service.velocity;
public enum VMessageType {
LOGIN, REGISTER, LOGOUT, FORCE_UNREGISTER, UNREGISTER
}
@@ -0,0 +1,89 @@
package fr.xephi.authme.service.velocity;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.data.ProxySessionManager;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.process.Management;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.HooksSettings;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.Messenger;
import org.bukkit.plugin.messaging.PluginMessageListener;
import javax.inject.Inject;
public class VelocityReceiver implements PluginMessageListener, SettingsDependent {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocityReceiver.class);
private final AuthMe plugin;
private final BukkitService bukkitService;
private final ProxySessionManager proxySessionManager;
private final Management management;
private boolean isEnabled;
@Inject
VelocityReceiver(AuthMe plugin, BukkitService bukkitService, ProxySessionManager proxySessionManager,
Management management, Settings settings) {
this.plugin = plugin;
this.bukkitService = bukkitService;
this.proxySessionManager = proxySessionManager;
this.management = management;
reload(settings);
}
@Override
public void reload(Settings settings) {
this.isEnabled = settings.getProperty(HooksSettings.VELOCITY);
if (this.isEnabled) {
final Messenger messenger = plugin.getServer().getMessenger();
if (!messenger.isIncomingChannelRegistered(plugin, "authmevelocity:main")) {
messenger.registerIncomingPluginChannel(plugin, "authmevelocity:main", this);
}
}
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] bytes) {
if (!isEnabled) {
return;
}
if (channel.equals("authmevelocity:main")) {
final ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
final String data = in.readUTF();
final String username = in.readUTF();
processData(username, data);
logger.debug("PluginMessage | AuthMeVelocity identifier processed");
}
}
private void processData(String username, String data) {
if (VMessageType.LOGIN.toString().equals(data)) {
performLogin(username);
}
}
private void performLogin(String name) {
Player player = bukkitService.getPlayerExact(name);
if (player != null && player.isOnline()) {
management.forceLogin(player, true);
logger.info("The user " + player.getName() + " has been automatically logged in, "
+ "as requested via plugin messaging.");
} else {
proxySessionManager.processProxySessionMessage(name);
logger.info("The user " + name + " should be automatically logged in, "
+ "as requested via plugin messaging but has not been detected, nickname has been"
+ " added to autologin queue.");
}
}
}
@@ -0,0 +1,76 @@
package fr.xephi.authme.service.velocity;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.initialization.SettingsDependent;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.bungeecord.MessageType;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.HooksSettings;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.Messenger;
import javax.inject.Inject;
public class VelocitySender implements SettingsDependent {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(VelocitySender.class);
private final AuthMe plugin;
private final BukkitService bukkitService;
private boolean isEnabled;
/*
* Constructor.
*/
@Inject
VelocitySender(AuthMe plugin, BukkitService bukkitService, Settings settings) {
this.plugin = plugin;
this.bukkitService = bukkitService;
reload(settings);
}
@Override
public void reload(Settings settings) {
this.isEnabled = settings.getProperty(HooksSettings.VELOCITY);
if (this.isEnabled) {
Messenger messenger = plugin.getServer().getMessenger();
if (!messenger.isOutgoingChannelRegistered(plugin, "authmevelocity:main")) {
messenger.registerOutgoingPluginChannel(plugin, "authmevelocity:main");
}
}
}
public boolean isEnabled() {
return isEnabled;
}
private void sendForwardedVelocityMessage(Player player, VMessageType type, String playerName) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF(type.toString());
out.writeUTF(playerName);
bukkitService.sendVelocityMessage(player, out.toByteArray());
}
/**
* Sends a message to the AuthMe plugin messaging channel, if enabled.
*
* @param player The player related to the message
* @param type The message type, See {@link MessageType}
*/
public void sendAuthMeVelocityMessage(Player player, VMessageType type) {
if (!isEnabled) {
return;
}
if (!plugin.isEnabled()) {
logger.debug("Tried to send a " + type + " velocity message but the plugin was disabled!");
return;
}
sendForwardedVelocityMessage(player, type, player.getName());
}
}
@@ -61,7 +61,7 @@ public class SettingsWarner {
// Warn if spigot.yml has settings.bungeecord set to true but config.yml has Hooks.bungeecord set to false
if (isTrue(bukkitService.isBungeeCordConfiguredForSpigot())
&& !settings.getProperty(HooksSettings.BUNGEECORD)) {
&& !settings.getProperty(HooksSettings.BUNGEECORD) && !settings.getProperty(HooksSettings.VELOCITY)) {
logger.warning("Note: Hooks.bungeecord is set to false but your server appears to be running in"
+ " bungeecord mode (see your spigot.yml). In order to allow the datasource caching and the"
+ " AuthMeBungee add-on to work properly you have to enable this option!");
@@ -8,19 +8,6 @@ import ch.jalu.configme.properties.Property;
import static ch.jalu.configme.properties.PropertyInitializer.newProperty;
public final class ConverterSettings implements SettingsHolder {
@Comment("Rakamak file name")
public static final Property<String> RAKAMAK_FILE_NAME =
newProperty("Converter.Rakamak.fileName", "users.rak");
@Comment("Rakamak use IP?")
public static final Property<Boolean> RAKAMAK_USE_IP =
newProperty("Converter.Rakamak.useIP", false);
@Comment("Rakamak IP file name")
public static final Property<String> RAKAMAK_IP_FILE_NAME =
newProperty("Converter.Rakamak.ipFileName", "UsersIp.rak");
@Comment("CrazyLogin database file name")
public static final Property<String> CRAZYLOGIN_FILE_NAME =
newProperty("Converter.CrazyLogin.fileName", "accounts.db");
@@ -19,6 +19,10 @@ public final class DatabaseSettings implements SettingsHolder {
public static final Property<Boolean> USE_CACHING =
newProperty("DataSource.caching", true);
@Comment("Should we try to use VirtualThreads(Java 21+) for database cache loader?")
public static final Property<Boolean> USE_VIRTUAL_THREADS =
newProperty("DataSource.useVirtualThreadsCache", false);
@Comment("Database host address")
public static final Property<String> MYSQL_HOST =
newProperty("DataSource.mySQLHost", "127.0.0.1");
@@ -27,7 +31,17 @@ public final class DatabaseSettings implements SettingsHolder {
public static final Property<String> MYSQL_PORT =
newProperty("DataSource.mySQLPort", "3306");
@Comment("Connect to MySQL database over SSL")
@Comment({"Replacement of Mysql's useSsl (for MariaDB only).",
"- disable: No SSL",
"- trust: Trust blindly (no validation)",
"- verify_ca: Encryption, certificates validation, BUT no hostname verification",
"- verify_full: Encryption, certificate validation and hostname validation",
"Read more: https://bit.ly/mariadb-sslmode"})
public static final Property<String> MARIADB_SSL_MODE =
newProperty("DataSource.MariaDbSslMode", "disabled");
@Comment({"Connect to MySQL database over SSL",
"If you're using MariaDB, use sslMode instead"})
public static final Property<Boolean> MYSQL_USE_SSL =
newProperty("DataSource.mySQLUseSSL", true);
@@ -35,12 +49,13 @@ public final class DatabaseSettings implements SettingsHolder {
"We would not recommend to set this option to false.",
"Set this option to false at your own risk if and only if you know what you're doing"})
public static final Property<Boolean> MYSQL_CHECK_SERVER_CERTIFICATE =
newProperty( "DataSource.mySQLCheckServerCertificate", true );
newProperty( "DataSource.mySQLCheckServerCertificate", true);
@Comment({"Authorize client to retrieve RSA server public key.",
"Advanced option, ignore if you don't know what it means."})
"Advanced option, ignore if you don't know what it means.",
"If you are using MariaDB, use MariaDbSslMode instead."})
public static final Property<Boolean> MYSQL_ALLOW_PUBLIC_KEY_RETRIEVAL =
newProperty( "DataSource.mySQLAllowPublicKeyRetrieval", true );
newProperty( "DataSource.mySQLAllowPublicKeyRetrieval", true);
@Comment("Username to connect to the MySQL database")
public static final Property<String> MYSQL_USERNAME =
@@ -18,13 +18,26 @@ public final class HooksSettings implements SettingsHolder {
@Comment("Do we need to hook with BungeeCord?")
public static final Property<Boolean> BUNGEECORD =
newProperty("Hooks.bungeecord", false);
@Comment("Do we need to hook with Velocity?")
public static final Property<Boolean> VELOCITY =
newProperty("Hooks.velocity", false);
@Comment({"Allow FloodGatePlayer Join Without checkIsValidName()",
@Comment({"How many ticks should we wait before sending login info to proxy?",
"Change this to higher if your player has high ping.",
"See: https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/"})
public static final Property<Long> PROXY_SEND_DELAY =
newProperty("Hooks.proxySendDelay", 10L);
@Comment({"Hook into floodgate.",
"This must be true if you want to use other bedrock features."
})
public static final Property<Boolean> HOOK_FLOODGATE_PLAYER =
newProperty("Hooks.floodgate", false);
@Comment("Allow bedrock players join without check isValidName?")
public static final Property<Boolean> IGNORE_BEDROCK_NAME_CHECK =
newProperty("Hooks.ignoreBedrockNameCheck", true);
@Comment("Send player to this BungeeCord server after register/login")
public static final Property<String> BUNGEECORD_SERVER =
@@ -5,6 +5,9 @@ import ch.jalu.configme.SettingsHolder;
import ch.jalu.configme.properties.Property;
import fr.xephi.authme.output.LogLevel;
import java.util.Set;
import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseStringSetProperty;
import static ch.jalu.configme.properties.PropertyInitializer.newProperty;
public final class PluginSettings implements SettingsHolder {
@@ -16,6 +19,26 @@ public final class PluginSettings implements SettingsHolder {
public static final Property<Boolean> MENU_UNREGISTER_COMPATIBILITY =
newProperty("3rdPartyFeature.compatibility.menuPlugins", false);
@Comment({
"Send i18n messages to player based on their client settings, this option will override `settings.messagesLanguage`",
"(Requires Protocollib or Packetevents)",
"This will not affect language of AuthMe help command."
})
public static final Property<Boolean> I18N_MESSAGES =
newProperty("3rdPartyFeature.features.i18nMessages.enabled", false);
@Comment({"Redirect locale code to certain AuthMe language code as you want",
"Minecraft locale list: https://minecraft.wiki/w/Language",
"AuthMe language code: https://github.com/HaHaWTH/AuthMeReReloaded/blob/master/docs/translations.md",
"For example, if you want to show Russian messages to player using language Tatar(tt_ru),",
"and show Chinese Simplified messages to player using language Classical Chinese(lzh), then:",
"locale-code-redirect:",
"- 'tt_ru:ru'",
"- 'lzh:zhcn'"})
public static final Property<Set<String>> I18N_CODE_REDIRECT =
newLowercaseStringSetProperty("3rdPartyFeature.features.i18nMessages.locale-code-redirect",
"tt_ru:ru", "lzh:zhcn");
@Comment({
"Do you want to enable the session feature?",
"If enabled, when a player authenticates successfully,",
@@ -36,7 +59,8 @@ public final class PluginSettings implements SettingsHolder {
@Comment({
"Message language, available languages:",
"https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/translations.md"
"https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/translations.md",
"Example: zhcn, en"
})
public static final Property<String> MESSAGES_LANGUAGE =
newProperty("settings.messagesLanguage", "en");
@@ -58,7 +58,7 @@ public final class ProtectionSettings implements SettingsHolder {
@Comment("Kicks the player that issued a command before the defined time after the join process")
public static final Property<Integer> QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS =
newProperty("Protection.quickCommands.denyCommandsBeforeMilliseconds", 3000);
newProperty("Protection.quickCommands.denyCommandsBeforeMilliseconds", 1000);
private ProtectionSettings() {
}
@@ -46,6 +46,16 @@ public final class RegistrationSettings implements SettingsHolder {
newProperty(RegisterSecondaryArgument.class, "settings.registration.secondArg",
RegisterSecondaryArgument.CONFIRMATION);
@Comment({
"Should we unregister the player when he didn't verify the email?",
"This only works if you enabled email registration."})
public static final Property<Boolean> UNREGISTER_ON_EMAIL_VERIFICATION_FAILURE =
newProperty("settings.registration.email.unregisterOnEmailVerificationFailure", false);
@Comment({"How many minutes should we wait before unregister the player",
"when he didn't verify the email?"})
public static final Property<Long> UNREGISTER_AFTER_MINUTES =
newProperty("settings.registration.email.unregisterAfterMinutes", 10L);
@Comment({
"Do we force kick a player after a successful registration?",
"Do not use with login feature below"})
@@ -173,7 +173,7 @@ public final class RestrictionSettings implements SettingsHolder {
@Comment("Regex syntax for allowed chars in email.")
public static final Property<String> ALLOWED_EMAIL_REGEX =
newProperty("settings.restrictions.allowedEmailCharacters", "^[A-Za-z0-9_]{4,15}@(qq|outlook|163|gmail|icloud)\\.com$");
newProperty("settings.restrictions.allowedEmailCharacters", "^[A-Za-z0-9_.]{3,20}@(qq|outlook|163|gmail|icloud)\\.com$");
@Comment("Force survival gamemode when player joins?")
@@ -205,6 +205,10 @@ public final class RestrictionSettings implements SettingsHolder {
public static final Property<Set<String>> UNRESTRICTED_INVENTORIES =
newLowercaseStringSetProperty("settings.unrestrictions.UnrestrictedInventories");
@Comment("Should we check unrestricted inventories strictly? (Original behavior)")
public static final Property<Boolean> STRICT_UNRESTRICTED_INVENTORIES_CHECK =
newProperty("settings.unrestrictions.StrictUnrestrictedInventoriesCheck", true);
private RestrictionSettings() {
@@ -6,10 +6,8 @@ import ch.jalu.configme.properties.Property;
import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.settings.EnumSetProperty;
import java.util.List;
import java.util.Set;
import static ch.jalu.configme.properties.PropertyInitializer.newListProperty;
import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseStringSetProperty;
import static ch.jalu.configme.properties.PropertyInitializer.newProperty;
@@ -21,11 +19,6 @@ public final class SecuritySettings implements SettingsHolder {
public static final Property<Boolean> STOP_SERVER_ON_PROBLEM =
newProperty("Security.SQLProblem.stopServer", false);
@Comment({"Should send GUI captcha by country code whitelist?",
"If the country of the player is in this list, the captcha won't be sent."})
public static final Property<List<String>> GUI_CAPTCHA_COUNTRY_WHITELIST =
newListProperty("3rdPartyFeature.features.captcha.whiteList");
@Comment({"Should we let Bedrock players login automatically?",
"(Requires hookFloodgate to be true & floodgate loaded)",
"(**THIS IS SAFE DO NOT WORRY**)"})
@@ -48,25 +41,6 @@ public final class SecuritySettings implements SettingsHolder {
public static final Property<Boolean> ADVANCED_SHULKER_FIX =
newProperty("3rdPartyFeature.fixes.advancedShulkerFix", false);
@Comment({"Choose the best teleport method by server brand?",
"(Enable this if you are using Paper)"})
public static final Property<Boolean> SMART_ASYNC_TELEPORT =
newProperty("3rdPartyFeature.optimizes.smartAsyncTeleport", true);
@Comment("Send a GUI captcha to unregistered players?(Requires ProtocolLib)")
public static final Property<Boolean> GUI_CAPTCHA =
newProperty("3rdPartyFeature.features.captcha.guiCaptcha", false);
@Comment({"Should we kick the players when they don't finish the GUI captcha in seconds?",
"(less than or equals 0 is disabled)"})
public static final Property<Integer> GUI_CAPTCHA_TIMEOUT =
newProperty("3rdPartyFeature.features.captcha.timeOut", 0);
@Comment({"Should we ignore floodgate players when sending GUI captcha?",
"(Requires floodgate and hookFloodgate: true)"})
public static final Property<Boolean> GUI_CAPTCHA_BE_COMPATIBILITY =
newProperty("3rdPartyFeature.features.captcha.ignoreBedrock", false);
@Comment("Should we fix the location when players logged in the portal?")
public static final Property<Boolean> LOGIN_LOC_FIX_SUB_PORTAL =
newProperty("3rdPartyFeature.fixes.loginLocationFix.fixPortalStuck", false);
@@ -127,7 +101,7 @@ public final class SecuritySettings implements SettingsHolder {
@Comment({
"Possible values: SHA256, BCRYPT, BCRYPT2Y, PBKDF2, SALTEDSHA512,",
"MYBB, IPB3, PHPBB, PHPFUSION, SMF, XENFORO, XAUTH, JOOMLA, WBB3, WBB4, MD5VB,",
"PBKDF2DJANGO, WORDPRESS, ROYALAUTH, ARGON2, CUSTOM (for developers only). See full list at",
"PBKDF2DJANGO, WORDPRESS, ROYALAUTH, ARGON2, NOCRYPT, CUSTOM (for developers only). See full list at",
"https://github.com/AuthMe/AuthMeReloaded/blob/master/docs/hash_algorithms.md",
"If you use ARGON2, check that you have the argon2 c library on your system"
})
@@ -0,0 +1,67 @@
package fr.xephi.authme.task;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.Scanner;
public class Updater {
private final String currentVersion;
private String latestVersion;
private static boolean isUpdateAvailable = false;
private static final String owner = "HaHaWTH";
private static final String repo = "AuthMeReReloaded";
private static final String UPDATE_URL = "https://api.github.com/repos/" + owner + "/" + repo + "/releases/latest";
public Updater(String currentVersion) {
this.currentVersion = currentVersion;
}
/**
* Check if there is an update available
* Note: This method will perform a network request!
*
* @return true if there is an update available, false otherwise
*/
public boolean isUpdateAvailable() {
URI uri = URI.create(UPDATE_URL);
try {
URL url = uri.toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
conn.setReadTimeout(10000);
Scanner scanner = new Scanner(conn.getInputStream());
String response = scanner.useDelimiter("\\Z").next();
scanner.close();
String latestVersion = response.substring(response.indexOf("tag_name") + 11);
latestVersion = latestVersion.substring(0, latestVersion.indexOf("\""));
this.latestVersion = latestVersion;
isUpdateAvailable = !currentVersion.equals(latestVersion);
return isUpdateAvailable;
} catch (IOException ignored) {
this.latestVersion = null;
isUpdateAvailable = false;
return false;
}
}
public String getLatestVersion() {
return latestVersion;
}
public String getCurrentVersion() {
return currentVersion;
}
/**
* Returns true if there is an update available, false otherwise
* Must be called after {@link Updater#isUpdateAvailable()}
*
* @return A boolean indicating whether there is an update available
*/
public static boolean hasUpdate() {
return isUpdateAvailable;
}
}
@@ -10,6 +10,7 @@ public final class PlayerUtils {
// Utility class
private PlayerUtils() {
}
private static final boolean isLeavesServer = Utils.isClassLoaded("top.leavesmc.leaves.LeavesConfig") || Utils.isClassLoaded("org.leavesmc.leaves.LeavesConfig");
/**
* Returns the IP of the given player.
@@ -28,7 +29,11 @@ public final class PlayerUtils {
* @return True if the player is an NPC, false otherwise
*/
public static boolean isNpc(Player player) {
return player.hasMetadata("NPC") || player.getAddress() == null;
if (isLeavesServer) {
return player.hasMetadata("NPC") || player.getAddress() == null;
} else {
return player.hasMetadata("NPC");
}
}
}
@@ -3,24 +3,24 @@ package fr.xephi.authme.util;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.concurrent.CompletableFuture;
/**
* This class is a utility class for handling async teleportation of players in game.
*/
public class TeleportUtils {
private static Method teleportAsyncMethod;
private static MethodHandle teleportAsyncMethodHandle;
static {
try {//Detect Paper class
Class<?> paperClass = Class.forName("com.destroystokyo.paper.PaperConfig");
teleportAsyncMethod = Player.class.getMethod("teleportAsync", Location.class);
teleportAsyncMethod.setAccessible(true);
// if detected,use teleportAsync()
} catch (ClassNotFoundException | NoSuchMethodException e) {
teleportAsyncMethod = null;
//if not, set method to null
try {
MethodHandles.Lookup lookup = MethodHandles.lookup();
teleportAsyncMethodHandle = lookup.findVirtual(Player.class, "teleportAsync", MethodType.methodType(CompletableFuture.class, Location.class));
} catch (NoSuchMethodException | IllegalAccessException e) {
teleportAsyncMethodHandle = null;
// if not, set method handle to null
}
}
@@ -31,10 +31,10 @@ public class TeleportUtils {
* @param location Where should the player be teleported
*/
public static void teleport(Player player, Location location) {
if (teleportAsyncMethod != null) {
if (teleportAsyncMethodHandle != null) {
try {
teleportAsyncMethod.invoke(player, location);
} catch (IllegalAccessException | InvocationTargetException e) {
teleportAsyncMethodHandle.invoke(player, location);
} catch (Throwable throwable) {
player.teleport(location);
}
} else {
@@ -2,6 +2,7 @@ package fr.xephi.authme.util;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
@@ -107,4 +108,12 @@ public final class Utils {
public static boolean isEmailEmpty(String email) {
return StringUtils.isBlank(email) || "your@email.com".equalsIgnoreCase(email);
}
private final static String[] serverVersion = Bukkit.getServer().getBukkitVersion()
.substring(0, Bukkit.getServer().getBukkitVersion().indexOf("-"))
.split("\\.");
private final static int FIRST_VERSION = Integer.parseInt(serverVersion[0]);
public final static int MAJOR_VERSION = Integer.parseInt(serverVersion[1]);
public final static int MINOR_VERSION = serverVersion.length == 3 ? Integer.parseInt(serverVersion[2]) : 0;
}
@@ -0,0 +1,98 @@
package fr.xephi.authme.util.message;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.util.Utils;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class I18NUtils {
private static Map<UUID, String> PLAYER_LOCALE = new ConcurrentHashMap<>();
private static final Map<String, String> LOCALE_MAP = new HashMap<>();
private static final List<String> LOCALE_LIST = Arrays.asList(
"en", "bg", "de", "eo", "es", "et", "eu", "fi", "fr", "gl", "hu", "id", "it", "ja", "ko", "lt", "nl", "pl",
"pt", "ro", "ru", "sk", "sr", "tr", "uk"
);
static {
LOCALE_MAP.put("pt_br", "br");
LOCALE_MAP.put("cs_cz", "cz");
LOCALE_MAP.put("nds_de", "de");
LOCALE_MAP.put("sxu", "de");
LOCALE_MAP.put("swg", "de");
LOCALE_MAP.put("rpr", "ru");
LOCALE_MAP.put("sl_si", "si");
LOCALE_MAP.put("vi_vn", "vn");
LOCALE_MAP.put("lzh", "zhcn");
LOCALE_MAP.put("zh_cn", "zhcn");
LOCALE_MAP.put("zh_hk", "zhhk");
LOCALE_MAP.put("zh_tw", "zhtw");
//LOCALE_MAP.put("zhmc", "zhmc");
}
/**
* Returns the locale that player uses.
*
* @param player The player
*/
public static String getLocale(Player player) {
if (Utils.MAJOR_VERSION > 15) {
return player.getLocale().toLowerCase();
} else if (PLAYER_LOCALE.containsKey(player.getUniqueId())) {
return PLAYER_LOCALE.get(player.getUniqueId());
}
return null;
}
public static void addLocale(UUID uuid, String locale) {
if (PLAYER_LOCALE == null) {
PLAYER_LOCALE = new ConcurrentHashMap<>();
}
PLAYER_LOCALE.put(uuid, locale);
}
/**
* Returns the AuthMe messages file language code, by given locale and settings.
* Dreeam - Hard mapping, based on mc1.20.6, 5/29/2024
*
* @param locale The locale that player client setting uses.
* @param settings The AuthMe settings, for default/fallback language usage.
*/
public static String localeToCode(String locale, Settings settings) {
// Certain locale code to AuthMe language code redirect
if (!settings.getProperty(PluginSettings.I18N_CODE_REDIRECT).isEmpty()) {
for (String raw : settings.getProperty(PluginSettings.I18N_CODE_REDIRECT)) {
String[] split = raw.split(":");
if (split.length == 2 && locale.equalsIgnoreCase(split[0])) {
return split[1];
}
}
}
// Match certain locale code
if (LOCALE_MAP.containsKey(locale)) {
return LOCALE_MAP.get(locale);
}
if (locale.contains("_")) {
locale = locale.substring(0, locale.indexOf("_"));
}
// Match locale code with "_"
if (LOCALE_LIST.contains(locale)) {
return locale;
}
return settings.getProperty(PluginSettings.MESSAGES_LANGUAGE);
}
}
@@ -0,0 +1,36 @@
package fr.xephi.authme.util.message;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.md_5.bungee.api.chat.BaseComponent;
public class MiniMessageUtils {
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
/**
* Parse a MiniMessage string into a legacy string.
*
* @param message The message to parse.
* @return The parsed message.
*/
public static String parseMiniMessageToLegacy(String message) {
Component component = miniMessage.deserialize(message);
return LegacyComponentSerializer.legacyAmpersand().serialize(component);
}
/**
* Parse a MiniMessage string into a BaseComponent.
*
* @param message The message to parse.
* @return The parsed message.
*/
public static BaseComponent[] parseMiniMessageToBaseComponent(String message) {
Component component = miniMessage.deserialize(message);
return BungeeComponentSerializer.legacy().serialize(component);
}
private MiniMessageUtils() {
}
}
Binary file not shown.
+18 -2
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cПотребителското име е заетo!'
register_request: '&3Моля регистрирайте се с: /register парола парола.'
command_usage: '&cКоманда: /register парола парола'
reg_only: '&4Само регистрирани потребители могат да влизат в сървъра! Моля посетете http://example.com, за да се регистрирате!'
reg_only: '&4Само регистрирани потребители могат да влизат в сървъра! Моля посетете https://example.com, за да се регистрирате!'
success: '&2Успешна регистрация!'
kicked_admin_registered: 'Вие бяхте регистриран от администратора, моля да влезете отново!'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cИзбраната парола не е безопасна, моля изберете друга парола.'
forbidden_characters: '&4Паролата съдържа непозволени символи. Позволени символи: %valid_chars'
wrong_length: '&cПаролата е твърде къса или прекалено дълга! Моля опитайте с друга парола.'
pwned_password: '&cИзбраната парола не е сигурна. Тя е използвана %pwned_count пъти вече! Моля, използвайте силна парола...'
# Login
login:
@@ -40,7 +41,7 @@ error:
max_registration: '&cВие сте достигнали максималният брой регистрации (%reg_count/%max_acc %reg_names)!'
logged_in: '&cВече сте влезли!'
kick_for_vip: '&3VIP потребител влезе докато сървъра беше пълен, вие бяхте изгонен!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cВъзникна грешка: неразрешено име на играч!'
tempban_max_logins: '&cВие бяхте баннат временно, понеже сте си сгрешили паролата прекалено много пъти.'
# AntiBot
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cВашият акаунт все още не е актириван, моля провете своят email адрес!'
not_activated: '&cАкаунтът не е активиран, моля регистрирайте се и го активирайте преди да опитате отново.'
password_changed: '&2Паротала е променена успешно!'
logout: '&2Излязохте успешно!'
reload: '&2Конфигурацията и база данните бяха презаредени правилно!'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Защитата със секретен код не е включена за Вашият акаунт. Моля изпълнете команда /2fa add'
removed_success: 'Успешно изключихте защитата със секретен код от Вашият акаунт!'
invalid_code: 'Невалиден код!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aУспешно автоматично влизане за Bedrock!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aЗаседнали сте в портал по време на влизане.'
fix_underground: '&aЗаседнали сте под земята по време на влизане.'
cannot_fix_underground: '&aЗаседнали сте под земята по време на влизане, но не можем да го поправим.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cБяхте изключени поради двойно влизане.'
+43 -27
View File
@@ -8,13 +8,13 @@
# Registro
registration:
disabled: '&cRegistrar-se está desativado neste servidor!'
name_taken: '&cVocê já registrou este nome de usuário!'
register_request: '&3Por favor, registre-se com o comando "/register <senha> <senha>"'
command_usage: '&cUse: /register <senha> <senha>'
reg_only: '&4Somente usuários registrados podem entrar no servidor! Por favor visite www.seusite.com para se registrar!'
success: '&2Registrado com sucesso!'
kicked_admin_registered: 'Um administrador registrou você. Por favor, faça login novamente'
disabled: '&cRegistrar-se está desativado neste servidor!'
name_taken: '&cVocê já registrou este nome de usuário!'
# Erros de senha ao registrar-se
password:
@@ -23,6 +23,7 @@ password:
unsafe_password: '&cA senha escolhida não é segura. Por favor, escolha outra senha...'
forbidden_characters: '&Sua senha contém caracteres inválidos. Caracteres permitidos: %valid_chars'
wrong_length: '&cSua senha é muito curta ou muito longa! Por favor, escolha outra senha...'
pwned_password: '&cSua senha escolhida não é segura. Ela foi usada %pwned_count vezes já! Por favor, use uma senha forte...'
# Login
login:
@@ -34,17 +35,17 @@ login:
# Erros
error:
unregistered_user: '&cEste usuário não está registrado!'
denied_command: '&cPara utilizar este comando é necessário estar logado!'
denied_chat: '&cPara utilizar o chat é necessário estar logado!'
unregistered_user: '&cEste usuário não está registrado!'
not_logged_in: '&cVocê não está logado!'
tempban_max_logins: '&cVocê foi temporariamente banido por tentar fazer login muitas vezes.'
max_registration: '&cVocê excedeu o número máximo de registros (%reg_count/%max_acc %reg_names) para o seu IP!'
no_permission: '&4Você não tem permissão para executar esta ação!'
unexpected_error: '&4Ocorreu um erro inesperado. Por favor contate um administrador!'
kick_for_vip: '&3Um jogador VIP juntou-se ao servidor enquanto ele estava cheio!'
max_registration: '&cVocê excedeu o número máximo de registros (%reg_count/%max_acc %reg_names) para o seu IP!'
logged_in: '&cVocê já está logado!'
kick_for_vip: '&3Um jogador VIP juntou-se ao servidor enquanto ele estava cheio!'
kick_unresolved_hostname: '&cErro: hostname do jogador não resolvido!'
tempban_max_logins: '&cVocê foi temporariamente banido por tentar fazer login muitas vezes.'
# AntiBot
antibot:
@@ -59,13 +60,14 @@ unregister:
# Outras mensagens
misc:
accounts_owned_self: 'Você tem %count contas:'
accounts_owned_other: 'O jogador %name tem %count contas:'
account_not_activated: '&cA sua conta ainda não está ativada. Por favor, verifique seus e-mails!'
not_activated: '&cConta não ativada, por favor registre e ative antes de tentar novamente.'
password_changed: '&2Senha alterada com sucesso!'
logout: '&2Desconectado com sucesso!'
reload: '&2A configuração e o banco de dados foram recarregados corretamente!'
usage_change_password: '&cUse: /changepassword <senhaVelha> <senhaNova>'
accounts_owned_self: 'Você tem %count contas:'
accounts_owned_other: 'O jogador %name tem %count contas:'
# Mensagens de sessão
session:
@@ -74,36 +76,36 @@ session:
# Mensagens de erro ao entrar
on_join_validation:
same_ip_online: 'Um jogador com o mesmo IP já está no servidor!'
same_nick_online: '&4Alguém com o mesmo nome de usuário já está jogando no servidor!'
name_length: '&4Seu nome de usuário ou é muito curto ou é muito longo!'
characters_in_name: '&4Seu nome de usuário contém caracteres inválidos. Caracteres permitidos: %valid_chars'
kick_full_server: '&4O servidor está cheio, tente novamente mais tarde!'
country_banned: '&4O seu país está banido deste servidor!'
not_owner_error: 'Você não é o proprietário da conta. Por favor, escolha outro nome!'
kick_full_server: '&4O servidor está cheio, tente novamente mais tarde!'
same_nick_online: '&4Alguém com o mesmo nome de usuário já está jogando no servidor!'
invalid_name_case: 'Você deve entrar usando o nome de usuário %valid, não %invalid.'
same_ip_online: 'Um jogador com o mesmo IP já está no servidor!'
quick_command: 'Você usou o comando muito rápido! Por favor, entre no servidor e aguarde antes de usar um comando novamente.'
# E-mail
email:
add_email_request: '&3Por favor, adicione seu e-mail para a sua conta com o comando "/email add <seuEmail> <seuEmail>"'
usage_email_add: '&cUse: /email add <email> <email>'
usage_email_change: '&cUse: /email change <emailAntigo> <novoEmail>'
new_email_invalid: '&cE-mail novo inválido, tente novamente!'
old_email_invalid: '&cE-mail antigo inválido, tente novamente!'
invalid: '&E-mail inválido, tente novamente!'
added: '&2E-mail adicionado com sucesso!'
add_not_allowed: '&cAdicionar um e-mail não é permitido.'
request_confirmation: '&cPor favor, confirme o seu endereço de e-mail!'
changed: '&2E-mail alterado com sucesso!'
change_not_allowed: '&cAlterar o e-mail não é permitido.'
email_show: '&2O seu endereço de e-mail atual é: &f%email'
incomplete_settings: 'Erro: Nem todas as configurações necessárias estão definidas para o envio de e-mails. Entre em contato com um administrador.'
already_used: '&4O endereço de e-mail já está sendo usado'
send_failure: '&cO e-mail não pôde ser enviado, reporte isso a um administrador!'
no_email_for_account: '&2Você atualmente não têm endereço de e-mail associado a esta conta.'
add_email_request: '&3Por favor, adicione seu e-mail para a sua conta com o comando "/email add <seuEmail> <seuEmail>"'
already_used: '&4O endereço de e-mail já está sendo usado'
incomplete_settings: 'Erro: Nem todas as configurações necessárias estão definidas para o envio de e-mails. Entre em contato com um administrador.'
send_failure: '&cO e-mail não pôde ser enviado, reporte isso a um administrador!'
change_password_expired: 'Você não pode mais usar esse comando de recuperação de senha!'
email_cooldown_error: '&cUm e-mail já foi enviado, espere %time antes de enviar novamente!'
add_not_allowed: '&cAdicionar um e-mail não é permitido.'
change_not_allowed: '&cAlterar o e-mail não é permitido.'
# Recuperação de senha por e-mail
recovery:
@@ -135,6 +137,17 @@ verification:
code_expired: '&3O seu código expirou! Execute outro comando sensível para gerar um outro código.'
email_needed: '&3Para verificar sua identidade, você precisa vincular um e-mail à sua conta!'
# Unidades de tempo
time:
second: 'segundo'
seconds: 'segundos'
minute: 'minuto'
minutes: 'minutos'
hour: 'hora'
hours: 'horas'
day: 'dia'
days: 'dias'
# Verificação em duas etapas
two_factor:
code_created: '&2O seu código secreto é %code. Você pode verificá-lo aqui %url'
@@ -148,13 +161,16 @@ two_factor:
removed_success: 'Verificação em duas etapas desativada com sucesso!'
invalid_code: 'Código inválido!'
# Unidades de tempo
time:
second: 'segundo'
seconds: 'segundos'
minute: 'minuto'
minutes: 'minutos'
hour: 'hora'
hours: 'horas'
day: 'dia'
days: 'dias'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aLogin automático Bedrock bem-sucedido!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aVocê está preso no portal durante o login.'
fix_underground: '&aVocê está preso no subsolo durante o login.'
cannot_fix_underground: '&aVocê está preso no subsolo durante o login, mas não podemos corrigir.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cVocê foi desconectado devido a login duplo.'
+17 -1
View File
@@ -19,7 +19,8 @@ password:
name_in_password: '&cNemůžeš použít své jméno jako heslo, prosím, zvol si jiné heslo...'
unsafe_password: '&cToto heslo není bezpečné, prosím, zvol si jiné heslo...'
forbidden_characters: '&4Tvoje heslo obsahuje nepovolené znaky. Přípustné znaky jsou: %valid_chars'
wrong_length: '&cTvoje heslo nedosahuje minimální délky (4).'
wrong_length: '&cTvoje heslo nedosahuje minimální délky.'
pwned_password: '&cZvolené heslo není bezpečné. Bylo použito již %pwned_count krát! Prosím, použijte silné heslo...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cTvůj účet ještě není aktivovaný, zkontroluj svůj E-mail.'
not_activated: '&cÚčet není aktivován, prosím zaregistrujte se a aktivujte ho před dalším pokusem.'
password_changed: '&cHeslo změněno!'
logout: '&cÚspěšně jsi se odhlásil.'
reload: '&cZnovu načtení nastavení AuthMe proběhlo úspěšně.'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Dvoufaktorové ověření není zapnuté na tvém účtu. Můžeš ho zapnout použitím příkazu /2fa add'
removed_success: 'Dvoufaktorovka byla úspěšně odebrána z tvého účtu'
invalid_code: 'Nesprávný kód!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aAutomatické přihlášení Bedrock úspěšné!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aPři přihlášení jste uvízli v portálu.'
fix_underground: '&aPři přihlášení jste uvízli pod zemí.'
cannot_fix_underground: '&aPři přihlášení jste uvízli pod zemí, ale nemůžeme to opravit.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cByli jste odpojeni kvůli dvojímu přihlášení.'
+18 -2
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cDieser Benutzername ist schon vergeben'
register_request: '&3Bitte registriere dich mit "/register <passwort> <passwortBestätigen>"'
command_usage: '&cBenutze: /register <passwort> <passwortBestätigen>'
reg_only: '&4Nur für registrierte Spieler! Bitte besuche http://example.com um dich zu registrieren.'
reg_only: '&4Nur für registrierte Spieler! Bitte besuche https://example.com um dich zu registrieren.'
success: '&2Erfolgreich registriert!'
kicked_admin_registered: 'Ein Administrator hat dich bereits registriert; bitte logge dich erneut ein.'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cPasswort unsicher! Bitte wähle ein anderes.'
forbidden_characters: '&4Dein Passwort enthält unerlaubte Zeichen. Zulässige Zeichen: %valid_chars'
wrong_length: '&cDein Passwort ist zu kurz oder zu lang!'
pwned_password: '&cIhr gewähltes Passwort ist nicht sicher. Es wurde bereits %pwned_count Mal verwendet! Bitte verwenden Sie ein starkes Passwort...'
# Login
login:
@@ -40,7 +41,7 @@ error:
max_registration: '&cDu hast die maximale Anzahl an Accounts erreicht (%reg_count/%max_acc %reg_names).'
logged_in: '&cBereits eingeloggt!'
kick_for_vip: '&3Ein VIP-Spieler hat den vollen Server betreten!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cEin Fehler ist aufgetreten: nicht auflösbarer Spieler-Hostname!'
tempban_max_logins: '&cDu bist wegen zu vielen fehlgeschlagenen Login-Versuchen temporär gebannt!'
# AntiBot
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cDein Account wurde noch nicht aktiviert. Bitte prüfe deine E-Mails!'
not_activated: '&cKonto nicht aktiviert, bitte registrieren und aktivieren Sie es, bevor Sie es erneut versuchen.'
password_changed: '&2Passwort geändert!'
logout: '&2Erfolgreich ausgeloggt'
reload: '&2Konfiguration und Datenbank wurden erfolgreich neu geladen.'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Die Zwei-Faktor-Authentifizierung ist für dein Konto nicht aktiviert. Benutze /2fa add'
removed_success: 'Die Zwei-Faktor-Authentifizierung wurde erfolgreich von deinem Konto entfernt'
invalid_code: 'Ungültiger Code!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock Auto-Login erfolgreich!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aSie stecken während des Logins im Portal fest.'
fix_underground: '&aSie stecken während des Logins unter der Erde fest.'
cannot_fix_underground: '&aSie stecken während des Logins unter der Erde fest, aber wir können es nicht beheben.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cSie wurden wegen doppeltem Login getrennt.'
+36 -45
View File
@@ -5,13 +5,13 @@
# Registration
registration:
register_request: '&3Please, register to the server with the command: /register <password> <ConfirmPassword>'
command_usage: '&cUsage: /register <password> <ConfirmPassword>'
reg_only: '&4Only registered users can join the server! Please visit http://example.com to register yourself!'
kicked_admin_registered: 'An admin just registered you; please log in again.'
success: '&2Successfully registered!'
disabled: '&cIn-game registration is disabled!'
name_taken: '&cYou already have registered this username!'
register_request: '&3Please, register to the server with the command: /register <password> <ConfirmPassword>'
command_usage: '&cUsage: /register <password> <ConfirmPassword>'
reg_only: '&4Only registered users can join the server! Please visit https://example.com to register yourself!'
success: '&2Successfully registered!'
kicked_admin_registered: 'An admin just registered you; please log in again.'
# Password errors on registration
password:
@@ -32,17 +32,17 @@ login:
# Errors
error:
unregistered_user: '&cThis user isn''t registered!'
denied_command: '&cIn order to use this command you must be authenticated!'
denied_chat: '&cIn order to chat you must be authenticated!'
unregistered_user: '&cThis user isn''t registered!'
not_logged_in: '&cYou''re not logged in!'
tempban_max_logins: '&cYou have been temporarily banned for failing to log in too many times.'
max_registration: '&cYou have exceeded the maximum number of registrations (%reg_count/%max_acc %reg_names) for your connection!'
no_permission: '&4You don''t have the permission to perform this action!'
unexpected_error: '&4An unexpected error occurred, please contact an administrator!'
kick_for_vip: '&3A VIP player has joined the server when it was full!'
max_registration: '&cYou have exceeded the maximum number of registrations (%reg_count/%max_acc %reg_names) for your connection!'
logged_in: '&cYou''re already logged in!'
kick_for_vip: '&3A VIP player has joined the server when it was full!'
kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
tempban_max_logins: '&cYou have been temporarily banned for failing to log in too many times.'
# AntiBot
antibot:
@@ -50,19 +50,21 @@ antibot:
auto_enabled: '&4[AntiBotService] AntiBot enabled due to the huge number of connections!'
auto_disabled: '&2[AntiBotService] AntiBot disabled after %m minutes!'
# Unregister
unregister:
success: '&cSuccessfully unregistered!'
command_usage: '&cUsage: /unregister <password>'
# Other messages
misc:
accounts_owned_self: 'You own %count accounts:'
accounts_owned_other: 'The player %name has %count accounts:'
account_not_activated: '&cYour account isn''t activated yet, please check your emails!'
not_activated: '&cAccount not activated, please register and activate it before trying again.'
password_changed: '&2Password changed successfully!'
logout: '&2Logged out successfully!'
reload: '&2Configuration and database have been reloaded correctly!'
usage_change_password: '&cUsage: /changepassword <oldPassword> <newPassword>'
accounts_owned_self: 'You own %count accounts:'
accounts_owned_other: 'The player %name has %count accounts:'
# Session messages
session:
@@ -71,36 +73,36 @@ session:
# Error messages when joining
on_join_validation:
same_ip_online: 'A player with the same IP is already in game!'
same_nick_online: '&4The same username is already playing on the server!'
name_length: '&4Your username is either too short or too long!'
characters_in_name: '&4Your username contains illegal characters. Allowed chars: %valid_chars'
kick_full_server: '&4The server is full, try again later!'
country_banned: '&4Your country is banned from this server!'
not_owner_error: 'You are not the owner of this account. Please choose another name!'
kick_full_server: '&4The server is full, try again later!'
same_nick_online: '&4The same username is already playing on the server!'
invalid_name_case: 'You should join using username %valid, not %invalid.'
same_ip_online: 'A player with the same IP is already in game!'
quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.'
# Email
email:
add_email_request: '&3Please add your email to your account with the command: /email add <yourEmail> <confirmEmail>'
usage_email_add: '&cUsage: /email add <email> <confirmEmail>'
usage_email_change: '&cUsage: /email change <oldEmail> <newEmail>'
new_email_invalid: '&cInvalid new email, try again!'
old_email_invalid: '&cInvalid old email, try again!'
invalid: '&cInvalid email address, try again!'
added: '&2Email address successfully added to your account!'
add_not_allowed: '&cAdding email was not allowed.'
request_confirmation: '&cPlease confirm your email address!'
changed: '&2Email address changed correctly!'
change_not_allowed: '&cChanging email was not allowed.'
email_show: '&2Your current email address is: &f%email'
incomplete_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.'
already_used: '&4The email address is already being used'
send_failure: 'The email could not be sent. Please contact an administrator.'
no_email_for_account: '&2You currently don''t have email address associated with this account.'
add_email_request: '&3Please add your email to your account with the command: /email add <yourEmail> <confirmEmail>'
already_used: '&4The email address is already being used'
incomplete_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.'
send_failure: 'The email could not be sent. Please contact an administrator.'
change_password_expired: 'You cannot change your password using this command anymore.'
email_cooldown_error: '&cAn email was already sent recently. You must wait %time before you can send a new one.'
add_not_allowed: '&cAdding email was not allowed.'
change_not_allowed: '&cChanging email was not allowed.'
# Password recovery by email
recovery:
@@ -132,6 +134,17 @@ verification:
code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
email_needed: '&3To verify your identity you need to link an email address with your account!!'
# Time units
time:
second: 'second'
seconds: 'seconds'
minute: 'minute'
minutes: 'minutes'
hour: 'hour'
hours: 'hours'
day: 'day'
days: 'days'
# Two-factor authentication
two_factor:
code_created: '&2Your secret code is %code. You can scan it from here %url'
@@ -145,37 +158,15 @@ two_factor:
removed_success: 'Successfully removed two-factor auth from your account'
invalid_code: 'Invalid code!'
# Time units
time:
second: 'second'
seconds: 'seconds'
minute: 'minute'
minutes: 'minutes'
hour: 'hour'
hours: 'hours'
day: 'day'
days: 'days'
# 3rd party features: GUI Captcha
gui_captcha:
success: '&aVerification success!'
bedrock_auto_verify_success: '&aBedrock verification success!'
captcha_window_name: '%random Verification'
captcha_clickable_name: '%random I am human'
message_on_retry: '&cVerification failed, you have %times retries left'
denied_message_sending: '&cPlease be verified before chatting!'
kick_on_failed: '&cPlease complete the verification!'
kick_on_timeout: '&cVerification timed out!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock auto login success!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aYou are stuck in portal during Login.'
fix_underground: '&aYou are stuck underground during Login.'
cannot_fix_underground: '&aYou are stuck underground during Login, but we cant fix it.'
fix_portal: '&aYou are stuck in portal during login.'
fix_underground: '&aYou are stuck underground during login.'
cannot_fix_underground: '&aYou are stuck underground during login, but we cant fix it.'
# 3rd party features: Double Login Fix
double_login_fix:
+39 -23
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cVi jam registris tiun uzantnomon!'
register_request: '&3Bonvolu registri al la servilo per la komando: /register <pasvorto> <konfirmiPasvorto>'
command_usage: '&cUzado: /register <pasvorto> <konfirmiPasvorto>'
reg_only: '&4Nur registritaj uzantoj povas aliĝi la servilon! Bonvolu viziti http://example.com registri vin mem!'
reg_only: '&4Nur registritaj uzantoj povas aliĝi la servilon! Bonvolu viziti https://example.com registri vin mem!'
success: '&2Sukcese registris!'
kicked_admin_registered: 'Administranto ĵus registrita vin; bonvolu ensaluti denove'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cLa elektita pasvorto estas danĝere, bonvolu elekti alian...'
forbidden_characters: '&4Via pasvorto enhavas kontraŭleĝan karakteroj. Permesita signoj: %valid_chars'
wrong_length: '&cVia pasvorto estas tro mallonga aŭ tro longa! Bonvolu provi alian pasvorton!'
pwned_password: '&cVia elektita pasvorto ne estas sekura. Ĝi estis uzita %pwned_count fojojn jam! Bonvolu uzi fortan pasvorton...'
# Login
login:
@@ -40,7 +41,7 @@ error:
max_registration: 'Vi superis la maksimuman nombron de enregistroj (%reg_count/%max_acc %reg_names) pro via ligo!'
logged_in: '&cVi jam estas ensalutinta!'
kick_for_vip: '&3VIP ludanto aliĝis al la servilo kiam ĝi pleniĝis!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cEraro okazis: neatingebla ludanta gastiga nomo!'
tempban_max_logins: '&cVi estis portempe malpermesita por ne ensaluti tro multajn fojojn.'
# AntiBot
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cVia konto ne aktivigis tamen, bonvolu kontroli viajn retpoŝtojn!'
not_activated: '&cKonto ne aktivigita, bonvolu registriĝi kaj aktivigi ĝin antaŭ ol provi denove.'
password_changed: '&2Pasvorto sukcese ŝanĝita!'
logout: '&2Elsalutita sukcese!'
reload: '&2Agordo kaj datumbazo estis larditaj korekte!'
@@ -79,7 +81,7 @@ on_join_validation:
country_banned: '&4Via lando estas malpermesitaj de tiu servilo!'
not_owner_error: 'Vi ne estas la posedanto de tiu konto. Bonvolu elekti alian nomon!'
invalid_name_case: 'Vi devus aliĝi uzante uzantnomon %valid, ne %invalid.'
# TODO quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.'
quick_command: 'Vi uzis komandon tro rapide! Bonvolu, re-aliĝi al la servilo kaj atendi pli longe antaŭ ol uzi iun ajn komandon.'
# Email
email:
@@ -90,10 +92,10 @@ email:
old_email_invalid: '&cNevalida malnovaj retpoŝto, provu denove!'
invalid: '&cNevalida retadreso, provu denove!'
added: '&2Retpoŝtadreso sukcese aldonitaj al via konto!'
# TODO add_not_allowed: '&cAdding email was not allowed'
add_not_allowed: '&cAldoni retpoŝton ne estis permesita.'
request_confirmation: '&cBonvolu konfirmi vian retadreson!'
changed: '&2Retpoŝtadreso ŝanĝis ĝuste!'
# TODO change_not_allowed: '&cChanging email was not allowed'
change_not_allowed: '&cŜanĝi retpoŝton ne estis permesita.'
email_show: '&2Via nuna retadreso estas: &f%email'
no_email_for_account: '&2Vi aktuale ne havas retadreson asociita kun ĉi tiu konto.'
already_used: '&4La retpoŝto jam estas uzata'
@@ -119,18 +121,18 @@ captcha:
usage_captcha: '&3Ensaluti vi devas solvi captcha kodo, bonvolu uzi la komando: /captcha %captcha_code'
wrong_captcha: '&cMalĝusta captcha, bonvolu tajpi "/captcha %captcha_code" en la babilejo!'
valid_captcha: '&2Captcha kodo solvita ĝuste!'
# TODO captcha_for_registration: 'To register you have to solve a captcha first, please use the command: /captcha %captcha_code'
# TODO register_captcha_valid: '&2Valid captcha! You may now register with /register'
captcha_for_registration: 'Por registri vi devas unue solvi kapĉon, bonvolu uzi la komandon: /captcha %captcha_code'
register_captcha_valid: '&2Valida kapĉo! Vi nun povas registri per /register'
# Verification code
verification:
# TODO code_required: '&3This command is sensitive and requires an email verification! Check your inbox and follow the email''s instructions.'
# TODO command_usage: '&cUsage: /verification <code>'
# TODO incorrect_code: '&cIncorrect code, please type "/verification <code>" into the chat, using the code you received by email'
# TODO success: '&2Your identity has been verified! You can now execute all commands within the current session!'
# TODO already_verified: '&2You can already execute every sensitive command within the current session!'
# TODO code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
# TODO email_needed: '&3To verify your identity you need to link an email address with your account!!'
code_required: '&3Tiu ĉi komando estas sentema kaj postulas retpoŝtan kontrolon! Kontrolu vian leterkeston kaj sekvu la instrukciojn en la retpoŝto.'
command_usage: '&cUzado: /verification <code>'
incorrect_code: '&cMalĝusta kodo, bonvolu tajpi "/verification <code>" en la babilejo, uzante la kodon, kiun vi ricevis per retpoŝto'
success: '&2Via identeco estis kontrolita! Vi nun povas ekzekuti ĉiujn komandojn dum la aktuala sesio!'
already_verified: '&2Vi jam povas ekzekuti ĉiujn sentemajn komandojn dum la aktuala sesio!'
code_expired: '&3Via kodo eksvalidiĝis! Ekzekutu alian senteman komandon por ricevi novan kodon!'
email_needed: '&3Por kontroli vian identecon vi devas ligi retpoŝtan adreson kun via konto!'
# Time units
time:
@@ -146,12 +148,26 @@ time:
# Two-factor authentication
two_factor:
code_created: '&2Via sekreta kodo estas %code. Vi povas skani ĝin de tie %url'
# TODO confirmation_required: 'Please confirm your code with /2fa confirm <code>'
# TODO code_required: 'Please submit your two-factor authentication code with /2fa code <code>'
# TODO already_enabled: 'Two-factor authentication is already enabled for your account!'
# TODO enable_error_no_code: 'No 2fa key has been generated for you or it has expired. Please run /2fa add'
# TODO enable_success: 'Successfully enabled two-factor authentication for your account'
# TODO enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add'
# TODO not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add'
# TODO removed_success: 'Successfully removed two-factor auth from your account'
# TODO invalid_code: 'Invalid code!'
confirmation_required: 'Bonvolu konfirmi vian kodon per /2fa confirm <code>'
code_required: 'Bonvolu sendi vian du-faktoran aŭtentikigan kodon per /2fa code <code>'
already_enabled: 'Du-faktora aŭtentikigo jam estas ebligita por via konto!'
enable_error_no_code: 'Neniu 2fa ŝlosilo estis generita por vi aŭ ĝi eksvalidiĝis. Bonvolu kuri /2fa add'
enable_success: 'Sukcese ebligis du-faktoran aŭtentikigon por via konto'
enable_error_wrong_code: 'Malĝusta kodo aŭ kodo eksvalidiĝis. Bonvolu kuri /2fa add'
not_enabled_error: 'Du-faktora aŭtentikigo ne estas ebligita por via konto. Kuru /2fa add'
removed_success: 'Sukcese forigis du-faktoran aŭtentikigon de via konto'
invalid_code: 'Nevalida kodo!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aSukcesa Bedrock-aŭtomata ensaluto!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aVi estas blokita en portalo dum ensaluto.'
fix_underground: '&aVi estas blokita subtere dum ensaluto.'
cannot_fix_underground: '&aVi estas blokita subtere dum ensaluto, sed ni ne povas ripari ĝin.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cVi estis malkonektita pro duobla ensaluto.'
+18 -2
View File
@@ -10,7 +10,7 @@ registration:
name_taken: '&cUsuario ya registrado'
register_request: '&cPor favor, regístrate con "/register <contraseña> <confirmarContraseña">'
command_usage: '&cUso: /register Contraseña ConfirmarContraseña'
reg_only: '&f¡Sólo para jugadores registrados! Por favor visita http://www.example.com/ para registrarte'
reg_only: '&f¡Sólo para jugadores registrados! Por favor visita https://www.example.com/ para registrarte'
success: '&c¡Registrado correctamente!'
kicked_admin_registered: 'Un administrador te acaba de registrar; entra en la cuenta de nuevo'
@@ -21,6 +21,7 @@ password:
unsafe_password: '&cLa contraseña elegida no es segura, por favor elija otra...'
forbidden_characters: '&cTu contraseña tiene carácteres no admitidos, los cuales son: %valid_chars'
wrong_length: '&fTu contraseña es muy larga o muy corta'
pwned_password: '&cLa contraseña elegida no es segura. ¡Se ha usado %pwned_count veces ya! Por favor, use una contraseña fuerte...'
# Login
login:
@@ -41,7 +42,7 @@ error:
max_registration: '&fHas excedido la cantidad máxima de registros para tu cuenta'
logged_in: '&c¡Ya has iniciado sesión!'
kick_for_vip: '&c¡Un jugador VIP ha ingresado al servidor lleno!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cSe produjo un error: nombre de host del jugador no resuelto!'
tempban_max_logins: '&cHas sido expulsado temporalmente por intentar iniciar sesión demasiadas veces.'
# AntiBot
@@ -58,6 +59,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&fTu cuenta no está activada aún, ¡revisa tu correo!'
not_activated: '&cCuenta no activada, por favor regístrese y actívela antes de intentarlo de nuevo.'
password_changed: '&c¡Contraseña cambiada!'
logout: '&cDesconectado correctamente.'
reload: '&fLa configuración y la base de datos han sido recargados'
@@ -156,3 +158,17 @@ two_factor:
not_enabled_error: 'La autenticación de dos factores no está habilitada para tu cuenta. Por favor usa /2fa add'
removed_success: 'Se ha eliminado correctamente la autenticación de dos factores de tu cuenta'
invalid_code: '¡Código incorrecto!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&a¡Inicio de sesión automático de Bedrock exitoso!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aEstás atascado en el portal durante el inicio de sesión.'
fix_underground: '&aEstás atascado bajo tierra durante el inicio de sesión.'
cannot_fix_underground: '&aEstás atascado bajo tierra durante el inicio de sesión, pero no podemos solucionarlo.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cHas sido desconectado debido a un inicio de sesión doble.'
+47 -30
View File
@@ -5,13 +5,13 @@
# Registration
registration:
register_request: '&3Palun registreeri käsklusega: /register <parool> <KinnitaParool>'
command_usage: '&cKasutus: /register <parool> <KinnitaParool>'
reg_only: '&4Vaid registreeritud mängijad saavad serveriga liituda! Enda kasutaja registreerimiseks külasta http://example.com!'
kicked_admin_registered: 'Administraator registreeris su kasutaja, palun logi uuesti sisse.'
success: '&2Edukalt registreeritud!'
disabled: '&cMängusisene registreerimine on välja lülitatud!'
name_taken: '&cSee kasutaja on juba registreeritud!'
register_request: '&3Palun registreeri käsklusega: /register <parool> <KinnitaParool>'
command_usage: '&cKasutus: /register <parool> <KinnitaParool>'
reg_only: '&4Vaid registreeritud mängijad saavad serveriga liituda! Enda kasutaja registreerimiseks külasta https://example.com!'
success: '&2Edukalt registreeritud!'
kicked_admin_registered: 'Administraator registreeris su kasutaja, palun logi uuesti sisse.'
# Password errors on registration
password:
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cSee parool ei ole turvaline, palun vali mõni teine parool.'
forbidden_characters: '&4Sinu parool sisaldab keelatud tähemärke. Lubatud tähemärgid: %valid_chars'
wrong_length: '&cSinu parool on liiga pikk või lühike, palun vali mõni teine parool.'
pwned_password: '&cTeie valitud parool ei ole turvaline. Seda on kasutatud juba %pwned_count korda! Palun kasutage tugevat parooli...'
# Login
login:
@@ -31,17 +32,17 @@ login:
# Errors
error:
unregistered_user: '&cSee kasutaja ei ole registreeritud!'
denied_command: '&cSelle käskluse kasutamiseks pead olema sisselogitud!'
denied_chat: '&cVestlemiseks pead olema sisselogitud!'
unregistered_user: '&cSee kasutaja ei ole registreeritud!'
not_logged_in: '&cSa ei ole sisselogitud!'
tempban_max_logins: '&cSind on ajutiselt serverist blokeeritud, kuna sisestasid mitu korda vale parooli.'
max_registration: '&cSinu IP-aadressile on registreeritud liiga palju kasutajaid! (%reg_count/%max_acc %reg_names)'
no_permission: '&4Sul puudub selle käskluse kasutamiseks luba.'
unexpected_error: '&4Esines ootamatu tõrge, palun teavita administraatorit!'
kick_for_vip: '&3VIP-mängija liitus serveriga ajal, mil see oli täis!'
max_registration: '&cSinu IP-aadressile on registreeritud liiga palju kasutajaid! (%reg_count/%max_acc %reg_names)'
logged_in: '&cSa oled juba sisselogitud!'
kick_for_vip: '&3VIP-mängija liitus serveriga ajal, mil see oli täis!'
kick_unresolved_hostname: '&cEsines tõrge: mängija hostinimi on lahendamata!'
tempban_max_logins: '&cSind on ajutiselt serverist blokeeritud, kuna sisestasid mitu korda vale parooli.'
# AntiBot
antibot:
@@ -49,57 +50,59 @@ antibot:
auto_enabled: '&4[AntiBotTeenus] AntiBot sisselülitatud!'
auto_disabled: '&2[AntiBotTeenus] AntiBot välja lülitatud peale %m minutit!'
# Unregister
unregister:
success: '&cKasutaja edukalt kustutatud!'
command_usage: '&cKasutus: /unregister <parool>'
# Other messages
misc:
accounts_owned_self: 'Sa omad %count kontot:'
accounts_owned_other: 'Mängijal %name on %count kontot:'
account_not_activated: '&cSinu konto ei ole veel aktiveeritud, kontrolli oma meili!'
not_activated: '&cKonto ei ole aktiveeritud, palun registreerige ja aktiveerige see enne uuesti proovimist.'
password_changed: '&2Parool edukalt vahetatud!'
logout: '&2Edukalt välja logitud!'
reload: '&2Seadistused ning andmebaas on edukalt taaslaaditud!'
usage_change_password: '&cKasutus: /changepassword <vanaParool> <uusParool>'
accounts_owned_self: 'Sa omad %count kontot:'
accounts_owned_other: 'Mängijal %name on %count kontot:'
# Session messages
session:
invalid_session: '&cSinu IP-aadress muutus, seega sinu sessioon aegus!'
valid_session: '&2Sisse logitud sessiooni jätkumise tõttu.'
invalid_session: '&cSinu IP-aadress muutus, seega sinu sessioon aegus!'
# Error messages when joining
on_join_validation:
same_ip_online: 'Sama IP-aadressiga mängija juba mängib!'
same_nick_online: '&4Sama kasutaja on juba serveriga ühendatud!'
name_length: '&4Sinu kasutajanimi on liiga pikk või liiga lühike!'
characters_in_name: '&4Sinu kasutajanimi sisaldab keelatud tähemärke. Lubatud tähemärgid: %valid_chars'
country_banned: '&4Sinu riigist ei ole võimalik sellesse serverisse ühenduda!'
not_owner_error: 'Sa ei ole selle konto omanik. Vali teine nimi!'
kick_full_server: '&4Server on täis, proovi hiljem uuesti!'
same_nick_online: '&4Sama kasutaja on juba serveriga ühendatud!'
invalid_name_case: 'Sa peaksid liituma nimega %valid, mitte nimega %invalid.'
same_ip_online: 'Sama IP-aadressiga mängija juba mängib!'
quick_command: 'Sa kasutasid käsklust liiga kiiresti! Palun liitu serveriga uuesti ning oota enne mõne käskluse kasutamist kauem.'
# Email
email:
add_email_request: '&3Palun seo oma kasutajaga meiliaadress kasutades käsklust: /email add <sinuEmail> <kinnitaEmail>'
usage_email_add: '&cKasutus: /email add <email> <kinnitaEmail>'
usage_email_change: '&cKasutus: /email change <vanaEmail> <uusEmail>'
new_email_invalid: '&cUus meiliaadress on sobimatu, proovi uuesti!'
old_email_invalid: '&cVana meiliaadress on sobimatu, proovi uuesti!'
invalid: '&cSobimatu meiliaadress, proovi uuesti!'
added: '&2Meiliaadress edukalt lisatud!'
add_not_allowed: '&cMeiliaadressi lisamine ei ole lubatud.'
request_confirmation: '&cPalun kinnita oma meiliaadress!'
changed: '&2Meiliaadress edukalt muudetud!'
change_not_allowed: '&cMeiliaadressi muutmine ei ole lubatud.'
email_show: '&2Sinu praegune meiliaadress on: &f%email'
incomplete_settings: 'Viga: meili saatmiseks pole kõik vajalikud seaded seadistatud. Teata sellest administraatorit.'
already_used: '&4See meiliaadress on juba kasutuses!'
send_failure: 'Meili ei õnnestunud saata. Teata sellest administraatorit.'
no_email_for_account: '&2Selle kasutajaga ei ole seotud ühtegi meiliaadressi.'
add_email_request: '&3Palun seo oma kasutajaga meiliaadress kasutades käsklust: /email add <sinuEmail> <kinnitaEmail>'
already_used: '&4See meiliaadress on juba kasutuses!'
incomplete_settings: 'Viga: meili saatmiseks pole kõik vajalikud seaded seadistatud. Teata sellest administraatorit.'
send_failure: 'Meili ei õnnestunud saata. Teata sellest administraatorit.'
change_password_expired: 'Selle käsklusega ei saa sa enam parooli muuta.'
email_cooldown_error: '&cMeil on juba saadetud. Sa pead ootama %time enne kui saad küsida uue saatmist.'
add_not_allowed: '&cMeiliaadressi lisamine ei ole lubatud.'
change_not_allowed: '&cMeiliaadressi muutmine ei ole lubatud.'
# Password recovery by email
recovery:
@@ -131,6 +134,17 @@ verification:
code_expired: '&3Kood on aegunud! Kasuta mõnda ohtlikku käsklust, et saada uus kood!'
email_needed: '&3Konto kinnitamiseks pead siduma oma kontoga enda meiliaadressi!'
# Time units
time:
second: 'sekund'
seconds: 'sekundit'
minute: 'minut'
minutes: 'minutit'
hour: 'tund'
hours: 'tundi'
day: 'päev'
days: 'päeva'
# Two-factor authentication
two_factor:
code_created: '&2Sinu privaatne kood on %code. Sa saad selle skännida aadressil %url'
@@ -144,13 +158,16 @@ two_factor:
removed_success: 'Sinu kontolt on edukalt eemaldatud kaheastmeline autentimine.'
invalid_code: 'Vale kood!'
# Time units
time:
second: 'sekund'
seconds: 'sekundit'
minute: 'minut'
minutes: 'minutit'
hour: 'tund'
hours: 'tundi'
day: 'päev'
days: 'päeva'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrocki automaatne sisselogimine õnnestus!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aOlete sisselogimise ajal portaalis kinni.'
fix_underground: '&aOlete sisselogimise ajal maa all kinni.'
cannot_fix_underground: '&aOlete sisselogimise ajal maa all kinni, kuid me ei saa seda parandada.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cTeid on ühendatud lahti kahekordse sisselogimise tõttu.'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cAukeratutako pasahitza ez da segurua.Mesedez, aukeratu beste bat...'
forbidden_characters: '&4Pasahitzak ondorengo karaktereak bakarrik izan ditzake: %valid_chars'
wrong_length: '&fZure pasahitza motzegia edo luzeegia da'
pwned_password: '&cAukeratutako pasahitza ez da segurua. %pwned_count aldiz erabili da dagoeneko! Mesedez, erabili pasahitz sendo bat...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&fZure kontua aktibatu gabe dago. Mesedez, berretsi zure posta elektronikoa!'
not_activated: '&cKontua ez dago aktibatuta, mesedez erregistratu eta aktibatu berriro saiatu aurretik.'
password_changed: '&cPasahitza ondo aldatu duzu!'
logout: '&cSaioa itxi duzu'
reload: '&fEzarpenak eta datu-basea berrabiarazi dira'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Ez duzu 2 faktore autentikazioa konfiguratu. Erabaili /2fa add'
removed_success: '2 faktoreko autentikazioa desaktibatu duzu'
invalid_code: 'Kode okerra!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock automatikoki saioa hasi da!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aPortal batean trabatuta zaude saioa hasten ari zarela.'
fix_underground: '&aLur azpian trabatuta zaude saioa hasten ari zarela.'
cannot_fix_underground: '&aLur azpian trabatuta zaude saioa hasten ari zarela, baina ezin dugu konpondu.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cSistematik kanporatu zaitugu saio bikoitza egiteagatik.'
+76 -60
View File
@@ -9,17 +9,18 @@ registration:
name_taken: '&cPelaaja on jo rekisteröity'
register_request: '&cRekisteröidy palvelimellemme komennolla "/register <salasana> <salasana>"'
command_usage: '&cKäyttötapa: /register <salasana> <salasana>'
reg_only: '&fMene sivustolle: http://example.com rekisteröityäksesi!'
reg_only: '&fMene sivustolle: https://example.com rekisteröityäksesi!'
success: '&cRekisteröidyit onnistuneesti!'
# TODO kicked_admin_registered: 'An admin just registered you; please log in again'
kicked_admin_registered: 'Ylläpitäjä rekisteröi sinut juuri; kirjaudu sisään uudelleen.'
# Password errors on registration
password:
match_error: '&fSalasanat ei täsmää'
# TODO name_in_password: '&cYou can''t use your name as password, please choose another one...'
# TODO unsafe_password: '&cThe chosen password isn''t safe, please choose another one...'
# TODO forbidden_characters: '&4Your password contains illegal characters. Allowed chars: %valid_chars'
name_in_password: '&cEt voi käyttää nimeäsi salasanana, valitse toinen...'
unsafe_password: '&cValitsemasi salasana ei ole turvallinen, valitse toinen...'
forbidden_characters: '&4Salasanassasi on kiellettyjä merkkejä. Sallitut merkit: %valid_chars'
wrong_length: '&fSalasanasi on liian pitkä tai lyhyt.'
pwned_password: '&cValitsemasi salasana ei ole turvallinen. Sitä on käytetty %pwned_count kertaa jo! Käytä vahvaa salasanaa...'
# Login
login:
@@ -31,8 +32,8 @@ login:
# Errors
error:
# TODO denied_command: '&cIn order to use this command you must be authenticated!'
# TODO denied_chat: '&cIn order to chat you must be authenticated!'
denied_command: '&cSinun on oltava todennettu käyttääksesi tätä komentoa!'
denied_chat: '&cSinun on oltava todennettu voidaksesi chattailla!'
unregistered_user: '&cSalasanat eivät täsmää'
not_logged_in: '&cEt ole kirjautunut sisään!'
no_permission: '&cEi oikeuksia'
@@ -40,14 +41,14 @@ error:
max_registration: '&fSinulla ei ole oikeuksia tehdä enempää pelaajatilejä!'
logged_in: '&cOlet jo kirjautunut!'
kick_for_vip: '&cVIP pelaaja liittyi täyteen palvelimeen!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
# TODO tempban_max_logins: '&cYou have been temporarily banned for failing to log in too many times.'
kick_unresolved_hostname: '&cTapahtui virhe: pelaajan verkkonimiä ei voitu ratkaista!'
tempban_max_logins: '&cSinut on tilapäisesti kielletty liian monen kirjautumisen epäonnistumisen vuoksi.'
# AntiBot
antibot:
# TODO kick_antibot: 'AntiBot protection mode is enabled! You have to wait some minutes before joining the server.'
# TODO auto_enabled: '&4[AntiBotService] AntiBot enabled due to the huge number of connections!'
# TODO auto_disabled: '&2[AntiBotService] AntiBot disabled after %m minutes!'
kick_antibot: 'Antibot-suojatila on käytössä! Sinun on odotettava muutama minuutti ennen kuin voit liittyä palvelimelle.'
auto_enabled: '&4[AntiBotService] Antibot otettu käyttöön suuren yhteyksien määrän vuoksi!'
auto_disabled: '&2[AntiBotService] Antibot poistettu käytöstä %m minuutin kuluttua!'
# Unregister
unregister:
@@ -57,12 +58,13 @@ unregister:
# Other messages
misc:
account_not_activated: '&fKäyttäjäsi ei ole vahvistettu!'
not_activated: '&cTiliä ei ole aktivoitu, rekisteröidy ja aktivoi se ennen kuin yrität uudelleen.'
password_changed: '&cSalasana vaihdettu!!'
logout: '&cKirjauduit ulos palvelimelta.'
reload: '&fAsetukset uudelleenladattu'
usage_change_password: '&fKäyttötapa: /changepassword vanhaSalasana uusiSalasana'
# TODO accounts_owned_self: 'You own %count accounts:'
# TODO accounts_owned_other: 'The player %name has %count accounts:'
accounts_owned_self: 'Omistat %count tiliä:'
accounts_owned_other: 'Pelaajalla %name on %count tiliä:'
# Session messages
session:
@@ -71,15 +73,15 @@ session:
# Error messages when joining
on_join_validation:
# TODO same_ip_online: 'A player with the same IP is already in game!'
same_ip_online: 'Sama IP-osoitteella oleva pelaaja on jo pelissä!'
same_nick_online: '&COlet jo palvelimella! &COdota käyttäjän aikakatkaisua tai ota yhteyttä palveluntarjoojaan.'
name_length: '&cPelaajanimesi on liian lyhyt tai pitkä'
characters_in_name: '&cPelaajanimesi sisältää luvattomia merkkejä. Hyväksytyt merkit: %valid_chars'
kick_full_server: '&cPalvelin on täynnä, Yritä pian uudelleen!'
# TODO country_banned: '&4Your country is banned from this server!'
# TODO not_owner_error: 'You are not the owner of this account. Please choose another name!'
# TODO invalid_name_case: 'You should join using username %valid, not %invalid.'
# TODO quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.'
country_banned: '&4Maasi on estetty tästä palvelimesta!'
not_owner_error: 'Et ole tämän tilin omistaja. Valitse toinen nimi!'
invalid_name_case: 'Sinun pitäisi liittyä käyttäen käyttäjänimeä %valid, ei %invalid.'
quick_command: 'Käytit komentoa liian nopeasti! Kirjaudu sisään uudelleen ja odota enemmän ennen minkään komennon käyttöä.'
# Email
email:
@@ -90,17 +92,17 @@ email:
old_email_invalid: '[AuthMe] Vanha sähköposti on väärä!'
invalid: '[AuthMe] Väärä sähköposti'
added: '[AuthMe] Sähköposti lisätty!'
# TODO add_not_allowed: '&cAdding email was not allowed'
add_not_allowed: '&cSähköpostin lisääminen ei ollut sallittua.'
request_confirmation: '[AuthMe] Vahvistuta sähköposti!'
changed: '[AuthMe] Sähköposti vaihdettu!'
# TODO change_not_allowed: '&cChanging email was not allowed'
# TODO email_show: '&2Your current email address is: &f%email'
# TODO no_email_for_account: '&2You currently don''t have email address associated with this account.'
# TODO already_used: '&4The email address is already being used'
# TODO incomplete_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.'
# TODO send_failure: 'The email could not be sent. Please contact an administrator.'
# TODO change_password_expired: 'You cannot change your password using this command anymore.'
# TODO email_cooldown_error: '&cAn email was already sent recently. You must wait %time before you can send a new one.'
change_not_allowed: '&cSähköpostin muuttaminen ei ollut sallittua.'
email_show: '&2Nykyinen sähköpostiosoitteesi on: &f%email'
no_email_for_account: '&2Sinulla ei tällä hetkellä ole liitettyä sähköpostiosoitetta tähän tiliin.'
already_used: '&4Sähköpostiosoite on jo käytössä'
incomplete_settings: 'Virhe: kaikki tarvittavat asetukset eivät ole asetettu sähköpostien lähettämistä varten. Ota yhteyttä ylläpitäjään.'
send_failure: 'Sähköpostia ei voitu lähettää. Ota yhteyttä järjestelmänvalvojaan.'
change_password_expired: 'Et voi enää vaihtaa salasanaa tällä komennolla.'
email_cooldown_error: '&cSähköpostia on jo lähetetty äskettäin. Sinun on odotettava %time ennen kuin voit lähettää uuden.'
# Password recovery by email
recovery:
@@ -108,50 +110,64 @@ recovery:
command_usage: '&fKäyttötapa: /email recovery <Email>'
email_sent: '[AuthMe] Palautus sähköposti lähetetty!'
code:
# TODO code_sent: 'A recovery code to reset your password has been sent to your email.'
# TODO incorrect: 'The recovery code is not correct! You have %count tries remaining.'
# TODO tries_exceeded: 'You have exceeded the maximum number attempts to enter the recovery code. Use "/email recovery [email]" to generate a new one.'
# TODO correct: 'Recovery code entered correctly!'
# TODO change_password: 'Please use the command /email setpassword <new password> to change your password immediately.'
code_sent: 'Salasanasi palauttamiseksi lähetetty palautuskoodi on lähetetty sähköpostiisi.'
incorrect: 'Palautuskoodi ei ole oikea! Sinulla on %count yritystä jäljellä.'
tries_exceeded: 'Olet ylittänyt enimmäisyritysten määrän palautuskoodin syöttämisessä. Käytä "/email recovery [email]" luodaksesi uuden.'
correct: 'Palautuskoodi syötetty oikein!'
change_password: 'Käytä komentoa /email setpassword <uusi salasana> vaihtaaksesi salasanasi välittömästi.'
# Captcha
captcha:
usage_captcha: '&cKäyttötapa: /captcha %captcha_code'
wrong_captcha: '&cVäärä varmistus, käytä : /captcha %captcha_code'
valid_captcha: '&cSinun varmistus onnistui.!'
# TODO captcha_for_registration: 'To register you have to solve a captcha first, please use the command: /captcha %captcha_code'
# TODO register_captcha_valid: '&2Valid captcha! You may now register with /register'
captcha_for_registration: 'Rekisteröityäksesi sinun on ensin ratkaistava captcha, käytä komentoa: /captcha %captcha_code'
register_captcha_valid: '&2Validi captcha! Voit nyt rekisteröityä käyttäen komentoa /register'
# Verification code
verification:
# TODO code_required: '&3This command is sensitive and requires an email verification! Check your inbox and follow the email''s instructions.'
# TODO command_usage: '&cUsage: /verification <code>'
# TODO incorrect_code: '&cIncorrect code, please type "/verification <code>" into the chat, using the code you received by email'
# TODO success: '&2Your identity has been verified! You can now execute all commands within the current session!'
# TODO already_verified: '&2You can already execute every sensitive command within the current session!'
# TODO code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
# TODO email_needed: '&3To verify your identity you need to link an email address with your account!!'
code_required: '&3Tämä komento on herkkä ja vaatii sähköpostivahvistuksen! Tarkista sähköpostisi ja seuraa sähköpostin ohjeita.'
command_usage: '&cKäyttö: /verification <koodi>'
incorrect_code: '&cVirheellinen koodi, kirjoita "/verification <koodi>" chatiin, käyttäen koodia, jonka sait sähköpostitse'
success: '&2Henkilöllisyytesi on varmennettu! Voit nyt suorittaa kaikki komennot tämän istunnon aikana!'
already_verified: '&2Voit jo suorittaa jokaisen herkän komennon tämän istunnon aikana!'
code_expired: '&3Koodisi on vanhentunut! Suorita toinen herkkä komento saadaksesi uuden koodin!'
email_needed: '&3Vahvistaaksesi henkilöllisyytesi sinun on liitettävä sähköpostiosoite tilillesi!!'
# Time units
time:
# TODO second: 'second'
# TODO seconds: 'seconds'
# TODO minute: 'minute'
# TODO minutes: 'minutes'
# TODO hour: 'hour'
# TODO hours: 'hours'
# TODO day: 'day'
# TODO days: 'days'
second: 'sekunti'
seconds: 'sekuntia'
minute: 'minuutti'
minutes: 'minuuttia'
hour: 'tunti'
hours: 'tuntia'
day: 'päivä'
days: 'päivää'
# Two-factor authentication
two_factor:
# TODO code_created: '&2Your secret code is %code. You can scan it from here %url'
# TODO confirmation_required: 'Please confirm your code with /2fa confirm <code>'
# TODO code_required: 'Please submit your two-factor authentication code with /2fa code <code>'
# TODO already_enabled: 'Two-factor authentication is already enabled for your account!'
# TODO enable_error_no_code: 'No 2fa key has been generated for you or it has expired. Please run /2fa add'
# TODO enable_success: 'Successfully enabled two-factor authentication for your account'
# TODO enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add'
# TODO not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add'
# TODO removed_success: 'Successfully removed two-factor auth from your account'
# TODO invalid_code: 'Invalid code!'
code_created: '&2Salainen koodisi on %code. Voit skannata sen täältä %url'
confirmation_required: 'Vahvista koodisi komennolla /2fa confirm <koodi>'
code_required: 'Lähetä kaksivaiheisen todennuksen koodisi komennolla /2fa code <koodi>'
already_enabled: 'Kaksivaiheinen todennus on jo käytössä tililläsi!'
enable_error_no_code: 'Sinulle ei ole luotu kaksivaiheisen todennuksen avainta tai se on vanhentunut. Suorita komento /2fa add'
enable_success: 'Kaksivaiheinen todennus onnistuneesti käytössä tililläsi'
enable_error_wrong_code: 'Väärä koodi tai koodi on vanhentunut. Suorita komento /2fa add'
not_enabled_error: 'Kaksivaiheista todennusta ei ole käytössä tililläsi. Suorita komento /2fa add'
removed_success: 'Kaksivaiheinen todennus poistettu tililtäsi onnistuneesti'
invalid_code: 'Virheellinen koodi!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock-automaattinen sisäänkirjautuminen onnistui!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aOlet jumissa portaalissa sisäänkirjautumisen aikana.'
fix_underground: '&aOlet jumissa maan alla sisäänkirjautumisen aikana.'
cannot_fix_underground: '&aOlet jumissa maan alla sisäänkirjautumisen aikana, mutta emme voi korjata sitä.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cSinut on katkaistu kaksoiskirjautumisen vuoksi.'
@@ -23,6 +23,7 @@ password:
unsafe_password: '&cCe mot de passe n''est pas accepté, choisissez-en un autre.'
forbidden_characters: '&cVotre mot de passe contient des caractères non autorisés. Caractères permis : %valid_chars'
wrong_length: '&cVotre mot de passe est trop court ou trop long !'
pwned_password: '&cLe mot de passe choisi n''est pas sécurisé. Il a déjà été utilisé %pwned_count fois ! Veuillez utiliser un mot de passe fort...'
# Identification
login:
@@ -60,6 +61,7 @@ unregister:
# Autres messages
misc:
account_not_activated: '&fCe compte n''est pas actif, consultez vos mails !'
not_activated: '&cCompte non activé, veuillez vous inscrire et l''activer avant de réessayer.'
password_changed: '&aMot de passe changé avec succès !'
logout: '&cVous avez été déconnecté !'
reload: '&aAuthMe a été relancé avec succès.'
@@ -158,3 +160,17 @@ two_factor:
not_enabled_error: '&cL''authentification à double facteur n''est pas active sur votre compte. Faites "/2fa add" pour l''activer.'
removed_success: '&cL''authentification à double facteur a été désactivé pour votre compte !'
invalid_code: '&cCode secret invalide !'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aConnexion automatique Bedrock réussie !'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aVous êtes bloqué dans un portail lors de la connexion.'
fix_underground: '&aVous êtes bloqué sous terre lors de la connexion.'
cannot_fix_underground: '&aVous êtes bloqué sous terre lors de la connexion, mais nous ne pouvons pas le corriger.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cVous avez été déconnecté en raison d''une double connexion.'
+73 -58
View File
@@ -9,17 +9,18 @@ registration:
name_taken: '&cEse nome de usuario xa está rexistrado'
register_request: '&cPor favor, rexístrate con "/register <contrasinal> <confirmarContrasinal>"'
command_usage: '&cUso: /register contrasinal confirmarContrasinal'
reg_only: '&fSó xogadores rexistrados! Por favor, visita http://example.com para rexistrarte'
reg_only: '&fSó xogadores rexistrados! Por favor, visita https://example.com para rexistrarte'
success: '&cRexistrado con éxito!'
# TODO kicked_admin_registered: 'An admin just registered you; please log in again'
kicked_admin_registered: 'Un administrador acaba de rexistrarte; por favor, volve a iniciar sesión.'
# Password errors on registration
password:
match_error: '&fO contrasinal non coincide'
# TODO name_in_password: '&cYou can''t use your name as password, please choose another one...'
# TODO unsafe_password: '&cThe chosen password isn''t safe, please choose another one...'
# TODO forbidden_characters: '&4Your password contains illegal characters. Allowed chars: %valid_chars'
name_in_password: '&cNon podes usar o teu nome como contrasinal, por favor, escolle outro...'
unsafe_password: '&cO contrasinal escollido non é seguro, por favor, escolle outro...'
forbidden_characters: '&4O teu contrasinal contén caracteres non permitidos. Caracteres permitidos: %valid_chars'
wrong_length: '&fO teu contrasinal non alcanza a lonxitude mínima ou excede a lonxitude máxima'
pwned_password: '&cO contrasinal elixido non é seguro. Foi usado %pwned_count veces xa! Por favor, use un contrasinal forte...'
# Login
login:
@@ -31,8 +32,8 @@ login:
# Errors
error:
# TODO denied_command: '&cIn order to use this command you must be authenticated!'
# TODO denied_chat: '&cIn order to chat you must be authenticated!'
denied_command: '&cPara usar este comando debes estar autenticado!'
denied_chat: '&cPara chatear debes estar autenticado!'
unregistered_user: '&cEse nome de usuario non está rexistrado'
not_logged_in: '&cNon te identificaches!'
no_permission: '&cNon tes o permiso'
@@ -40,12 +41,12 @@ error:
max_registration: '&fExcediches o máximo de rexistros para a túa Conta'
logged_in: '&cXa estás identificado!'
kick_for_vip: '&cUn xogador VIP uniuse ao servidor cheo!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
# TODO tempban_max_logins: '&cYou have been temporarily banned for failing to log in too many times.'
kick_unresolved_hostname: '&cProduciuse un erro: nome do xogador non resolto!'
tempban_max_logins: '&cEstás temporalmente expulsado por fallar ao acceder en demasiadas ocasións.'
# AntiBot
antibot:
# TODO kick_antibot: 'AntiBot protection mode is enabled! You have to wait some minutes before joining the server.'
kick_antibot: 'O modo de protección AntiBot está activado! Tes que agardar uns minutos antes de unirte ao servidor.'
auto_enabled: '[AuthMe] AntiBotMod conectouse automáticamente debido a conexións masivas!'
auto_disabled: '[AuthMe] AntiBotMod desactivouse automáticamente despois de %m minutos, esperemos que a invasión se detivera'
@@ -57,12 +58,13 @@ unregister:
# Other messages
misc:
account_not_activated: '&fA túa conta aínda non está activada, comproba a túa bandexa de correo!!'
not_activated: '&cConta non activada, por favor rexístrese e actívea antes de tentalo de novo.'
password_changed: '&cCambiouse o contrasinal!'
logout: '&cSesión pechada con éxito'
reload: '&fRecargáronse a configuración e a base de datos'
usage_change_password: '&fUso: /changepassword <contrasinalVello> <contrasinalNovo>'
# TODO accounts_owned_self: 'You own %count accounts:'
# TODO accounts_owned_other: 'The player %name has %count accounts:'
accounts_owned_self: 'Tes %count contas:'
accounts_owned_other: 'O xogador %name ten %count contas:'
# Session messages
session:
@@ -71,15 +73,15 @@ session:
# Error messages when joining
on_join_validation:
# TODO same_ip_online: 'A player with the same IP is already in game!'
same_ip_online: 'Un xogador coa mesma IP xa está en xogo!'
same_nick_online: '&fXa está xogando alguén co mesmo nome'
name_length: '&cO teu nome é demasiado curto ou demasiado longo'
characters_in_name: '&cO teu nome contén caracteres ilegais. Caracteres permitidos: %valid_chars'
kick_full_server: '&cO servidor está actualmente cheo, sentímolo!'
country_banned: 'O teu país está bloqueado neste servidor'
# TODO not_owner_error: 'You are not the owner of this account. Please choose another name!'
# TODO invalid_name_case: 'You should join using username %valid, not %invalid.'
# TODO quick_command: 'You used a command too fast! Please, join the server again and wait more before using any command.'
country_banned: '&4O teu país está prohibido neste servidor!'
not_owner_error: 'Non es o dono desta conta. Por favor, escolle outro nome!'
invalid_name_case: 'Deberías unirte usando o nome de usuario %valid, non %invalid.'
quick_command: 'Usaches un comando moi rápido! Por favor, úneste ao servidor de novo e agarda máis antes de usar calquera comando.'
# Email
email:
@@ -90,17 +92,16 @@ email:
old_email_invalid: '[AuthMe] O correo vello non é válido!'
invalid: '[AuthMe] Correo non válido'
added: '[AuthMe] Correo engadido!'
# TODO add_not_allowed: '&cAdding email was not allowed'
add_not_allowed: '&cEngadir o correo electrónico non estaba permitido.'
request_confirmation: '[AuthMe] Confirma o teu correo!'
changed: '[AuthMe] Cambiouse o correo!'
# TODO change_not_allowed: '&cChanging email was not allowed'
# TODO email_show: '&2Your current email address is: &f%email'
# TODO no_email_for_account: '&2You currently don''t have email address associated with this account.'
# TODO already_used: '&4The email address is already being used'
# TODO incomplete_settings: 'Error: not all required settings are set for sending emails. Please contact an admin.'
# TODO send_failure: 'The email could not be sent. Please contact an administrator.'
# TODO change_password_expired: 'You cannot change your password using this command anymore.'
# TODO email_cooldown_error: '&cAn email was already sent recently. You must wait %time before you can send a new one.'
email_show: '&2O teu enderezo de correo electrónico actual é: &f%email'
no_email_for_account: '&2Actualmente non tes ningún enderezo de correo electrónico asociado con esta conta.'
already_used: '&4O enderezo de correo electrónico xa está a ser usado'
incomplete_settings: 'Erro: non todos os axustes necesarios están configurados para enviar correos electrónicos. Por favor, contacta cun administrador.'
send_failure: 'O correo electrónico non puido ser enviado. Por favor, contacta cun administrador.'
change_password_expired: 'Non podes cambiar o teu contrasinal usando este comando máis.'
email_cooldown_error: '&cUn correo electrónico xa foi enviado recentemente. Debes agardar %time antes de poder enviar un novo.'
# Password recovery by email
recovery:
@@ -108,50 +109,64 @@ recovery:
command_usage: '&fUso: /email recovery <correo>'
email_sent: '[AuthMe] Enviouse o correo de confirmación!'
code:
# TODO code_sent: 'A recovery code to reset your password has been sent to your email.'
# TODO incorrect: 'The recovery code is not correct! You have %count tries remaining.'
# TODO tries_exceeded: 'You have exceeded the maximum number attempts to enter the recovery code. Use "/email recovery [email]" to generate a new one.'
# TODO correct: 'Recovery code entered correctly!'
# TODO change_password: 'Please use the command /email setpassword <new password> to change your password immediately.'
code_sent: 'Enviouse un código de recuperación para restablecer o teu contrasinal ao teu correo electrónico.'
incorrect: 'O código de recuperación non é correcto! Tes %count intentos restantes.'
tries_exceeded: 'Excedeches o número máximo de intentos para ingresar o código de recuperación. Usa "/email recovery [email]" para xerar un novo.'
correct: 'O código de recuperación foi ingresado correctamente!'
change_password: 'Usa o comando /email setpassword <novo contrasinal> para cambiar o teu contrasinal inmediatamente.'
# Captcha
captcha:
usage_captcha: '&cNecesitas escribir un captcha, por favor escribe: /captcha %captcha_code'
wrong_captcha: '&cCaptcha equivocado, por favor usa: /captcha %captcha_code'
valid_captcha: '&cO teu captcha é válido !'
# TODO captcha_for_registration: 'To register you have to solve a captcha first, please use the command: /captcha %captcha_code'
# TODO register_captcha_valid: '&2Valid captcha! You may now register with /register'
captcha_for_registration: 'Para rexistrarte debes resolver un captcha primeiro, por favor, usa o comando: /captcha %captcha_code'
register_captcha_valid: '&2Captcha válido! Agora podes rexistrarte con /register'
# Verification code
verification:
# TODO code_required: '&3This command is sensitive and requires an email verification! Check your inbox and follow the email''s instructions.'
# TODO command_usage: '&cUsage: /verification <code>'
# TODO incorrect_code: '&cIncorrect code, please type "/verification <code>" into the chat, using the code you received by email'
# TODO success: '&2Your identity has been verified! You can now execute all commands within the current session!'
# TODO already_verified: '&2You can already execute every sensitive command within the current session!'
# TODO code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
# TODO email_needed: '&3To verify your identity you need to link an email address with your account!!'
code_required: '&3Este comando é sensible e require unha verificación por correo electrónico! Comproba a túa bandeixa de entrada e segue as instrucións do correo electrónico.'
command_usage: '&cUso: /verification <código>'
incorrect_code: '&cCódigo incorrecto, por favor, escribe "/verification <código>" no chat, usando o código que recibiches por correo electrónico'
success: '&2A túa identidade foi verificada! Agora podes executar todos os comandos dentro da sesión actual!'
already_verified: '&2Xa podes executar todos os comandos sensibles dentro da sesión actual!'
code_expired: '&3O teu código caducou! Executa outro comando sensible para obter un novo código!'
email_needed: '&3Para verificar a túa identidade debes vincular un enderezo de correo electrónico á túa conta!!'
# Time units
time:
# TODO second: 'second'
# TODO seconds: 'seconds'
# TODO minute: 'minute'
# TODO minutes: 'minutes'
# TODO hour: 'hour'
# TODO hours: 'hours'
# TODO day: 'day'
# TODO days: 'days'
second: 'segundo'
seconds: 'segundos'
minute: 'minuto'
minutes: 'minutos'
hour: 'hora'
hours: 'horas'
day: 'día'
days: 'días'
# Two-factor authentication
two_factor:
# TODO code_created: '&2Your secret code is %code. You can scan it from here %url'
# TODO confirmation_required: 'Please confirm your code with /2fa confirm <code>'
# TODO code_required: 'Please submit your two-factor authentication code with /2fa code <code>'
# TODO already_enabled: 'Two-factor authentication is already enabled for your account!'
# TODO enable_error_no_code: 'No 2fa key has been generated for you or it has expired. Please run /2fa add'
# TODO enable_success: 'Successfully enabled two-factor authentication for your account'
# TODO enable_error_wrong_code: 'Wrong code or code has expired. Please run /2fa add'
# TODO not_enabled_error: 'Two-factor authentication is not enabled for your account. Run /2fa add'
# TODO removed_success: 'Successfully removed two-factor auth from your account'
# TODO invalid_code: 'Invalid code!'
code_created: '&2O teu código secreto é %code. Podes escanealo desde aquí %url'
confirmation_required: 'Por favor, confirma o teu código con /2fa confirm <código>'
code_required: 'Por favor, envía o teu código de autenticación en dous pasos con /2fa code <código>'
already_enabled: 'A autenticación en dous pasos xa está activada para a túa conta!'
enable_error_no_code: 'Non se xerou ningún clave 2fa para ti ou caducou. Por favor, executa /2fa add'
enable_success: 'Autenticación en dous pasos activada con éxito para a túa conta'
enable_error_wrong_code: 'Código incorrecto ou caducado. Por favor, executa /2fa add'
not_enabled_error: 'A autenticación en dous pasos non está activada para a túa conta. Executa /2fa add'
removed_success: 'Autenticación en dous pasos eliminada con éxito da túa conta'
invalid_code: 'Código incorrecto!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aInicio de sesión automático de Bedrock exitoso!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aEstá atrapado no portal durante o inicio de sesión.'
fix_underground: '&aEstá atrapado baixo terra durante o inicio de sesión.'
cannot_fix_underground: '&aEstá atrapado baixo terra durante o inicio de sesión, pero non podemos arranxalo.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cFoi desconectado debido a un inicio de sesión dobre.'
+17 -1
View File
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cA választott jelszó nem biztonságos, kérlek, válassz másikat...'
forbidden_characters: '&4A választott jelszó nem engedélyezett karaktereket tartalmaz. Engedélyezett karakterek: %valid_chars'
wrong_length: 'A jelszavad nem éri el a minimális hosszúságot!'
pwned_password: '&cA választott jelszavad nem biztonságos. Már %pwned_count alkalommal használták! Kérlek használj erős jelszót...'
# Login
login:
@@ -40,7 +41,7 @@ error:
max_registration: '&cElérted a maximálisan beregisztrálható karakterek számát. (%reg_count/%max_acc %reg_names)'
logged_in: '&cMár be vagy jelentkezve!'
kick_for_vip: '&3VIP játékos csatlakozott a szerverhez!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cHiba történt: feloldatlan játékos hosztnév!'
tempban_max_logins: '&cIdeiglenesen ki lettél tiltva, mert túl sok alkalommal rontottad el a jelszavad!'
# AntiBot
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cA felhasználód aktiválása még nem történt meg, ellenőrizd a megadott emailed!'
not_activated: '&cA fiók nincs aktiválva, kérlek regisztrálj és aktiváld azt mielőtt újra megpróbálkoznál.'
password_changed: '&cA jelszó sikeresen megváltoztatva!'
logout: '&cSikeresen kijelentkeztél!'
reload: 'Beállítások és az adatbázis újratöltve!'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Kétszámjegyű hitelesítés nincs engedélyezve a fiókodban. Futtasd a /2fa add'
removed_success: 'Sikeresen eltávolítottad a fiók két számjegyű hitelesítőjét'
invalid_code: 'Érvénytelen kód!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock automatikus bejelentkezés sikeres!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aBeragadtál a portálban a bejelentkezés közben.'
fix_underground: '&aBeragadtál a föld alatt a bejelentkezés közben.'
cannot_fix_underground: '&aBeragadtál a föld alatt a bejelentkezés közben, de nem tudjuk megjavítani.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cKét bejelentkezés miatt lecsatlakoztattak.'
+24 -9
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cKamu telah mendaftarkan username ini!'
register_request: '&3Silahkan mendaftar ke server menggunakan perintah "/register <password> <ulangiPassword>"'
command_usage: '&cPenggunaan: /register <password> <KonfirmasiPassword>'
reg_only: '&4Hanya pengguna terdaftar yang bisa bergabung! Silahkan kunjungi http://example.com untuk mendaftar!'
reg_only: '&4Hanya pengguna terdaftar yang bisa bergabung! Silahkan kunjungi https://example.com untuk mendaftar!'
success: '&2Register berhasil!'
kicked_admin_registered: 'Administrator sudah meregistrasi kamu; dimohon untuk login kembali'
@@ -40,7 +40,7 @@ error:
max_registration: '&Kamu telah mencapai batas maksimum pendaftaran di server ini!'
logged_in: '&cKamu telah login!'
kick_for_vip: '&3Player VIP mencoba masuk pada saat server sedang penuh!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&cTerjadi kesalahan: nama host pemain tidak dapat dipecahkan!'
tempban_max_logins: '&cKamu untuk sementara diblokir karena terlalu sering salah saat login.'
# AntiBot
@@ -57,6 +57,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cAkunmu belum diaktifkan, silahkan periksa email kamu!'
not_activated: '&cAkun belum diaktifkan, silakan daftar dan aktivasi sebelum mencoba lagi.'
password_changed: '&2Berhasil mengubah password!'
logout: '&2Berhasil logout!'
reload: '&2Konfigurasi dan database telah dimuat ulang!'
@@ -124,13 +125,13 @@ captcha:
# Verification code
verification:
# TODO code_required: '&3This command is sensitive and requires an email verification! Check your inbox and follow the email''s instructions.'
# TODO command_usage: '&cUsage: /verification <code>'
# TODO incorrect_code: '&cIncorrect code, please type "/verification <code>" into the chat, using the code you received by email'
# TODO success: '&2Your identity has been verified! You can now execute all commands within the current session!'
# TODO already_verified: '&2You can already execute every sensitive command within the current session!'
# TODO code_expired: '&3Your code has expired! Execute another sensitive command to get a new code!'
# TODO email_needed: '&3To verify your identity you need to link an email address with your account!!'
code_required: '&3Perintah ini sensitif dan memerlukan verifikasi email! Periksa kotak masuk Anda dan ikuti petunjuk email.'
command_usage: '&cPenggunaan: /verification <kode>'
incorrect_code: '&cKode salah, ketik "/verification <kode>" di chat, menggunakan kode yang Anda terima melalui email'
success: '&2Identitas Anda telah diverifikasi! Anda sekarang dapat menjalankan semua perintah dalam sesi saat ini!'
already_verified: '&2Anda sudah dapat menjalankan setiap perintah sensitif dalam sesi saat ini!'
code_expired: '&3Kode Anda telah kedaluwarsa! Jalankan perintah sensitif lain untuk mendapatkan kode baru!'
email_needed: '&3Untuk memverifikasi identitas Anda, Anda perlu menyambungkan alamat email dengan akun Anda!!'
# Time units
time:
@@ -155,3 +156,17 @@ two_factor:
not_enabled_error: 'Autentikasi dua langkah tidak diaktifkan untuk akunmu. Jalankan /2fa add'
removed_success: 'Sukses menghapus autentikasi dua langkah dari akunmu'
invalid_code: 'Kode tidak valid!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aLogin otomatis Bedrock berhasil!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aAnda terjebak di portal selama proses login.'
fix_underground: '&aAnda terjebak di bawah tanah selama proses login.'
cannot_fix_underground: '&aAnda terjebak di bawah tanah selama proses login, tetapi kami tidak dapat memperbaikinya.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cAnda telah terputus karena login ganda.'
+17 -1
View File
@@ -10,7 +10,7 @@ registration:
name_taken: '&cHai già eseguito la registrazione!'
register_request: '&3Per favore, esegui la registrazione con il comando: /register <password> <confermaPassword>'
command_usage: '&cUtilizzo: /register <password> <confermaPassword>'
reg_only: '&4Puoi giocare in questo server solo dopo aver eseguito la registrazione attraverso il sito web! Per favore, vai su http://esempio.it per procedere!'
reg_only: '&4Puoi giocare in questo server solo dopo aver eseguito la registrazione attraverso il sito web! Per favore, vai su https://esempio.it per procedere!'
success: '&2Registrato correttamente!'
kicked_admin_registered: 'Un amministratore ti ha appena registrato, per favore rientra nel server'
@@ -21,6 +21,7 @@ password:
unsafe_password: '&cLa password che hai inserito non è sicura, per favore scegline un''altra...'
forbidden_characters: '&4La tua password contiene caratteri non consentiti. I caratteri consentiti sono: %valid_chars'
wrong_length: '&cLa password che hai inserito è troppo corta o troppo lunga, per favore scegline un''altra...'
pwned_password: '&cLa password scelta non è sicura. È stata già utilizzata %pwned_count volte! Si prega di utilizzare una password sicura...'
# Login
login:
@@ -58,6 +59,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&cIl tuo account non è stato ancora verificato, controlla fra le tue email per scoprire come attivarlo!'
not_activated: '&cAccount non attivato, si prega di registrarsi e attivarlo prima di riprovare.'
password_changed: '&2Password cambiata correttamente!'
logout: '&2Disconnessione avvenuta correttamente!'
reload: '&2La configurazione e il database sono stati ricaricati correttamente!'
@@ -156,3 +158,17 @@ two_factor:
not_enabled_error: 'L''autenticazione a 2 fattori non è ancora abilitata per il tuo account. Scrivi: /2fa add'
removed_success: 'Autenticazione a 2 fattori rimossa correttamente'
invalid_code: 'Il codice inserito non è valido, riprova!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aAccesso automatico Bedrock riuscito!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aSei bloccato nel portale durante il login.'
fix_underground: '&aSei bloccato sottoterra durante il login.'
cannot_fix_underground: '&aSei bloccato sottoterra durante il login, ma non possiamo risolverlo.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cSei stato disconnesso a causa di un login doppio.'
+48 -31
View File
@@ -5,13 +5,13 @@
# Registration
registration:
register_request: '&3サーバーに登録するには、次のコマンドを使用してください: /register <パスワード> <パスワードの確認>'
command_usage: '&c使用方法: /register <パスワード> <パスワードの確認>'
reg_only: '&4登録済みのユーザーのみサーバーに参加できます! 自分自身を登録するには、http://example.com にアクセスしてください!'
kicked_admin_registered: '管理者があなたを登録しました。再度ログインしてください。'
success: '&2登録が完了しました!'
disabled: '&cゲーム内での登録は無効になっています!'
name_taken: '&cこのユーザー名はすでに登録されています!'
register_request: '&3サーバーに登録するには、次のコマンドを使用してください: /register <パスワード> <パスワードの確認>'
command_usage: '&c使用方法: /register <パスワード> <パスワードの確認>'
reg_only: '&4登録済みのユーザーのみサーバーに参加できます! 自分自身を登録するには、https://example.com にアクセスしてください!'
success: '&2登録が完了しました!'
kicked_admin_registered: '管理者があなたを登録しました。再度ログインしてください。'
# Password errors on registration
password:
@@ -20,6 +20,7 @@ password:
unsafe_password: '&c選択したパスワードは安全ではありません。別のパスワードを選択してください...'
forbidden_characters: '&4パスワードに不正な文字が含まれています。許可されている文字: %valid_chars'
wrong_length: '&cパスワードが短すぎるか長すぎます!別のパスワードを試してください!'
pwned_password: '&c選択されたパスワードは安全ではありません。すでに %pwned_count 回使用されています!強力なパスワードを使用してください...'
# Login
login:
@@ -31,17 +32,17 @@ login:
# Errors
error:
unregistered_user: '&cこのユーザーは登録されていません!'
denied_command: '&cこのコマンドを使用するには認証が必要です!'
denied_chat: '&cチャットするには認証が必要です!'
unregistered_user: '&cこのユーザーは登録されていません!'
not_logged_in: '&cログインしていません!'
tempban_max_logins: '&cログインに失敗した回数が多すぎるため、一時的にアクセスが制限されています。'
max_registration: '&c接続ごとの登録数が最大値を超えています(%reg_count/%max_acc %reg_names)!'
no_permission: '&4この操作を実行する権限がありません!'
unexpected_error: '&4予期しないエラーが発生しました。管理者に連絡してください!'
kick_for_vip: '&3VIPプレイヤーがサーバーが満員の状態で参加しました'
max_registration: '&c接続ごとの登録数が最大値を超えています(%reg_count/%max_acc %reg_names'
logged_in: '&cすでにログイン済みです!'
kick_for_vip: '&3VIPプレイヤーがサーバーが満員の状態で参加しました!'
kick_unresolved_hostname: '&cエラーが発生しました:解決できないプレイヤーのホスト名!'
tempban_max_logins: '&cログインに失敗した回数が多すぎるため、一時的にアクセスが制限されています。'
# AntiBot
antibot:
@@ -49,57 +50,59 @@ antibot:
auto_enabled: '&4[AntiBotService] 接続数が非常に多いため、AntiBotが有効になりました!'
auto_disabled: '&2[AntiBotService] %m 分後にAntiBotが無効になりました!'
# Unregister
unregister:
success: '&c登録が正常に解除されました!'
command_usage: '&c使用方法: /unregister <パスワード>'
# Other messages
misc:
accounts_owned_self: '所持しているアカウント数:%count 個'
accounts_owned_other: 'プレイヤー %name のアカウント数:%count 個'
account_not_activated: '&cアカウントはまだ有効化されていません。メールを確認してください!'
not_activated: '&cアカウントは有効化されていません。再試行する前に登録してアクティブ化してください。'
password_changed: '&2パスワードが正常に変更されました!'
logout: '&2正常にログアウトしました!'
reload: '&2設定とデータベースが正常に再読み込みされました!'
usage_change_password: '&c使用方法: /changepassword <旧パスワード> <新パスワード>'
accounts_owned_self: '所持しているアカウント数:%count 個'
accounts_owned_other: 'プレイヤー %name のアカウント数:%count 個'
# Session messages
session:
invalid_session: '&cIPアドレスが変更され、セッションのデータが期限切れです!'
valid_session: '&2セッションの再接続によるログインです。'
invalid_session: '&cIPアドレスが変更され、セッションのデータが期限切れです!'
# Error messages when joining
on_join_validation:
same_ip_online: '同じIPアドレスを持つプレイヤーが既にゲーム内にいます!'
same_nick_online: '&4同じユーザー名のプレイヤーが既にサーバーでプレイしています!'
name_length: '&4ユーザー名が短すぎるか長すぎます!'
characters_in_name: '&4ユーザー名に無効な文字が含まれています。許可される文字:%valid_chars'
kick_full_server: '&4サーバーが満員です。後でもう一度お試しください!'
country_banned: '&4このサーバーへのアクセスは、お使いの国から制限されています!'
not_owner_error: 'このアカウントの所有者ではありません。別の名前を選択してください!'
kick_full_server: '&4サーバーが満員です。後でもう一度お試しください!'
same_nick_online: '&4同じユーザー名のプレイヤーが既にサーバーでプレイしています!'
invalid_name_case: '正しいユーザー名は %valid です。%invalid ではなく、このユーザー名で参加してください。'
same_ip_online: '同じIPアドレスを持つプレイヤーが既にゲーム内にいます!'
quick_command: 'コマンドを速すぎる速度で使用しました!もう一度サーバーに参加してから、コマンドを使用する前にしばらくお待ちください。'
# Email
email:
add_email_request: '&3コマンド「/email add <あなたのメールアドレス> <確認用メールアドレス>」を使用して、アカウントにメールアドレスを追加してください。'
usage_email_add: '&c使用方法:/email add <メールアドレス> <メールアドレスの確認>'
usage_email_change: '&c使用方法:/email change <古いメールアドレス> <新しいメールアドレス>'
new_email_invalid: '&c無効な新しいメールアドレスです。もう一度やり直してください!'
old_email_invalid: '&c無効な古いメールアドレスです。もう一度やり直してください!'
invalid: '&c無効なメールアドレスです。もう一度やり直してください!'
added: '&2メールアドレスがアカウントに正常に追加されました!'
add_not_allowed: '&cメールアドレスの追加は許可されていません。'
request_confirmation: '&cメールアドレスを確認してください!'
changed: '&2メールアドレスが正しく変更されました!'
change_not_allowed: '&cメールアドレスの変更は許可されていません。'
email_show: '&2現在のメールアドレスは:%email'
incomplete_settings: 'エラー:メールの送信に必要なすべての設定が設定されていません。管理者に連絡してください。'
already_used: '&4そのメールアドレスは既に使用されています'
send_failure: 'メールを送信できませんでした。管理者に連絡してください。'
no_email_for_account: '&2現在、このアカウントに関連付けられたメールアドレスはありません。'
add_email_request: '&3コマンド「/email add <あなたのメールアドレス> <確認用メールアドレス>」を使用して、アカウントにメールアドレスを追加してください。'
already_used: '&4そのメールアドレスは既に使用されています'
incomplete_settings: 'エラー:メールの送信に必要なすべての設定が設定されていません。管理者に連絡してください。'
send_failure: 'メールを送信できませんでした。管理者に連絡してください。'
change_password_expired: 'このコマンドを使用してパスワードを変更することはできません。'
email_cooldown_error: '&c最近すでにメールが送信されています。新しいメールを送信する前に、%time 待つ必要があります。'
add_not_allowed: '&cメールアドレスの追加は許可されていません。'
change_not_allowed: '&cメールアドレスの変更は許可されていません。'
# Password recovery by email
recovery:
@@ -131,6 +134,17 @@ verification:
code_expired: '&3コードの有効期限が切れています!新しいコードを取得するには、別のセンシティブなコマンドを実行してください!'
email_needed: '&3アカウントにはメールアドレスのリンクが必要です。身元を確認するためにはメールアドレスを関連付けてください!'
# Time units
time:
second: '秒'
seconds: '秒'
minute: '分'
minutes: '分'
hour: '時間'
hours: '時間'
day: '日'
days: '日'
# Two-factor authentication
two_factor:
code_created: '&2秘密コードは %code です。こちらからスキャンできます:%url'
@@ -144,13 +158,16 @@ two_factor:
removed_success: 'アカウントから二要素認証が正常に削除されました'
invalid_code: '無効なコードです!'
# Time units
time:
second: ''
seconds: '秒'
minute: '分'
minutes: '分'
hour: '時間'
hours: '時間'
day: ''
days: '日'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock 自動ログイン成功!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aログイン中にポータルに閉じ込められました。'
fix_underground: '&aログイン中に地下に閉じ込められました。'
cannot_fix_underground: '&aログイン中に地下に閉じ込められましたが、修正できません。'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&c二重ログインのため、切断されました。'
+17 -1
View File
@@ -22,6 +22,7 @@ password:
unsafe_password: '&c이 비밀번호는 안전하지 않습니다, 다른 비밀번호를 사용하세요...'
forbidden_characters: '&4비밀번호에 잘못된 문자가 있습니다. 허용된 문자: %valid_chars'
wrong_length: '&c비밀번호가 너무 짧거나 너무 깁니다!'
pwned_password: '&c선택한 비밀번호가 안전하지 않습니다. 이미 %pwned_count 번 사용되었습니다! 강력한 비밀번호를 사용하세요...'
# Login
login:
@@ -42,7 +43,7 @@ error:
max_registration: '&c당신은 가입할 수 있는 계정 한도를 초과했습니다 (%reg_count/%max_acc %reg_names)!'
logged_in: '&c이미 로그인되어 있습니다!'
kick_for_vip: '&3서버가 꽉 차있을 때는 VIP 플레이어만 접속이 가능합니다!'
# TODO kick_unresolved_hostname: '&cAn error occurred: unresolved player hostname!'
kick_unresolved_hostname: '&c오류 발생: 확인되지 않은 플레이어 호스트 이름!'
tempban_max_logins: '&c너무 많이 로그인에 실패하여 잠시 서버에서 차단되었습니다.'
# AntiBot
@@ -59,6 +60,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&c계정이 아직 활성화되지 않았습니다. 이메일을 확인해보세요!'
not_activated: '&c계정이 활성화되지 않았습니다. 다시 시도하기 전에 등록하고 활성화하세요.'
password_changed: '&2비밀번호가 변경되었습니다!'
logout: '&2로그아웃 되었습니다!'
reload: '&2설정과 데이터 베이스가 새로고침 되었습니다!'
@@ -157,3 +159,17 @@ two_factor:
not_enabled_error: '2단계 인증 기능을 활성화하시지 않았습니다. /2fa add 명령어를 통해 활성화해주세요.'
removed_success: '2단계 인증 기능을 성공적으로 비활성화하였습니다.'
invalid_code: '올바르지 않은 인증 코드입니다!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock 자동 로그인 성공!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&a로그인 중에 포탈에 갇혔습니다.'
fix_underground: '&a로그인 중에 지하에 갇혔습니다.'
cannot_fix_underground: '&a로그인 중에 지하에 갇혔지만, 수정할 수 없습니다.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&c중복 로그인으로 인해 연결이 종료되었습니다.'
+17 -1
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cVartotojo vardas jau užregistruotas'
register_request: '&ePrašome prisiregistruoti: /register slaptažodis pakartotiSlaptažodį'
command_usage: '&eNaudojimas: /register slaptažodis pakartotiSlaptažodį'
reg_only: '&cTik prisiregistravusiems žaidėjams: apsilankykite: http://example.com tam, kad užsiregistruoti.'
reg_only: '&cTik prisiregistravusiems žaidėjams: apsilankykite: https://example.com tam, kad užsiregistruoti.'
success: '&aSėkmingai prisiregistravote.'
kicked_admin_registered: 'Administatorius Jus užregistravo. Prisijunkite iš naujo'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cŠį Slaptažodį lengva nulaužti, pasirinkite kitą slaptažodį'
forbidden_characters: '&4Jūsų slaptažodis turi netinkamų simbolių. Leidžiami simboliai: %valid_chars'
wrong_length: '&cJūsų pasirinktas slaptažodis per ilgas arba per trumpas.'
pwned_password: '&cJūsų pasirinktas slaptažodis nėra saugus. Jis buvo naudotas %pwned_count kartų! Prašome naudoti stiprų slaptažodį...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&aJūsų vartotojas nėra patvirtintas, pasitikrinkite el.paštą.'
not_activated: '&cPaskyra neaktyvuota, prašome užsiregistruoti ir aktyvuoti prieš bandant dar kartą.'
password_changed: '&aSlaptažodis pakeistas'
logout: '&aSėkmingai atsijungėte'
reload: '&aNustatymai ir duomenų bazė buvo perkrauta.'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Dviejų faktorių autentifikavimas nėra įjungtas ant jūsų paskyros. Rašykite /2fa add'
removed_success: 'Dviejų faktorių autentifikavimas sėkmingai pašalintas iš jūsų paskyros.'
invalid_code: 'Neteisingas kodas!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock automatinis prisijungimas sėkmingas!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aJūs užstrigote portale prisijungimo metu.'
fix_underground: '&aJūs užstrigote po žeme prisijungimo metu.'
cannot_fix_underground: '&aJūs užstrigote po žeme prisijungimo metu, bet mes negalime to pataisyti.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cJūs buvote atjungtas dėl dvigubo prisijungimo.'
+17 -1
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cJe hebt deze gebruikersnaam al geregistreerd!'
register_request: '&cRegistreer met het commando: /register <wachtwoord> <herhaal wachtwoord>'
command_usage: '&cGebruik: /register <wachtwoord> <herhaal wachtwoord>'
reg_only: 'Alleen voor geregistreerde spelers! Bezoek http://example.com om te registreren!'
reg_only: 'Alleen voor geregistreerde spelers! Bezoek https://example.com om te registreren!'
success: '&cSuccesvol geregistreerd!'
kicked_admin_registered: 'Een administrator heeft je net geregistreerd; log alsjeblieft opnieuw in.'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&fDit wachtwoord is onveilig, kies een ander wachtwoord...'
forbidden_characters: '&cJouw wachtwoord bevat ongeldige tekens. Toegestane karakters zijn: %valid_chars'
wrong_length: 'Jouw gekozen wachtwoord voldoet niet aan de minimum of maximum lengte, kies een ander wachtwoord...'
pwned_password: '&cHet gekozen wachtwoord is niet veilig. Het is al %pwned_count keer gebruikt! Gebruik alstublieft een sterk wachtwoord...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: 'Je account is nog niet geactiveerd, controleer je mailbox!'
not_activated: '&cAccount niet geactiveerd, registreer en activeer het alstublieft voordat u het opnieuw probeert.'
password_changed: '&cWachtwoord succesvol aangepast!'
logout: '&2Je bent succesvol uitgelogd!'
reload: '&2De configuratie en database zijn succesvol herladen!'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Twee-factor authenticatie is uitgeschakeld voor jou account. Voer "/2fa add" uit'
removed_success: 'Twee-factor authenticatie is met succes van jouw account verwijderd.'
invalid_code: 'Ongeldige code!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aBedrock automatisch inloggen gelukt!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aU zit vast in een portal tijdens het inloggen.'
fix_underground: '&aU zit vast onder de grond tijdens het inloggen.'
cannot_fix_underground: '&aU zit vast onder de grond tijdens het inloggen, maar we kunnen het niet repareren.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cU bent losgekoppeld vanwege een dubbele inlog.'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cTwoje hasło nie jest bezpieczne, wybierz inne...'
forbidden_characters: '&4W twoim haśle występują niedozwolone znaki, dozwolone znaki to: %valid_chars'
wrong_length: '&fTwoje hasło jest za krótkie lub za długie! Spróbuj ponownie...'
pwned_password: '&cTwoje wybrane hasło nie jest bezpieczne. Zostało już użyte %pwned_count razy! Proszę użyj silnego hasła...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&fTwoje konto nie zostało aktywowane! Sprawdź maila.'
not_activated: '&cKonto nieaktywowane, proszę zarejestruj się i aktywuj konto przed ponowną próbą.'
password_changed: '&fHasło zostało zmienione!'
logout: '&cPomyślnie wylogowany'
reload: '&fKonfiguracja bazy danych została przeładowana.'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Weryfikacja dwuetapowa nie jest włączona dla twojego konta. Wpisz komende /2fa add'
removed_success: '&aPomyślnie usunięto weryfikacje dwuetapową z Twojego konta.'
invalid_code: '&cWpisany kod jest nieprawidłowy, spróbuj jeszcze raz.'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aAutomatyczne logowanie na Bedrocku udane!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aUtknąłeś w portalu podczas logowania.'
fix_underground: '&aUtknąłeś pod ziemią podczas logowania.'
cannot_fix_underground: '&aUtknąłeś pod ziemią podczas logowania, ale nie możemy tego naprawić.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cZostałeś rozłączony z powodu podwójnego logowania.'
+17 -1
View File
@@ -9,7 +9,7 @@ registration:
name_taken: '&cUtilizador já registado'
register_request: '&cPor favor registe-se com "/register <password> <confirmePassword>"'
command_usage: '&cUse: /register <password> <confirmePassword>'
reg_only: '&fApenas jogadores registados podem entrar no servidor! Visite http://example.com para se registar'
reg_only: '&fApenas jogadores registados podem entrar no servidor! Visite https://example.com para se registar'
success: '&cRegistado com sucesso!'
kicked_admin_registered: 'Um administrador registou-te, por favor entre novamente'
@@ -20,6 +20,7 @@ password:
unsafe_password: '&cA senha escolhida não é segura, por favor, escolha outra ...'
forbidden_characters: '&4Sua senha contém caracteres ilegais. Caracteres permitidos: %valid_chars'
wrong_length: '&fPassword demasiado curta ou longa! Por favor escolhe outra outra!'
pwned_password: '&cA senha escolhida não é segura. Ela foi usada %pwned_count vezes! Por favor, use uma senha forte...'
# Login
login:
@@ -57,6 +58,7 @@ unregister:
# Other messages
misc:
account_not_activated: '&fA sua conta não foi ainda activada, verifique o seu email onde irá receber indicações para activação de conta. '
not_activated: '&cConta não ativada, por favor, registre-se e ative antes de tentar novamente.'
password_changed: '&cPassword alterada!'
logout: '&cSaida com sucesso'
reload: '&fConfiguração e base de dados foram recarregadas'
@@ -155,3 +157,17 @@ two_factor:
not_enabled_error: 'Autenticação de duas etapas não está habilitada na sua conta. Digite /2fa add'
removed_success: 'Autenticação de duas etapas removida com sucesso da sua conta'
invalid_code: 'Codigo invalido!'
# 3rd party features: Bedrock Auto Login
bedrock_auto_login:
success: '&aLogin automático no Bedrock bem-sucedido!'
# 3rd party features: Login Location Fix
login_location_fix:
fix_portal: '&aVocê está preso no portal durante o login.'
fix_underground: '&aVocê está preso no subsolo durante o login.'
cannot_fix_underground: '&aVocê está preso no subsolo durante o login, mas não podemos consertar.'
# 3rd party features: Double Login Fix
double_login_fix:
fix_message: '&cVocê foi desconectado devido a um login duplicado.'

Some files were not shown because too many files have changed in this diff Show More