├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── pull_request_template.md └── workflows │ └── dart.yml ├── .gitignore ├── .metadata ├── .phraseapp.yml ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── CREDITS.md ├── LICENSE ├── Privacy_Policy.md ├── README.md ├── SECURITY.md ├── android ├── app │ ├── build.gradle │ ├── google-services.json │ ├── key.jks │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ ├── io │ │ │ │ └── flutter │ │ │ │ │ └── plugins │ │ │ │ │ └── GeneratedPluginRegistrant.java │ │ │ └── nl │ │ │ │ └── rubentalstra │ │ │ │ └── pterodactyl_app │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable │ │ │ ├── ic_launcher.png │ │ │ ├── launch_background.xml │ │ │ ├── pterodactyl.png │ │ │ └── pterodactyl_text.png │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── key.properties ├── keystore_name.keystore ├── local.properties ├── pterodactyl_app_android.iml └── settings.gradle ├── assets ├── fonts │ ├── Cairo-Black.ttf │ ├── Cairo-Bold.ttf │ ├── Cairo-ExtraLight.ttf │ ├── Cairo-Light.ttf │ ├── Cairo-Regular.ttf │ ├── Cairo-SemiBold.ttf │ └── OFL.txt ├── ic_forward.png ├── images │ ├── 03736E05-CF2B-49F5-8CC0-910CAF4CA528.jpeg │ ├── discord2.png │ ├── minicenter_logo.png │ ├── pterodactyl_icon.png │ └── pterodactylapp_BG.png └── lang │ ├── ar-AE.json │ ├── ar-SA.json │ ├── da-DK.json │ ├── de-DE.json │ ├── en-GB.json │ ├── en-US.json │ ├── es-ES.json │ ├── fi-FI.json │ ├── fr-FR.json │ ├── fy.json │ ├── he-IL.json │ ├── id-ID.json │ ├── it-IT.json │ ├── nl-BE.json │ ├── nl-NL.json │ ├── nn-NO.json │ ├── pl-PL.json │ ├── pt-PT.json │ ├── ru-RU.json │ ├── sl-SI.json │ ├── sv-SE.json │ ├── zh-CN.json │ └── zh-TW.json ├── custom_version_request_partners.md ├── ios ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── GoogleService-Info.plist ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── GeneratedPluginRegistrant.h │ ├── GeneratedPluginRegistrant.m │ ├── GoogleService-Info.plist │ ├── Info.plist │ ├── Runner-Bridging-Header.h │ └── main.m ├── lib ├── about.dart ├── main.dart ├── models │ ├── globals.dart │ ├── server.dart │ ├── settings.dart │ └── stats.dart ├── page │ ├── admin │ │ ├── adminactionnodes.dart │ │ ├── adminactionserver.dart │ │ ├── adminallocations.dart │ │ ├── admincreateallocation.dart │ │ ├── admincreateserver.dart │ │ ├── admincreateuser.dart │ │ ├── admineditserver.dart │ │ ├── adminhome.dart │ │ ├── adminlogin.dart │ │ ├── adminnodes.dart │ │ ├── adminserverinfo.dart │ │ ├── adminservers.dart │ │ ├── adminsettings.dart │ │ ├── adminuserinfo.dart │ │ ├── adminusers.dart │ │ └── create_server │ │ │ ├── admincreateserver.dart │ │ │ ├── admincreateserverallocations.dart │ │ │ ├── admincreateserveregg.dart │ │ │ ├── admincreateserverlimit.dart │ │ │ ├── admincreateserverlocations.dart │ │ │ ├── admincreateservernest.dart │ │ │ ├── admincreateservernodes.dart │ │ │ └── admincreateserversend.dart │ ├── auth │ │ ├── 2fa.dart │ │ ├── auth.dart │ │ ├── check_update.dart │ │ ├── partnerlist.dart │ │ ├── selecthost.dart │ │ ├── shared_preferences_helper.dart │ │ └── sponsorlist.dart │ ├── client │ │ ├── actionserver.dart │ │ ├── console.dart │ │ ├── filemanager │ │ │ ├── fileactions.dart │ │ │ ├── filemanager.dart │ │ │ ├── fileviewer.dart │ │ │ ├── texteditor.dart │ │ │ └── widgets │ │ │ │ ├── CustomTooltip.dart │ │ │ │ ├── ErrorSnackbar.dart │ │ │ │ ├── ReusableDialog.dart │ │ │ │ ├── SyntaxHighlighter.dart │ │ │ │ ├── createdialog.dart │ │ │ │ ├── extras.dart │ │ │ │ └── readTimestamp.dart │ │ ├── home.dart │ │ ├── home │ │ │ ├── circular_image.dart │ │ │ ├── menu_page.dart │ │ │ └── zoom_scaffold.dart │ │ ├── home_backup.dart │ │ ├── login.dart │ │ ├── login_with_username.dart │ │ ├── servers_backup.dart │ │ ├── settings.dart │ │ ├── settings │ │ │ └── circular_image.dart │ │ └── utilization.dart │ └── company │ │ ├── accuratenode │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── login.dart │ │ │ ├── servers.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ ├── coderslight │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── login.dart │ │ │ ├── servers.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ ├── companies.dart │ │ ├── deploys │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── home │ │ │ ├── circular_image.dart │ │ │ ├── menu_page.dart │ │ │ └── zoom_scaffold.dart │ │ │ ├── login.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ ├── minicenter │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── login.dart │ │ │ ├── servers.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ ├── planetnode │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── login.dart │ │ │ ├── servers.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ ├── revivenode │ │ └── client │ │ │ ├── about.dart │ │ │ ├── actionserver.dart │ │ │ ├── console.dart │ │ │ ├── home.dart │ │ │ ├── login.dart │ │ │ ├── servers.dart │ │ │ ├── settings.dart │ │ │ └── utilization.dart │ │ └── royalehosting │ │ └── client │ │ ├── about.dart │ │ ├── actionserver.dart │ │ ├── console.dart │ │ ├── home.dart │ │ ├── login.dart │ │ ├── servers.dart │ │ ├── settings.dart │ │ └── utilization.dart ├── partner.dart ├── sponsor.dart └── widgets │ └── tooltip │ └── tooltip.dart ├── partners.json ├── pubspec.lock ├── pubspec.yaml └── test └── app_test.dart /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [] 4 | patreon: Pterodactyl_app 5 | ko_fi: pterodactylapp 6 | custom: https://paypal.me/RDTalstra 7 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | 27 | **Smartphone (please complete the following information):** 28 | - Device: [e.g. iPhone6] 29 | - iOS Version: [e.g. iOS8.1] 30 | - Android Version [e.g. 22] 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Hello, please describe what you added in your PR under this line, thanks ! :D 2 | 3 | ----------------------------------------------------------------------------- 4 | -------------------------------------------------------------------------------- /.github/workflows/dart.yml: -------------------------------------------------------------------------------- 1 | name: Dart CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | name: install dependencies 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v1 11 | 12 | - name: install dependencies 13 | uses: steebchen/flutter@v1.0.0 14 | with: 15 | args: pub get 16 | 17 | - name: run tests 18 | uses: steebchen/flutter@v1.0.0 19 | with: 20 | args: test 21 | 22 | - name: build apk 23 | uses: steebchen/flutter@v1.0.0 24 | with: 25 | args: build apk --release 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | pubspec.lock 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # Visual Studio Code related 20 | .vscode/ 21 | 22 | # Flutter/Dart/Pub related 23 | **/doc/api/ 24 | .dart_tool/ 25 | .flutter-plugins 26 | .packages 27 | .pub-cache/ 28 | .pub/ 29 | /build/ 30 | 31 | # Android related 32 | **/android/**/gradle-wrapper.jar 33 | **/android/.gradle 34 | **/android/captures/ 35 | **/android/gradlew 36 | **/android/gradlew.bat 37 | **/android/local.properties 38 | **/android/**/GeneratedPluginRegistrant.java 39 | 40 | # iOS/XCode related 41 | **/ios/**/*.mode1v3 42 | **/ios/**/*.mode2v3 43 | **/ios/**/*.moved-aside 44 | **/ios/**/*.pbxuser 45 | **/ios/**/*.perspectivev3 46 | **/ios/**/*sync/ 47 | **/ios/**/.sconsign.dblite 48 | **/ios/**/.tags* 49 | **/ios/**/.vagrant/ 50 | **/ios/**/DerivedData/ 51 | **/ios/**/Icon? 52 | **/ios/**/Pods/ 53 | **/ios/**/.symlinks/ 54 | **/ios/**/profile 55 | **/ios/**/xcuserdata 56 | **/ios/.generated/ 57 | **/ios/Flutter/App.framework 58 | **/ios/Flutter/Flutter.framework 59 | **/ios/Flutter/Generated.xcconfig 60 | **/ios/Flutter/app.flx 61 | **/ios/Flutter/app.zip 62 | **/ios/Flutter/flutter_assets/ 63 | **/ios/ServiceDefinitions.json 64 | **/ios/Runner/GeneratedPluginRegistrant.* 65 | 66 | # Exceptions to above rules. 67 | !**/ios/**/default.mode1v3 68 | !**/ios/**/default.mode2v3 69 | !**/ios/**/default.pbxuser 70 | !**/ios/**/default.perspectivev3 71 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 72 | 73 | android/local.properties 74 | android/gradlew 75 | ios/Podfile.lock 76 | ios/Flutter/Generated.xcconfig 77 | ios/Runner.xcodeproj/project.pbxproj 78 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 8661d8aecd626f7f57ccbcb735553edc05a2e713 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.phraseapp.yml: -------------------------------------------------------------------------------- 1 | phraseapp: 2 | project_id: 537f5e1123508656dd1ab7d4ab83940e 3 | file_format: simple_json 4 | 5 | push: 6 | sources: 7 | - file: ./assets/lang/.json 8 | pull: 9 | targets: 10 | - file: ./assets/lang/.json 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - linux 3 | sudo: false 4 | addons: 5 | apt: 6 | # Flutter depends on /usr/lib/x86_64-linux-gnu/libstdc++.so.6 version GLIBCXX_3.4.18 7 | sources: 8 | - ubuntu-toolchain-r-test # if we don't specify this, the libstdc++6 we get is the wrong version 9 | packages: 10 | - libstdc++6 11 | - fonts-droid-fallback 12 | before_script: 13 | - git clone https://github.com/flutter/flutter.git -b beta 14 | - ./flutter/bin/flutter doctor 15 | script: 16 | - ./flutter/bin/flutter test 17 | cache: 18 | directories: 19 | - $HOME/.pub-cache 20 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at RubenTalstra1211@outlook.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | ## CREDITS 2 | 3 | 4 | For all the people who worked with me on this amazing project. 5 | 6 | #### PARTNERED HOST: 7 | 8 | > - [Deploys.io](https://deploys.io/) 9 | 10 | > - [CodersLight LLC](https://coderslight.com/) 11 | 12 | > - [AccurateNode](https://accuratenode.com/) 13 | 14 | > - [MiniCenter](https://minicenter.net/) 15 | 16 | > - [PlanetNode](https://planetnode.net/) 17 | 18 | > - [ReviveNode Hosting](https://revivenode.com/) 19 | 20 | > - [RoyaleHosting](http://royalehosting.nl/) 21 | 22 | ###### Donators: 23 | 24 | > - Android play store console `@/var/www/Jordy ツ#0049` 25 | 26 | > - Apple developer license team `@Numaad M. | Thunderbolt.Host#0001` [Thunderbolt hosting](https://thunderbolt-hosting.com/) 27 | 28 | > - $25.00 CAD `@ThatProgrammer#6001` [CodersLight LLC](https://coderslight.com/) 29 | 30 | > - $21.53 CAD `@Nyx#8228` [MiniCenter](https://minicenter.net/) 31 | 32 | > - Webhosting `@CodeCo#3866` [Deploys.io](https://deploys.io/share/104?utm_source=ruben-app&utm_medium=sponsors&utm_campaign=list/) 33 | 34 | > - $20.00 CAD `@Diamond#0010` [Revivenode Hosting]() (Monthly) 35 | 36 | > - $15.00 CAD `@mspnick#0607` [MyServerPlanet](https://myserverplanet.com/) 37 | 38 | > - $10.00 USD `@Gebrito#1699` 39 | 40 | > - €8,00 EURO `@kloncs#1337` [samjw.xyz](https://samjw.xyz/) 41 | 42 | > - £3.00 GBP `@ItzAwesome#0001` [FalixNodes](https://falixnodes.host/) 43 | 44 | > - €5,00 EURO `@Perhaps.#8928` [AccurateNode](https://accuratenode.com/) 45 | 46 | > - €5,00 EURO `@Jules [skoali.fr]#6511` [Skoali](https://skoali.fr/) 47 | 48 | > - $2,00 CAD `@TheFlash787#2898` (Monthly) 49 | 50 | > - $0.50 CAD `@Kiffey14#2010` 51 | 52 | 53 | ###### Translators: 54 | 55 | > - French Language: `⚡ ZeProf2Coding#4274` and `@Jules [skoali.fr]#6511 ` 56 | 57 | > - Danish Language: `@Noah 101#0001` 58 | 59 | > - German Language: `@Jan#6705` 60 | 61 | > - Norwegian language: `@Bendik0208#5557` 62 | 63 | > - Dutch language: `@Lucas_#6183`, `@/home/Jesse ツ | I USE DEL BUTTON#5885` and `@/var/www/Jordy ツ#0049` 64 | 65 | > - Italian language: `@????#????` 66 | 67 | > - Swedish language: `@MrKaKisen#8523` 68 | 69 | > - Polish language: `@riko.dev#9357` 70 | 71 | > - Chinese Simplified `@gzzchh#0998` 72 | 73 | > - Chinese Traditional `@StarBurstNetork#2291` 74 | 75 | > - Slovenian language: `@Perhaps.#8928` 76 | 77 | > - Spanish language: `@PabloGirolGamer#3944` 78 | 79 | > - Hebrew language: `@Drdy#4403` 80 | 81 | > - Arabic language: `@♥7ɑωɑяı_Đε√♥#9447` 82 | 83 | 84 | 85 | ###### Beta Testers: 86 | 87 | > - `@ThatProgrammer#6001` 88 | 89 | > - `@Griffindor#7378 ` 90 | 91 | > - `⚡ ZeProf2Coding#4274` 92 | 93 | 94 | ###### Flutter Coders: 95 | 96 | > - `@appomatrix#9639` 97 | > - `@Yvan#9877` 98 | > - `@W - J#0129` 99 | > - `@Wiz⚡#1265` 100 | 101 | 102 | ###### Module (addon) Coders: 103 | 104 | > - `@Yvan#9877` 105 | > - `@patricknasci#9500` 106 | 107 | 108 | ###### Contributors: 109 | 110 | > - Helped ruben at the beginning of the app `⚡ ZeProf2Coding#4274` 111 | > - Improve (markdown) files `@/var/www/Jordy ツ#0049` 112 | > - Creating the old logo `@ThatProgrammer#6001` 113 | > - Creater of the new logo `@Emerald#1101` 114 | -------------------------------------------------------------------------------- /Privacy_Policy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | Ruben Talstra built the Pterodactyl app app as an free and Open Source app. This SERVICE is provided by Ruben Talstra at no cost and is intended for use as is. 4 | 5 | This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. 6 | 7 | If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. 8 | 9 | The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Pterodactyl app unless otherwise defined in this Privacy Policy. 10 | 11 | ## Information Collection and Use 12 | 13 | For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way. 14 | 15 | The app does use third party services that may collect information used to identify you. 16 | 17 | Link to privacy policy of third party service providers used by the app 18 | - [Google Play Services](https://www.google.com/policies/privacy/) 19 | - [Firebase Analytics](https://firebase.google.com/policies/analytics) 20 | 21 | ## Log Data 22 | 23 | I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. 24 | 25 | ## Cookies 26 | 27 | Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory. 28 | 29 | This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. 30 | 31 | ## Service Providers 32 | 33 | I may employ third-party companies and individuals due to the following reasons: 34 | - To facilitate our Service; 35 | - To provide the Service on our behalf; 36 | - To perform Service-related services; or 37 | - To assist us in analyzing how our Service is used. 38 | 39 | I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. 40 | 41 | ## Security 42 | 43 | I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. 44 | 45 | ## Links to Other Sites 46 | 47 | This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. 48 | 49 | ## Children’s Privacy 50 | 51 | These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions. 52 | 53 | ## Changes to This Privacy Policy 54 | 55 | I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page. 56 | 57 | ## Contact Us 58 | 59 | If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at [RubenTalstra1211@gmail.com](mailto:RubenTalstra1211@gmail.com?subject=Question%20). 60 | 61 | 62 | *This privacy policy page was created at privacypolicytemplate.net and modified/generated by App Privacy Policy Generator* 63 | 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pterodactyl Mobile App 🚀 2 | 3 | ![GitHub repo size](https://img.shields.io/github/repo-size/pterodactyl-app/Pterodactyl-app?style=flat-square) 4 | [![Build status](https://img.shields.io/travis/pterodactyl-app/Pterodactyl-app/develop.svg?style=flat-square)](https://travis-ci.org/pterodactyl-app/Pterodactyl-app) 5 | ![GitHub](https://img.shields.io/github/license/pterodactyl-app/Pterodactyl-app?style=flat-square) 6 | [![Open Source Love](https://img.shields.io/badge/opensource-we--love--open--source-34495e?style=flat-square)](https://opensource.org/licenses/gpl-3.0) 7 | [![Donate](https://img.shields.io/badge/Donate-PayPal-009cde.svg?style=flat-square)](https://www.paypal.me/RDTalstra) 8 | Patreon donate button 9 | [![PhraseApp](https://img.shields.io/badge/Translate-PhraseApp-blue?style=flat-square)](https://pterodactyl-app.com/phraseapp.php) 10 | ![GitHub stars](https://img.shields.io/github/stars/pterodactyl-app/Pterodactyl-app?style=social) 11 | 12 | A unofficial mobile app for the Pterodactyl Panel 13 | 14 | 15 | ### Features : 16 | Client panel 17 | - Start, stop, restart or kill your server 18 | - Send commands to your server 19 | - See the CPU, memory and disk stats that you are using 20 | - See your Console logs. 21 | - Select your host. 22 | 23 | Admin panel 24 | - Look at your servers 25 | - Rebuild/reinstall/suspend/unsuspend your servers 26 | - View your user list and create a user 27 | - View your node 28 | - Add a allocation to your node 29 | - View all the allocations in your nodes 30 | 31 | 32 | This project was made possible by everyone who contributed to this project. [CREDITS](https://github.com/rubentalstra/Pterodactyl-app/blob/master/CREDITS.md) 33 | 34 | 35 | ### :heart: Found this project useful? 36 | If you found this project useful, then please consider giving it a :star: on Github and sharing it with your friends via social media. 37 | 38 | 39 | ### Currently available on the Play store. 40 | 41 | Get it on Google Play 42 | 43 | 44 | 45 | ## 💰 Donations 46 | 47 | This project needs you! If you would like to support this project's further development, the creator of this project or the continuous maintenance of this project, feel free to donate. Your donation is highly appreciated (and I love food, coffee and beer). Thank you! 48 | 49 | **PayPal** 50 | 51 | - **[Donate \$5](https://www.paypal.me/RDTalstra/5)**: Thank's for creating this project, here's a coffee :coffee: (or some juice) for you! 52 | - **[Donate \$10](https://www.paypal.me/RDTalstra/10)**: Wow, I'm stunned. Let me take you to the movies! :movie_camera: 53 | - **[Donate \$15](https://www.paypal.me/RDTalstra/15)**: I really appreciate your work, lets grab some lunch! 54 | - **[Donate \$25](https://www.paypal.me/RDTalstra/25)**: That's some awesome stuff you did right there, dinner is on me! 55 | - **[Donate \$50](https://www.paypal.me/RDTalstra/50)**: I really really want to support this project, great job! 56 | - **[Donate \$100](https://www.paypal.me/RDTalstra/100)**: You are the man! This project saved me hours (if not days) of struggle and hard work, simply awesome! 57 | - **[Donate \$2799](https://www.paypal.me/RDTalstra/2799)**: Go buddy, buy yourself a Macbook Pro! :computer: 58 | 59 | Of course, you can also choose what you want to donate, all donations are awesome! 60 | 61 | 62 | ## 👨 Developed By 63 | 64 | ``` 65 | Ruben Talstra and Yvan Watchman 66 | ``` 67 | 68 | Passionate #Flutter, #Android Developer, #iOS Developer. 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | ## :link: Useful Links 78 | 79 | 80 | Twitter: [Pterodactyl app Twitter](https://twitter.com/AppPterodactyl) 81 | 82 | Instagram: [Pterodactyl app Instagram](https://www.instagram.com/pterodactyl_app/) 83 | 84 | Website: [Pterodactyl app website](https://pterodactyl-app.com/) 85 | 86 | Trello Board: [Pterodactyl app Trello Board](https://trello.com/b/YqCe05Vl/pterodactyl-app) 87 | 88 | PhraseApp: [PhraseApp helps us by providing an opensource package](https://phrase.com/) 89 | 90 | 91 | ``` 92 | flutter build appbundle --release --target-platform=android-arm 93 | flutter build appbundle --release --target-platform=android-arm64 94 | ``` 95 | 96 | License 97 | ------- 98 | 99 | Copyright 2018-2019 Ruben Talstra and Yvan Watchman 100 | 101 | Licensed under the GNU General Public License v3.0 (the "License"); 102 | you may not use this file except in compliance with the License. 103 | You may obtain a copy of the License at 104 | 105 | https://www.gnu.org/licenses/gpl-3.0 106 | 107 | Unless required by applicable law or agreed to in writing, software 108 | distributed under the License is distributed on an "AS IS" BASIS, 109 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 110 | See the License for the specific language governing permissions and 111 | limitations under the License. 112 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ------- | ------------------ | 7 | | 5.1.x | :white_check_mark: | 8 | | 5.0.x | :x: | 9 | | 4.0.x | :white_check_mark: | 10 | | < 4.0 | :x: | 11 | 12 | ## Reporting a Vulnerability 13 | 14 | To report a security vulnerability, please contact Ruben on the Pterodactyl App's Discord. 15 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | throw new GradleException("versionCode not found. Define flutter.versionCode in the local.properties file.") 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | throw new GradleException("versionName not found. Define flutter.versionName in the local.properties file.") 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | 28 | def keystoreProperties = new Properties() 29 | def keystorePropertiesFile = rootProject.file('key.properties') 30 | if (keystorePropertiesFile.exists()) { 31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 32 | } 33 | 34 | android { 35 | compileSdkVersion 28 36 | 37 | lintOptions { 38 | disable 'InvalidPackage' 39 | } 40 | 41 | defaultConfig { 42 | applicationId "nl.rubentalstra.pterodactyl_app" 43 | minSdkVersion 16 44 | targetSdkVersion 28 45 | versionCode flutterVersionCode.toInteger() 46 | versionName flutterVersionName 47 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 48 | } 49 | 50 | signingConfigs { 51 | release { 52 | keyAlias keystoreProperties['keyAlias'] 53 | keyPassword keystoreProperties['keyPassword'] 54 | storeFile file(keystoreProperties['storeFile']) 55 | storePassword keystoreProperties['storePassword'] 56 | } 57 | } 58 | buildTypes { 59 | release { 60 | signingConfig signingConfigs.release 61 | //minifyEnabled true 62 | } 63 | } 64 | } 65 | 66 | flutter { 67 | source '../..' 68 | } 69 | 70 | dependencies { 71 | testImplementation 'junit:junit:4.12' 72 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 73 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 74 | implementation 'com.google.firebase:firebase-core:16.0.9' 75 | } 76 | 77 | apply plugin: 'com.google.gms.google-services' 78 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "880686270115", 4 | "firebase_url": "https://pterodactyl-mobile.firebaseio.com", 5 | "project_id": "pterodactyl-mobile", 6 | "storage_bucket": "pterodactyl-mobile.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:880686270115:android:d7e34f186e08ccd6", 12 | "android_client_info": { 13 | "package_name": "nl.rubentalstra.pterodactyl_app" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "880686270115-4lhv23d7fs5d27i2a0k6983rcusu2an5.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIzaSyB3K4dF_YHzTLGHxA-I6o9hkhFDBar1Rz8" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [ 30 | { 31 | "client_id": "880686270115-4lhv23d7fs5d27i2a0k6983rcusu2an5.apps.googleusercontent.com", 32 | "client_type": 3 33 | }, 34 | { 35 | "client_id": "880686270115-vebqc84ibn0eof88ol9keckm9sjuac1d.apps.googleusercontent.com", 36 | "client_type": 2, 37 | "ios_info": { 38 | "bundle_id": "nl.rubentalstra.pterodactylapp" 39 | } 40 | } 41 | ] 42 | } 43 | } 44 | } 45 | ], 46 | "configuration_version": "1" 47 | } -------------------------------------------------------------------------------- /android/app/key.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/key.jks -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #Flutter Wrapper 2 | -keep class io.flutter.app.** { *; } 3 | -keep class io.flutter.plugin.** { *; } 4 | -keep class io.flutter.util.** { *; } 5 | -keep class io.flutter.view.** { *; } 6 | -keep class io.flutter.** { *; } 7 | -keep class io.flutter.plugins.** { *; } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 10 | 14 | 21 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java: -------------------------------------------------------------------------------- 1 | package io.flutter.plugins; 2 | 3 | import io.flutter.plugin.common.PluginRegistry; 4 | import com.infitio.adharasocketio.AdharaSocketIoPlugin; 5 | import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin; 6 | import io.flutter.plugins.firebase.firebaseremoteconfig.FirebaseRemoteConfigPlugin; 7 | import com.appleeducate.getversion.GetVersionPlugin; 8 | import io.flutter.plugins.packageinfo.PackageInfoPlugin; 9 | import io.flutter.plugins.pathprovider.PathProviderPlugin; 10 | import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin; 11 | import com.tekartik.sqflite.SqflitePlugin; 12 | import io.flutter.plugins.urllauncher.UrlLauncherPlugin; 13 | 14 | /** 15 | * Generated file. Do not edit. 16 | */ 17 | public final class GeneratedPluginRegistrant { 18 | public static void registerWith(PluginRegistry registry) { 19 | if (alreadyRegisteredWith(registry)) { 20 | return; 21 | } 22 | AdharaSocketIoPlugin.registerWith(registry.registrarFor("com.infitio.adharasocketio.AdharaSocketIoPlugin")); 23 | FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin")); 24 | FirebaseRemoteConfigPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebase.firebaseremoteconfig.FirebaseRemoteConfigPlugin")); 25 | GetVersionPlugin.registerWith(registry.registrarFor("com.appleeducate.getversion.GetVersionPlugin")); 26 | PackageInfoPlugin.registerWith(registry.registrarFor("io.flutter.plugins.packageinfo.PackageInfoPlugin")); 27 | PathProviderPlugin.registerWith(registry.registrarFor("io.flutter.plugins.pathprovider.PathProviderPlugin")); 28 | SharedPreferencesPlugin.registerWith(registry.registrarFor("io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin")); 29 | SqflitePlugin.registerWith(registry.registrarFor("com.tekartik.sqflite.SqflitePlugin")); 30 | UrlLauncherPlugin.registerWith(registry.registrarFor("io.flutter.plugins.urllauncher.UrlLauncherPlugin")); 31 | } 32 | 33 | private static boolean alreadyRegisteredWith(PluginRegistry registry) { 34 | final String key = GeneratedPluginRegistrant.class.getCanonicalName(); 35 | if (registry.hasPlugin(key)) { 36 | return true; 37 | } 38 | registry.registrarFor(key); 39 | return false; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /android/app/src/main/java/nl/rubentalstra/pterodactyl_app/MainActivity.java: -------------------------------------------------------------------------------- 1 | package nl.rubentalstra.pterodactyl_app; 2 | 3 | import android.os.Bundle; 4 | 5 | import io.flutter.app.FlutterActivity; 6 | import io.flutter.plugins.GeneratedPluginRegistrant; 7 | 8 | public class MainActivity extends FlutterActivity { 9 | @Override 10 | protected void onCreate(Bundle savedInstanceState) { 11 | super.onCreate(savedInstanceState); 12 | GeneratedPluginRegistrant.registerWith(this); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/drawable/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/pterodactyl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/drawable/pterodactyl.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/pterodactyl_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/drawable/pterodactyl_text.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.2.1' 9 | classpath 'com.google.gms:google-services:3.2.1' 10 | } 11 | } 12 | 13 | allprojects { 14 | repositories { 15 | google() 16 | jcenter() 17 | } 18 | } 19 | 20 | rootProject.buildDir = '../build' 21 | subprojects { 22 | project.buildDir = "${rootProject.buildDir}/${project.name}" 23 | } 24 | subprojects { 25 | project.evaluationDependsOn(':app') 26 | } 27 | 28 | task clean(type: Delete) { 29 | delete rootProject.buildDir 30 | } 31 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip 7 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /android/key.properties: -------------------------------------------------------------------------------- 1 | storePassword=Nebur1211 2 | keyPassword=Nebur1211 3 | keyAlias=key 4 | storeFile=key.jks -------------------------------------------------------------------------------- /android/keystore_name.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/android/keystore_name.keystore -------------------------------------------------------------------------------- /android/local.properties: -------------------------------------------------------------------------------- 1 | sdk.dir=C:\\src\\android_sdk 2 | flutter.sdk=C:\\src\\flutter 3 | flutter.versionCode=54 4 | flutter.versionName=4.3.8 5 | flutter.buildMode=debug -------------------------------------------------------------------------------- /android/pterodactyl_app_android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /assets/fonts/Cairo-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Cairo-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Cairo-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-ExtraLight.ttf -------------------------------------------------------------------------------- /assets/fonts/Cairo-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Cairo-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Cairo-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/fonts/Cairo-SemiBold.ttf -------------------------------------------------------------------------------- /assets/fonts/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2009 The Cairo Project Authors (gaber@gaberism.net) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /assets/ic_forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/ic_forward.png -------------------------------------------------------------------------------- /assets/images/03736E05-CF2B-49F5-8CC0-910CAF4CA528.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/images/03736E05-CF2B-49F5-8CC0-910CAF4CA528.jpeg -------------------------------------------------------------------------------- /assets/images/discord2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/images/discord2.png -------------------------------------------------------------------------------- /assets/images/minicenter_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/images/minicenter_logo.png -------------------------------------------------------------------------------- /assets/images/pterodactyl_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/images/pterodactyl_icon.png -------------------------------------------------------------------------------- /assets/images/pterodactylapp_BG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/assets/images/pterodactylapp_BG.png -------------------------------------------------------------------------------- /assets/lang/fi-FI.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /assets/lang/fy.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /assets/lang/nl-BE.json: -------------------------------------------------------------------------------- 1 | { 2 | "login_error": "gebruikersnaam of wachtwoord kan niet leeg zijn." 3 | } -------------------------------------------------------------------------------- /assets/lang/pt-PT.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /assets/lang/ru-RU.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /assets/lang/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "2fa": "2FA", 3 | "action_file": "文件列表", 4 | "action_kill": "杀死(强制停止)", 5 | "action_kill_warning": "你确定要杀死你的服务器吗? 什么都不会得救!", 6 | "action_restart": "重启", 7 | "action_restart_warning": "您确定要重新启动服务器吗?", 8 | "action_start": "启动", 9 | "action_stats": "状态", 10 | "action_stop": "停止", 11 | "action_stop_warning": "您确定要停止此服务器吗?", 12 | "added_soon": "即将到来", 13 | "admin_actionnodes_create_allocation": "创建地址", 14 | "admin_actionnodes_list_off_allocations": "列出所有地址池", 15 | "admin_actionserver_edit_server_info": "编辑服务器信息", 16 | "admin_actionserver_rebuild_server": "重建服务器", 17 | "admin_actionserver_reinstall_server": "重装服务器", 18 | "admin_actionserver_suspend_server": "暂停服务器", 19 | "admin_actionserver_unsuspend_server": "解除暂停服务器", 20 | "admin_actionserver_view_server_info": "查看服务器信息", 21 | "admin_alert_rebuild_server_info": "这将会在服务器容器下次启动的时候出发重建. 如果一些东西工作不正常,或者您手动更改了服务器设置,重建将会很有用.", 22 | "admin_alert_reinstall_server_info": "这将会使用服务器分配的包和服务器脚本进行服务器容器的重装危险!这将会覆盖服务器数据", 23 | "admin_alert_suspend_server_info": "这将会暂停服务器,停止任何运行中的进程,并且立即阻止用户访问他们的文件,以及任何通过面板或者API进行的操作.", 24 | "admin_alert_unsuspend_server_info": "您将恢复服务器所有者对他的服务器的访问权,确定这么做?", 25 | "admin_allocationscreate_assign": "分配新地址", 26 | "admin_allocationscreate_ip": "IP别名 (可选)", 27 | "admin_allocationscreate_port": "端口 (只能有一个)", 28 | "admin_allocations_assigned": "已分配", 29 | "admin_allocations_id": "ID", 30 | "admin_allocations_list": "列出指定节点上的地址池", 31 | "admin_allocations_port": "端口", 32 | "admin_create_server": "创建服务器", 33 | "admin_create_server_1_8": "(1/8) 创建服务器", 34 | "admin_create_server_2_8": "(2/8) 选择一个巢 ", 35 | "admin_create_server_3_8": "(3/8) 选择一个蛋", 36 | "admin_create_server_4_8": "(4/8) 设定服务器限制", 37 | "admin_create_server_5_8": "(5/8) 选择可用区", 38 | "admin_create_server_6_8": "(6/8) 选择节点", 39 | "admin_create_server_7_8": "(7/8) 选择地址", 40 | "admin_create_server_8_8": "(8/8) 创建服务器", 41 | "admin_create_server_database_limit": "数据库限制", 42 | "admin_create_server_email": "用户的邮箱", 43 | "admin_create_server_server_name": "服务器名字", 44 | "admin_create_user_create_a_user": "创建新用户", 45 | "admin_create_user_email": "电子邮箱", 46 | "admin_create_user_first_name": "名", 47 | "admin_create_user_last_name": "姓", 48 | "admin_create_user_last_password": "密码", 49 | "admin_create_user_title": "创建用户", 50 | "admin_create_user_username": "用户名", 51 | "admin_edit_user": "编辑服务器", 52 | "admin_homepanel": "管理员面板", 53 | "admin_hometotalnodes": "节点总数", 54 | "admin_hometotalusers": "用户总数", 55 | "admin_login": "管理员登录", 56 | "admin_noadminaccount": "没有管理员账号?点击这里", 57 | "admin_nodestotalallocations": "总地址池数量", 58 | "admin_nodes_nodes": "节点", 59 | "admin_server_list": "管理员服务器列表", 60 | "admin_user_list_list": "管理员用户列表", 61 | "admin_user_list_user": "添加用户", 62 | "admin_view_server": "查看服务器", 63 | "admin_view_server_description": "描述:", 64 | "admin_view_server_identifier": "区分ID:", 65 | "admin_view_server_installed": "已完成安装:", 66 | "admin_view_server_name": "名字:", 67 | "admin_view_server_startup_command": "启动命令:", 68 | "admin_view_server_suspended": "被暂停:", 69 | "alerts": "警报", 70 | "alerts_sub": "全部 ", 71 | "api_key_login": "API KEY", 72 | "api_user_name": "Username", 73 | "api_user_pass": "Password", 74 | "app_version": "APP版本", 75 | "clear": "清空", 76 | "client_login": "CLIENT LOGIN", 77 | "coming_soon": "即将到来", 78 | "coming_soon_sub": "Soon™️", 79 | "console": "控制台", 80 | "cores": "核心数", 81 | "cpu_limit": "CPU限制", 82 | "created_at": "创建于:", 83 | "dark_mode": "夜间模式", 84 | "dark_mode_sub": "黑色和灰色主题", 85 | "dashboard": "仪表板", 86 | "delete_data": "删除所有数据", 87 | "delete_data_sub": "这个按钮将会删除这个APP的所有数据", 88 | "disk_limit": "磁盘限制", 89 | "email": "电子邮件:", 90 | "firstname": "名:", 91 | "id": "ID:", 92 | "info": "Info", 93 | "io_limit": "IO限制", 94 | "language": "语言:", 95 | "lastname": "姓:", 96 | "license": "许可", 97 | "license_sub": "获取与许可相关的信息", 98 | "loading": "载入中...", 99 | "login_admin_account": "有有管理员账号?点击这里", 100 | "login_error": "用户名或者密码不能为空", 101 | "login_error_400": "400错误的请求 -- 您的请求无效.", 102 | "login_error_401": "401未验证 -- 您没有传递验证头活丢失了Bearer.", 103 | "login_error_403": "403被禁止 -- 您的Key无效或者无权访问所给出的端点.", 104 | "login_error_404": "404找不到 -- 指定的东西找不到.", 105 | "login_error_ok": "好", 106 | "login_error_support": "如果您的APP活面板有什么错误,请向客服询问以获得帮助.", 107 | "login_username_api_not_supported": "Not yet supported", 108 | "login_username_api_not_supported_error": "Logging in with username is not yet supported at your host.", 109 | "login_username_api_no_api_key": "No api key available", 110 | "login_username_api_no_api_key_error": "Cannot log you in, key not available.\nTrying to create key...", 111 | "logout": "注销", 112 | "logout_sub": "断开连接", 113 | "memory_limit": "内存限制", 114 | "next": "下一步", 115 | "no": "否", 116 | "notifications": "启用通知", 117 | "notifications_sub": "在主菜单获取消息提示", 118 | "project_version_failed": "Failed to get project version.", 119 | "remember_me": "记住我", 120 | "rootadmin": "管理员:", 121 | "search": "Search...", 122 | "send_command": "发送一个命令", 123 | "server_list": "服务器列表", 124 | "settings": "设置", 125 | "settings_donators": "Donators", 126 | "settings_ows": "Owns", 127 | "settings_partners": "Partners", 128 | "settings_schedules": "Schedules", 129 | "settings_sub": "数据,夜间模式等", 130 | "settings_sub_user": "Sub-user", 131 | "settings_website": "Website", 132 | "submit": "提交", 133 | "swap_limit": "交换空间限制", 134 | "total_disk": "总硬盘空间:", 135 | "total_ram": "总可用内存:", 136 | "total_servers": "服务器总数", 137 | "type_command_here": "在这里输入命令...", 138 | "updated_at": "更新于:", 139 | "update_btnLabel": "Update Now", 140 | "update_message": "There is a newer version of app available please update it now.", 141 | "update_title": "New Update Available", 142 | "url_login": "面板地址(panel.pterodactyl.app)", 143 | "utilization_cpu": "CPU", 144 | "utilization_disk": "磁盘", 145 | "utilization_memory": "内存", 146 | "utilization_performance_cpu": "性能报告", 147 | "utilization_performance_disk": "性能报告", 148 | "utilization_performance_memory": "性能报告", 149 | "utilization_stats": "状态", 150 | "utilization_stats_Loading": "接收数据中", 151 | "utilization_stats_offline": "离线", 152 | "utilization_stats_on": "状态: $_stats", 153 | "utilization_stats_online": "服务器已开启", 154 | "utilization_stats_starting": "服务器正在启动", 155 | "utilization_stats_stopping": "服务器正在停止", 156 | "uuid": "UUID:", 157 | "yes": "是" 158 | } -------------------------------------------------------------------------------- /assets/lang/zh-TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "2fa": "2FA", 3 | "action_file": "檔案列表", 4 | "action_kill": "殺死(強制停止)", 5 | "action_kill_warning": "你確定要殺死你的服務器嗎? 什麼都不會得救!", 6 | "action_restart": "重啟", 7 | "action_restart_warning": "您確定要重新啟動服務器嗎?", 8 | "action_start": "啟動", 9 | "action_stats": "狀態", 10 | "action_stop": "停止", 11 | "action_stop_warning": "您確定要停止此服務器嗎?", 12 | "added_soon": "this will be added soon", 13 | "admin_actionnodes_create_allocation": "創建地址", 14 | "admin_actionnodes_list_off_allocations": "列出所有位址集區", 15 | "admin_actionserver_edit_server_info": "Edit Server info", 16 | "admin_actionserver_rebuild_server": "重建伺服器", 17 | "admin_actionserver_reinstall_server": "重裝伺服器", 18 | "admin_actionserver_suspend_server": "凍結伺服器", 19 | "admin_actionserver_unsuspend_server": "解除凍結伺服器", 20 | "admin_actionserver_view_server_info": "View Server info", 21 | "admin_alert_rebuild_server_info": "這將會在伺服器下次啟動的時候出發重建. 如果有一些東西不正常,或者您手動更改了伺服器設置,重建將會很有用.", 22 | "admin_alert_reinstall_server_info": "這將會使用伺服器分配的包和伺服器腳本進行伺服器容器的重裝。注意!這將會覆蓋伺服器資料", 23 | "admin_alert_suspend_server_info": "這將會凍結伺服器,停止任何運行中的進程,並且立即阻止使用者訪問他們的檔案,以及任何通過控制台或者API進行的操作.", 24 | "admin_alert_unsuspend_server_info": "您將恢復伺服器所有者對他的伺服器的訪問權,確定這麼做?", 25 | "admin_allocationscreate_assign": "分配新地址", 26 | "admin_allocationscreate_ip": "IP別名 (可選)", 27 | "admin_allocationscreate_port": "埠 (只能有一個)", 28 | "admin_allocations_assigned": "已分配", 29 | "admin_allocations_id": "ID", 30 | "admin_allocations_list": "列出指定節點上的位址集區", 31 | "admin_allocations_port": "埠", 32 | "admin_create_server": "Create server", 33 | "admin_create_server_1_8": "Create server 1/8", 34 | "admin_create_server_2_8": "select a nest 2/8", 35 | "admin_create_server_3_8": "select an egg 3/8", 36 | "admin_create_server_4_8": "add server limits 4/8", 37 | "admin_create_server_5_8": "select a location 5/8", 38 | "admin_create_server_6_8": "select a node 6/8", 39 | "admin_create_server_7_8": "Select an allocation 7/8", 40 | "admin_create_server_8_8": "Create server 8/8", 41 | "admin_create_server_database_limit": "databases limit", 42 | "admin_create_server_email": "email of the user'", 43 | "admin_create_server_server_name": "Server name", 44 | "admin_create_user_create_a_user": "創建新用戶", 45 | "admin_create_user_email": "電子郵箱", 46 | "admin_create_user_first_name": "名", 47 | "admin_create_user_last_name": "姓", 48 | "admin_create_user_last_password": "密碼", 49 | "admin_create_user_title": "創建用戶", 50 | "admin_create_user_username": "用戶名", 51 | "admin_edit_user": "Edit Server", 52 | "admin_homepanel": "管理員面板", 53 | "admin_hometotalnodes": "節點總數", 54 | "admin_hometotalusers": "用戶總數", 55 | "admin_login": "管理員登錄", 56 | "admin_noadminaccount": "沒有管理員帳號?點擊這裡", 57 | "admin_nodestotalallocations": "Total Allocations", 58 | "admin_nodes_nodes": "節點", 59 | "admin_server_list": "管理員伺服器列表", 60 | "admin_user_list_list": "管理員用戶列表", 61 | "admin_user_list_user": "用戶", 62 | "admin_view_server": "View Server", 63 | "admin_view_server_description": "Description:", 64 | "admin_view_server_identifier": "Identifier:", 65 | "admin_view_server_installed": "Installed:", 66 | "admin_view_server_name": "Name:", 67 | "admin_view_server_startup_command": "Startup Command:", 68 | "admin_view_server_suspended": "Suspended:", 69 | "alerts": "通知", 70 | "alerts_sub": "全部 ", 71 | "api_key_login": "API KEY", 72 | "api_user_name": "Username", 73 | "api_user_pass": "Password", 74 | "app_version": "APP版本", 75 | "clear": "清空", 76 | "client_login": "CLIENT LOGIN", 77 | "coming_soon": "即將到來", 78 | "coming_soon_sub": "Soon™️", 79 | "console": "控制台", 80 | "cores": "核心數", 81 | "cpu_limit": "CPU limit", 82 | "created_at": "Created at:", 83 | "dark_mode": "夜間模式", 84 | "dark_mode_sub": "黑色和灰色主題", 85 | "dashboard": "儀錶板", 86 | "delete_data": "刪除所有資料", 87 | "delete_data_sub": "這個按鈕將會刪除這個APP的所有資料", 88 | "disk_limit": "Disk limit", 89 | "email": "Email:", 90 | "firstname": "First name:", 91 | "id": "ID:", 92 | "info": "Info", 93 | "io_limit": "IO limit", 94 | "language": "Language:", 95 | "lastname": "Last name:", 96 | "license": "許可", 97 | "license_sub": "獲取與許可相關的資訊", 98 | "loading": "載入中...", 99 | "login_admin_account": "有管理員帳號?點擊這裡", 100 | "login_error": "用戶名或者密碼不能為空", 101 | "login_error_400": "400 Bad Request -- Your request is invalid.", 102 | "login_error_401": "401 Unauthorized -- You didn't pass an auth header or it was missing the bearer.", 103 | "login_error_403": "403 Forbidden -- Your key is invalid or it doesn't have access to said endpoint.", 104 | "login_error_404": "404 Not Found -- The specified kitten could not be found.", 105 | "login_error_ok": "好", 106 | "login_error_support": "Please ask for support there is something wrong, with the app or your panel.", 107 | "login_username_api_not_supported": "Not yet supported", 108 | "login_username_api_not_supported_error": "Logging in with username is not yet supported at your host.", 109 | "login_username_api_no_api_key": "No api key available", 110 | "login_username_api_no_api_key_error": "Cannot log you in, key not available.\nTrying to create key...", 111 | "logout": "登出", 112 | "logout_sub": "斷開連接", 113 | "memory_limit": "Memory limit", 114 | "next": "下一步", 115 | "no": "拒絕", 116 | "notifications": "啟用通知", 117 | "notifications_sub": "在主功能表獲取消息提示", 118 | "project_version_failed": "Failed to get project version.", 119 | "remember_me": "記住我", 120 | "rootadmin": "Root admin:", 121 | "search": "Search...", 122 | "send_command": "發送一個指令", 123 | "server_list": "伺服器列表", 124 | "settings": "設定", 125 | "settings_donators": "Donators", 126 | "settings_ows": "Owns", 127 | "settings_partners": "Partners", 128 | "settings_schedules": "Schedules", 129 | "settings_sub": "資料,夜間模式等", 130 | "settings_sub_user": "Sub-user", 131 | "settings_website": "Website", 132 | "submit": "Submit", 133 | "swap_limit": "Swap limit", 134 | "total_disk": "總硬碟空間:", 135 | "total_ram": "總可用記憶體:", 136 | "total_servers": "伺服器總數", 137 | "type_command_here": "在這裡輸入指令...", 138 | "updated_at": "Updated at:", 139 | "update_btnLabel": "Update Now", 140 | "update_message": "There is a newer version of app available please update it now.", 141 | "update_title": "New Update Available", 142 | "url_login": "控制台地址(panel.pterodactyl.app)", 143 | "utilization_cpu": "CPU", 144 | "utilization_disk": "磁碟", 145 | "utilization_memory": "記憶體", 146 | "utilization_performance_cpu": "性能報告", 147 | "utilization_performance_disk": "性能報告", 148 | "utilization_performance_memory": "性能報告", 149 | "utilization_stats": "狀態", 150 | "utilization_stats_Loading": "Retrieving data", 151 | "utilization_stats_offline": "Offline", 152 | "utilization_stats_on": "狀態: $_stats", 153 | "utilization_stats_online": "Server is online", 154 | "utilization_stats_starting": "Server is starting", 155 | "utilization_stats_stopping": "Server is stopping", 156 | "uuid": "uuid:", 157 | "yes": "確定" 158 | } -------------------------------------------------------------------------------- /custom_version_request_partners.md: -------------------------------------------------------------------------------- 1 | # Request a custom version of the app 2 | 3 | there are a few options where you can choose from or if you have your own suggestions thats also always welcome :heart:. 4 | 5 | List of options: 6 | 7 | 1. [Default](#default-dashboard) 8 | 2. [With Side menu (no Dashboard)](#with-side-menu-no-dashboard) 9 | 3. [Custom](#custom) 10 | 11 | 12 | ## Default (Dashboard) 13 | 14 | just the deafult version of the app. we will change the colours and the logo's at the login. Everything else will stay the same then. 15 | If you want add some custom pages to the app your welcome to let us know. and we will arrange it. 16 | 17 | ## With Side menu (no Dashboard) 18 | 19 | with this version there will be no dashboard. when the client logsin they will see directly there servers. they have then a side menu for navigation to settings and later also other stuff. we will change the colours of the app for you and chnage the login logo's 20 | 21 | ## Custom 22 | 23 | if you want a total custom client page and client login, please contact me by sending a email to this email address: [rubentalstra1211@gmail.com](mailto:rubentalstra1211@gmail.com) 24 | 25 | please with the following information: 26 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 880686270115-vebqc84ibn0eof88ol9keckm9sjuac1d.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.880686270115-vebqc84ibn0eof88ol9keckm9sjuac1d 9 | ANDROID_CLIENT_ID 10 | 880686270115-hs5h9u9333vrt24erv7cnuahnt25of54.apps.googleusercontent.com 11 | API_KEY 12 | AIzaSyDfc8bq7oG8k6T9Q_--2lJvcHfozAP08N4 13 | GCM_SENDER_ID 14 | 880686270115 15 | PLIST_VERSION 16 | 1 17 | BUNDLE_ID 18 | nl.rubentalstra.pterodactylapp 19 | PROJECT_ID 20 | pterodactyl-mobile 21 | STORAGE_BUCKET 22 | pterodactyl-mobile.appspot.com 23 | IS_ADS_ENABLED 24 | 25 | IS_ANALYTICS_ENABLED 26 | 27 | IS_APPINVITE_ENABLED 28 | 29 | IS_GCM_ENABLED 30 | 31 | IS_SIGNIN_ENABLED 32 | 33 | GOOGLE_APP_ID 34 | 1:880686270115:ios:fedbd0edd2f12e4b 35 | DATABASE_URL 36 | https://pterodactyl-mobile.firebaseio.com 37 | 38 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | pods_ary = [] 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) { |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | pods_ary.push({:name => podname, :path => podpath}); 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | } 32 | return pods_ary 33 | end 34 | 35 | target 'Runner' do 36 | use_frameworks! 37 | 38 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 39 | # referring to absolute paths on developers' machines. 40 | system('rm -rf .symlinks') 41 | system('mkdir -p .symlinks/plugins') 42 | 43 | # Flutter Pods 44 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 45 | if generated_xcode_build_settings.empty? 46 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 47 | end 48 | generated_xcode_build_settings.map { |p| 49 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 50 | symlink = File.join('.symlinks', 'flutter') 51 | File.symlink(File.dirname(p[:path]), symlink) 52 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 53 | end 54 | } 55 | 56 | # Plugin Pods 57 | plugin_pods = parse_KV_file('../.flutter-plugins') 58 | plugin_pods.map { |p| 59 | symlink = File.join('.symlinks', 'plugins', p[:name]) 60 | File.symlink(p[:path], symlink) 61 | pod p[:name], :path => File.join(symlink, 'ios') 62 | } 63 | end 64 | 65 | post_install do |installer| 66 | installer.pods_project.targets.each do |target| 67 | target.build_configurations.each do |config| 68 | config.build_settings['ENABLE_BITCODE'] = 'NO' 69 | end 70 | end 71 | end 72 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 56 | 58 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 77 | 83 | 84 | 85 | 86 | 88 | 89 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildSystemType 6 | Original 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pterodactyl-app/Pterodactyl-app/1ad48b05275acea83a1cd181ec802eae5cd8bf44/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | #ifndef GeneratedPluginRegistrant_h 6 | #define GeneratedPluginRegistrant_h 7 | 8 | #import 9 | 10 | @interface GeneratedPluginRegistrant : NSObject 11 | + (void)registerWithRegistry:(NSObject*)registry; 12 | @end 13 | 14 | #endif /* GeneratedPluginRegistrant_h */ 15 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.m: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | #import "GeneratedPluginRegistrant.h" 6 | #import 7 | #import 8 | #import 9 | #import 10 | #import 11 | #import 12 | #import 13 | #import 14 | #import 15 | 16 | @implementation GeneratedPluginRegistrant 17 | 18 | + (void)registerWithRegistry:(NSObject*)registry { 19 | [AdharaSocketIoPlugin registerWithRegistrar:[registry registrarForPlugin:@"AdharaSocketIoPlugin"]]; 20 | [FLTFirebaseMessagingPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseMessagingPlugin"]]; 21 | [FirebaseRemoteConfigPlugin registerWithRegistrar:[registry registrarForPlugin:@"FirebaseRemoteConfigPlugin"]]; 22 | [GetVersionPlugin registerWithRegistrar:[registry registrarForPlugin:@"GetVersionPlugin"]]; 23 | [FLTPackageInfoPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPackageInfoPlugin"]]; 24 | [FLTPathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPathProviderPlugin"]]; 25 | [FLTSharedPreferencesPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTSharedPreferencesPlugin"]]; 26 | [SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]]; 27 | [FLTUrlLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTUrlLauncherPlugin"]]; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /ios/Runner/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 880686270115-vebqc84ibn0eof88ol9keckm9sjuac1d.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.880686270115-vebqc84ibn0eof88ol9keckm9sjuac1d 9 | ANDROID_CLIENT_ID 10 | 880686270115-hs5h9u9333vrt24erv7cnuahnt25of54.apps.googleusercontent.com 11 | API_KEY 12 | AIzaSyDfc8bq7oG8k6T9Q_--2lJvcHfozAP08N4 13 | GCM_SENDER_ID 14 | 880686270115 15 | PLIST_VERSION 16 | 1 17 | BUNDLE_ID 18 | nl.rubentalstra.pterodactylapp 19 | PROJECT_ID 20 | pterodactyl-mobile 21 | STORAGE_BUCKET 22 | pterodactyl-mobile.appspot.com 23 | IS_ADS_ENABLED 24 | 25 | IS_ANALYTICS_ENABLED 26 | 27 | IS_APPINVITE_ENABLED 28 | 29 | IS_GCM_ENABLED 30 | 31 | IS_SIGNIN_ENABLED 32 | 33 | GOOGLE_APP_ID 34 | 1:880686270115:ios:fedbd0edd2f12e4b 35 | DATABASE_URL 36 | https://pterodactyl-mobile.firebaseio.com 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Pterodactyl App 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleLocalizations 16 | 17 | en 18 | de 19 | fr 20 | nl 21 | dk 22 | no 23 | pl 24 | it 25 | se 26 | zh-Hans 27 | 28 | CFBundleName 29 | pterodactylapp 30 | CFBundlePackageType 31 | APPL 32 | CFBundleShortVersionString 33 | $(FLUTTER_BUILD_NAME) 34 | CFBundleSignature 35 | ???? 36 | CFBundleVersion 37 | $(FLUTTER_BUILD_NUMBER) 38 | LSRequiresIPhoneOS 39 | 40 | UILaunchStoryboardName 41 | LaunchScreen 42 | UIMainStoryboardFile 43 | Main 44 | UISupportedInterfaceOrientations 45 | 46 | UIInterfaceOrientationPortrait 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | UISupportedInterfaceOrientations~ipad 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationPortraitUpsideDown 54 | UIInterfaceOrientationLandscapeLeft 55 | UIInterfaceOrientationLandscapeRight 56 | 57 | UIViewControllerBasedStatusBarAppearance 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class AboutPage extends StatefulWidget { 19 | @override 20 | _AboutPageState createState() => new _AboutPageState(); 21 | } 22 | 23 | class _AboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("There will be more", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/models/globals.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | library globals; 17 | 18 | bool useDarkTheme = false; -------------------------------------------------------------------------------- /lib/models/server.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | class Server { 18 | final String id, name; 19 | const Server({ 20 | this.id, 21 | this.name, 22 | }); 23 | } -------------------------------------------------------------------------------- /lib/models/settings.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | class SettingsInfo { 18 | final String name, email; 19 | final int servers, subServer, schedules; 20 | const SettingsInfo({ 21 | this.servers, 22 | this.subServer, 23 | this.schedules, 24 | this.name, 25 | this.email, 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /lib/models/stats.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | class Stats { 18 | final String id, name; 19 | const Stats({ 20 | this.id, 21 | this.name, 22 | }); 23 | } -------------------------------------------------------------------------------- /lib/page/admin/admincreateallocation.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import '../auth/shared_preferences_helper.dart'; 18 | import 'package:http/http.dart' as http; 19 | import 'package:pterodactyl_app/models/globals.dart' as globals; 20 | import 'dart:async'; 21 | import 'dart:convert'; 22 | import '../../main.dart'; 23 | import 'adminactionnodes.dart'; 24 | 25 | class AdminCreateAllocationPage extends StatefulWidget { 26 | AdminCreateAllocationPage({Key key, this.server}) : super(key: key); 27 | final Allocation server; 28 | 29 | @override 30 | _AdminCreateAllocationPageState createState() => 31 | _AdminCreateAllocationPageState(); 32 | } 33 | 34 | class _AdminCreateAllocationPageState extends State { 35 | final _aliasController = TextEditingController(); 36 | final _portsController = TextEditingController(); 37 | 38 | Future postSend() async { 39 | String _alias = await SharedPreferencesHelper.getString("alias"); 40 | String _ports = await SharedPreferencesHelper.getString("ports"); 41 | String _apiadmin = await SharedPreferencesHelper.getString("apiAdminKey"); 42 | String _urladmin = await SharedPreferencesHelper.getString("panelAdminUrl"); 43 | String _adminhttps = await SharedPreferencesHelper.getString("adminhttps"); 44 | var url = 45 | '$_adminhttps$_urladmin/api/application/nodes/${widget.server.adminids}/allocations'; 46 | 47 | Map data = { 48 | "ip": "${widget.server.adminnodeip}", 49 | "alias": "$_alias", 50 | "ports": "$_ports" 51 | }; 52 | //encode Map to JSON 53 | var body = json.encode(data); 54 | 55 | var response = await http.post(url, 56 | headers: { 57 | "Accept": "Application/vnd.pterodactyl.v1+json", 58 | "Content-Type": "application/json", 59 | "Authorization": "Bearer $_apiadmin" 60 | }, 61 | body: body); 62 | print("${response.statusCode}"); 63 | print("${response.body}"); 64 | return response; 65 | } 66 | 67 | @override 68 | Widget build(BuildContext context) { 69 | return Scaffold( 70 | appBar: AppBar( 71 | elevation: 0.0, 72 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 73 | leading: IconButton( 74 | color: globals.useDarkTheme ? Colors.white : Colors.black, 75 | onPressed: () => Navigator.of(context).pop(), 76 | icon: Icon(Icons.arrow_back, 77 | color: globals.useDarkTheme ? Colors.white : Colors.black), 78 | ), 79 | title: Text( 80 | DemoLocalizations.of(context) 81 | .trans('admin_allocationscreate_assign'), 82 | style: TextStyle( 83 | color: globals.useDarkTheme ? Colors.white : Colors.black, 84 | fontWeight: FontWeight.w700)), 85 | ), 86 | body: SafeArea( 87 | child: ListView( 88 | padding: EdgeInsets.symmetric(horizontal: 24.0), 89 | children: [ 90 | SizedBox(height: 80.0), 91 | AccentColorOverride( 92 | color: Color(0xFFC5032B), 93 | child: TextField( 94 | controller: _aliasController, 95 | decoration: InputDecoration( 96 | labelText: DemoLocalizations.of(context) 97 | .trans('admin_allocationscreate_ip'), 98 | ), 99 | ), 100 | ), 101 | SizedBox(height: 12.0), 102 | AccentColorOverride( 103 | color: Color(0xFFC5032B), 104 | child: TextField( 105 | keyboardType: TextInputType.number, 106 | controller: _portsController, 107 | decoration: InputDecoration( 108 | labelText: DemoLocalizations.of(context) 109 | .trans('admin_allocationscreate_port'), 110 | ), 111 | ), 112 | ), 113 | ButtonBar( 114 | children: [ 115 | FlatButton( 116 | child: Text(DemoLocalizations.of(context).trans('clear')), 117 | shape: BeveledRectangleBorder( 118 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 119 | ), 120 | onPressed: () { 121 | _aliasController.clear(); 122 | _portsController.clear(); 123 | }, 124 | ), 125 | RaisedButton( 126 | child: Text(DemoLocalizations.of(context).trans('submit')), 127 | elevation: 8.0, 128 | shape: BeveledRectangleBorder( 129 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 130 | ), 131 | onPressed: () async { 132 | await SharedPreferencesHelper.setString( 133 | "ports", _portsController.text); 134 | await SharedPreferencesHelper.setString( 135 | "alias", _aliasController.text); 136 | postSend(); 137 | }, 138 | ), 139 | ], 140 | ), 141 | ], 142 | ), 143 | ), 144 | ); 145 | } 146 | } 147 | 148 | class AccentColorOverride extends StatelessWidget { 149 | const AccentColorOverride({Key key, this.color, this.child}) 150 | : super(key: key); 151 | 152 | final Color color; 153 | final Widget child; 154 | 155 | @override 156 | Widget build(BuildContext context) { 157 | return Theme( 158 | child: child, 159 | data: Theme.of(context).copyWith( 160 | accentColor: color, 161 | brightness: Brightness.dark, 162 | ), 163 | ); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /lib/page/admin/create_server/admincreateserver.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import '../../auth/shared_preferences_helper.dart'; 18 | import 'package:http/http.dart' as http; 19 | import 'package:pterodactyl_app/models/globals.dart' as globals; 20 | import 'dart:async'; 21 | import 'dart:convert'; 22 | import '../../../main.dart'; 23 | import 'admincreateservernest.dart'; 24 | 25 | class Create { 26 | final String userid, servername; 27 | const Create({this.userid, this.servername}); 28 | } 29 | 30 | class AdminCreateServerPage extends StatefulWidget { 31 | @override 32 | _AdminCreateServerPageState createState() => 33 | new _AdminCreateServerPageState(); 34 | } 35 | 36 | class _AdminCreateServerPageState extends State { 37 | Map data; 38 | int userID; 39 | 40 | final _servernameController = TextEditingController(); 41 | final _emailController = TextEditingController(); 42 | 43 | Future getData() async { 44 | String _apiadmin = await SharedPreferencesHelper.getString("apiAdminKey"); 45 | String _urladmin = await SharedPreferencesHelper.getString("panelAdminUrl"); 46 | String _adminhttps = await SharedPreferencesHelper.getString("adminhttps"); 47 | http.Response response = await http.get( 48 | "$_adminhttps$_urladmin/api/application/users?search=${_emailController.text}", 49 | headers: { 50 | "Accept": "Application/vnd.pterodactyl.v1+json", 51 | "Content-Type": "application/json", 52 | "Authorization": "Bearer $_apiadmin" 53 | }, 54 | ); 55 | data = json.decode(response.body); 56 | setState(() { 57 | userID = data["data"]["attributes"]["id"]; 58 | }); 59 | } 60 | 61 | @override 62 | Widget build(BuildContext context) { 63 | return Scaffold( 64 | appBar: AppBar( 65 | elevation: 0.0, 66 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 67 | leading: IconButton( 68 | color: globals.useDarkTheme ? Colors.white : Colors.black, 69 | onPressed: () { 70 | Navigator.of(context).pop(); 71 | SharedPreferencesHelper.remove("username"); 72 | SharedPreferencesHelper.remove("email"); 73 | SharedPreferencesHelper.remove("first_name"); 74 | SharedPreferencesHelper.remove("last_name"); 75 | SharedPreferencesHelper.remove("password"); 76 | }, 77 | icon: Icon(Icons.arrow_back, 78 | color: globals.useDarkTheme ? Colors.white : Colors.black), 79 | ), 80 | title: Text(DemoLocalizations.of(context).trans('admin_create_server_1_8'), 81 | style: TextStyle( 82 | color: globals.useDarkTheme ? Colors.white : Colors.black, 83 | fontWeight: FontWeight.w700)), 84 | ), 85 | body: SafeArea( 86 | child: ListView( 87 | padding: EdgeInsets.symmetric(horizontal: 24.0), 88 | children: [ 89 | SizedBox(height: 20.0), 90 | AccentColorOverride( 91 | color: Colors.red, 92 | child: TextField( 93 | controller: _servernameController, 94 | decoration: InputDecoration( 95 | labelText: DemoLocalizations.of(context).trans('admin_create_server_server_name'), 96 | ), 97 | ), 98 | ), 99 | SizedBox(height: 12.0), 100 | AccentColorOverride( 101 | color: Colors.red, 102 | child: TextField( 103 | controller: _emailController, 104 | decoration: InputDecoration( 105 | labelText: DemoLocalizations.of(context).trans('admin_create_server_email'), 106 | ), 107 | ), 108 | ), 109 | ButtonBar( 110 | children: [ 111 | FlatButton( 112 | child: Text(DemoLocalizations.of(context).trans('clear')), 113 | shape: BeveledRectangleBorder( 114 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 115 | ), 116 | onPressed: () { 117 | _servernameController.clear(); 118 | _emailController.clear(); 119 | }, 120 | ), 121 | RaisedButton( 122 | child: Text(DemoLocalizations.of(context).trans('next')), 123 | elevation: 8.0, 124 | shape: BeveledRectangleBorder( 125 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 126 | ), 127 | onPressed: () async { 128 | getData(); 129 | var route = new MaterialPageRoute( 130 | builder: (BuildContext context) => 131 | new AdminCreateServerNestPage( 132 | server: Create( 133 | userid: "$userID", 134 | servername: _servernameController.text))); 135 | Navigator.of(context).push(route); 136 | print(userID); 137 | }, 138 | ), 139 | ], 140 | ), 141 | ], 142 | ), 143 | ), 144 | ); 145 | } 146 | } 147 | 148 | class AccentColorOverride extends StatelessWidget { 149 | const AccentColorOverride({Key key, this.color, this.child}) 150 | : super(key: key); 151 | 152 | final Color color; 153 | final Widget child; 154 | 155 | @override 156 | Widget build(BuildContext context) { 157 | return Theme( 158 | child: child, 159 | data: Theme.of(context).copyWith( 160 | accentColor: color, 161 | brightness: Brightness.dark, 162 | ), 163 | ); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /lib/page/admin/create_server/admincreateserversend.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import '../../auth/shared_preferences_helper.dart'; 18 | import 'package:http/http.dart' as http; 19 | import 'package:pterodactyl_app/models/globals.dart' as globals; 20 | import 'dart:async'; 21 | import 'dart:convert'; 22 | import '../../../main.dart'; 23 | import 'admincreateserverallocations.dart'; 24 | 25 | class AdminCreateServerSendPage extends StatefulWidget { 26 | AdminCreateServerSendPage({Key key, this.server}) : super(key: key); 27 | final Allocations server; 28 | 29 | @override 30 | _AdminCreateServerSendPageState createState() => 31 | new _AdminCreateServerSendPageState(); 32 | } 33 | 34 | class _AdminCreateServerSendPageState extends State { 35 | Map data; 36 | 37 | final _databasesController = TextEditingController(); 38 | 39 | Future postSend() async { 40 | //-----login----// 41 | String _apiadmin = await SharedPreferencesHelper.getString("apiAdminKey"); 42 | String _urladmin = await SharedPreferencesHelper.getString("panelAdminUrl"); 43 | String _adminhttps = await SharedPreferencesHelper.getString("adminhttps"); 44 | var url = '$_adminhttps$_urladmin/api/application/servers'; 45 | 46 | Map data = { 47 | "name": widget.server.servername, 48 | "user": widget.server.userid, 49 | "nest": widget.server.nestid, 50 | "egg": widget.server.eggid, 51 | "docker_image": widget.server.dockerimage, 52 | "startup": widget.server.startup, 53 | "limits": { 54 | "memory": widget.server.limitmemory, 55 | "swap": widget.server.limitswap, 56 | "disk": widget.server.disklimit, 57 | "io": widget.server.iolimit, 58 | "cpu": widget.server.cpulimit 59 | }, 60 | "feature_limits": { 61 | "databases": _databasesController.text, 62 | "allocations": widget.server.allocationsid 63 | }, 64 | "deploy": { 65 | "locations": [widget.server.locationsid], 66 | "dedicated_ip": false, 67 | "port_range": [widget.server.port] 68 | }, 69 | "start_on_completion": true 70 | }; 71 | //encode Map to JSON 72 | var body = json.encode(data); 73 | 74 | var response = await http.post(url, 75 | headers: { 76 | "Accept": "Application/vnd.pterodactyl.v1+json", 77 | "Content-Type": "application/json", 78 | "Authorization": "Bearer $_apiadmin" 79 | }, 80 | body: body); 81 | print("${response.statusCode}"); 82 | print("${response.body}"); 83 | } 84 | 85 | @override 86 | Widget build(BuildContext context) { 87 | return Scaffold( 88 | appBar: AppBar( 89 | elevation: 0.0, 90 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 91 | leading: IconButton( 92 | color: globals.useDarkTheme ? Colors.white : Colors.black, 93 | onPressed: () { 94 | Navigator.of(context).pop(); 95 | }, 96 | icon: Icon(Icons.arrow_back, 97 | color: globals.useDarkTheme ? Colors.white : Colors.black), 98 | ), 99 | title: Text(DemoLocalizations.of(context).trans('admin_create_server_8_8'), 100 | style: TextStyle( 101 | color: globals.useDarkTheme ? Colors.white : Colors.black, 102 | fontWeight: FontWeight.w700)), 103 | ), 104 | body: SafeArea( 105 | child: ListView( 106 | padding: EdgeInsets.symmetric(horizontal: 24.0), 107 | children: [ 108 | SizedBox(height: 20.0), 109 | AccentColorOverride( 110 | color: Colors.red, 111 | child: TextField( 112 | controller: _databasesController, 113 | decoration: InputDecoration( 114 | labelText: DemoLocalizations.of(context).trans('admin_create_server_database_limit'), 115 | ), 116 | ), 117 | ), 118 | ButtonBar( 119 | children: [ 120 | FlatButton( 121 | child: Text(DemoLocalizations.of(context).trans('clear')), 122 | shape: BeveledRectangleBorder( 123 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 124 | ), 125 | onPressed: () { 126 | _databasesController.clear(); 127 | }, 128 | ), 129 | RaisedButton( 130 | child: Text(DemoLocalizations.of(context).trans('admin_create_server')), 131 | elevation: 8.0, 132 | shape: BeveledRectangleBorder( 133 | borderRadius: BorderRadius.all(Radius.circular(7.0)), 134 | ), 135 | onPressed: () { 136 | postSend(); 137 | }, 138 | ), 139 | ], 140 | ), 141 | ], 142 | ), 143 | ), 144 | ); 145 | } 146 | } 147 | 148 | class AccentColorOverride extends StatelessWidget { 149 | const AccentColorOverride({Key key, this.color, this.child}) 150 | : super(key: key); 151 | 152 | final Color color; 153 | final Widget child; 154 | 155 | @override 156 | Widget build(BuildContext context) { 157 | return Theme( 158 | child: child, 159 | data: Theme.of(context).copyWith( 160 | accentColor: color, 161 | brightness: Brightness.dark, 162 | ), 163 | ); 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /lib/page/auth/2fa.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:pinput/pin_put/pin_put.dart'; 5 | 6 | 7 | class Login2faPage extends StatefulWidget { 8 | @override 9 | _Login2faPageState createState() => _Login2faPageState(); 10 | } 11 | 12 | class _Login2faPageState extends State { 13 | bool _unFocus = false; 14 | 15 | @override 16 | void initState() { 17 | setTimeOut(); 18 | super.initState(); 19 | } 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return MaterialApp( 24 | theme: ThemeData( 25 | primaryColor: Colors.green, 26 | hintColor: Colors.green, 27 | ), 28 | home: Scaffold( 29 | body: Builder( 30 | builder: (context) => Container( 31 | padding: const EdgeInsets.symmetric(horizontal: 40.0), 32 | child: Center( 33 | child: PinPut( 34 | fieldsCount: 7, 35 | unFocusWhen: _unFocus, 36 | onSubmit: (String pin) => _showSnackBar(pin, context), 37 | ), 38 | ), 39 | ), 40 | ))); 41 | } 42 | 43 | void _showSnackBar(String pin, BuildContext context) { 44 | final snackBar = SnackBar( 45 | duration: Duration(seconds: 3), 46 | content: Container( 47 | height: 80.0, 48 | child: Center( 49 | child: Text( 50 | 'Pin Submitted. Value: $pin', 51 | style: TextStyle(fontSize: 25.0), 52 | ), 53 | )), 54 | backgroundColor: Colors.greenAccent, 55 | ); 56 | Scaffold.of(context).showSnackBar(snackBar); 57 | } 58 | 59 | void setTimeOut() { 60 | Stream.periodic(Duration(seconds: 5)).listen((r) { 61 | setState(() { 62 | _unFocus = !_unFocus; 63 | }); 64 | }); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /lib/page/auth/auth.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'dart:async'; 17 | 18 | import 'package:flutter/material.dart'; 19 | import 'package:http/http.dart' as http; 20 | import 'package:pterodactyl_app/main.dart'; 21 | import 'package:pterodactyl_app/page/admin/adminhome.dart'; 22 | import 'package:pterodactyl_app/page/auth/shared_preferences_helper.dart'; 23 | import 'package:pterodactyl_app/page/client/home.dart'; 24 | import 'package:shared_preferences/shared_preferences.dart'; 25 | 26 | class Splash extends StatefulWidget { 27 | @override 28 | SplashState createState() => new SplashState(); 29 | } 30 | 31 | class SplashState extends State { 32 | 33 | String company; 34 | SplashState() { 35 | this.company = ''; 36 | } 37 | 38 | Future checkSeen() async { 39 | SharedPreferences prefs = await SharedPreferences.getInstance(); 40 | 41 | this.company = prefs.get('company') != null 42 | ? prefs.getString('company') 43 | : ''; 44 | 45 | if(prefs.containsKey('seen_admin') && prefs.getBool('seen_admin')) { 46 | checkAuthentication(isAdmin: true, prefs: prefs); 47 | return; 48 | } 49 | 50 | checkAuthentication(prefs: prefs); 51 | 52 | } 53 | 54 | Future checkAuthentication({isAdmin = false, SharedPreferences prefs}) async { 55 | isAuthenticated(isAdmin: isAdmin).then((bool) => { 56 | prefs.setBool('seen_' + (isAdmin ? 'admin' : 'client'), true).then((bool) { 57 | if(this.company.isEmpty) { 58 | Navigator.of(context).pushReplacement( 59 | new MaterialPageRoute(builder: (context) => 60 | isAdmin ? new AdminHomePage() : new MyHomePage()) 61 | ); 62 | } else { 63 | Navigator.of(context).pushReplacementNamed( 64 | isAdmin 65 | ? '/' + (this.company.isNotEmpty ? this.company + '/' : '') + 'admin/home' 66 | : '/' + (this.company.isNotEmpty ? this.company + '/' : '') + 'home'); 67 | } 68 | }) 69 | }); 70 | } 71 | 72 | Future isAuthenticated({isAdmin = false}) async { 73 | String _api, _https, _url, _route; 74 | if (isAdmin) { 75 | // Set authentication check route 76 | _route = "/application/servers"; 77 | _api = await SharedPreferencesHelper.getString("apiAdminKey"); 78 | _https = await SharedPreferencesHelper.getString("adminhttps"); 79 | _url = await SharedPreferencesHelper.getString("panelAdminUrl"); 80 | 81 | } else { 82 | // Set authentication check route 83 | _route = "/client"; 84 | _api = await SharedPreferencesHelper.getString("apiKey"); 85 | _https = await SharedPreferencesHelper.getString("https"); 86 | _url = await SharedPreferencesHelper.getString("panelUrl"); 87 | } 88 | 89 | // Host cannot be empty, otherwise an exception will occur. 90 | if(_https.isEmpty) { 91 | await Navigator.of(context).pushNamedAndRemoveUntil('/selecthost', (Route route) => false); 92 | return false; 93 | } 94 | 95 | http.Response response = await http.get( 96 | "$_https$_url/api$_route", 97 | headers: { 98 | "Accept": "Application/vnd.pterodactyl.v1+json", 99 | "Authorization": "Bearer $_api" 100 | }, 101 | ); 102 | 103 | if (response.statusCode == 401) { 104 | // Todo fix Navigation context for logging out if key isn't available 105 | SharedPreferencesHelper.remove('apiKey'); 106 | SharedPreferencesHelper.remove('apiAdminKey'); 107 | Navigator.of(context).pushNamedAndRemoveUntil( 108 | '/' + (this.company.isNotEmpty ? this.company + '/' : '') + (isAdmin ? 'admin' : '') + 'login', ( 109 | Route route) => false); 110 | } 111 | 112 | return true; 113 | 114 | } 115 | 116 | Future isCompanyLogin() async { 117 | SharedPreferences prefs = await SharedPreferences.getInstance(); 118 | return prefs.containsKey('company'); 119 | } 120 | 121 | @override 122 | void initState() { 123 | super.initState(); 124 | 125 | checkSeen(); 126 | } 127 | 128 | @override 129 | Widget build(BuildContext context) { 130 | return new Scaffold( 131 | body: new Center( 132 | child: new Text(DemoLocalizations.of(context).trans('loading'), 133 | style: TextStyle(fontSize: 50)), 134 | ), 135 | ); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /lib/page/auth/check_update.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'dart:io'; 17 | import 'package:flutter/foundation.dart'; 18 | import 'package:flutter/material.dart'; 19 | import 'package:url_launcher/url_launcher.dart'; 20 | import 'package:package_info/package_info.dart'; 21 | import 'package:flutter/cupertino.dart'; 22 | import 'package:firebase_remote_config/firebase_remote_config.dart'; 23 | 24 | const APP_STORE_URL = 25 | 'https://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=YOUR-APP-ID&mt=8'; 26 | const PLAY_STORE_URL = 27 | 'https://play.google.com/store/apps/details?id=nl.rubentalstra.pterodactyl_app'; 28 | 29 | versionCheck(context) async { 30 | // Check if is debug then don't show message 31 | if(!kReleaseMode) return; 32 | 33 | //Get Current installed version of app 34 | final PackageInfo info = await PackageInfo.fromPlatform(); 35 | double currentVersion = double.parse(info.version.trim().replaceAll(".", "")); 36 | 37 | //Get Latest version info from firebase config 38 | final RemoteConfig remoteConfig = await RemoteConfig.instance; 39 | 40 | try { 41 | // Using default duration to force fetching from remote server. 42 | await remoteConfig.fetch(expiration: const Duration(seconds: 0)); 43 | await remoteConfig.activateFetched(); 44 | 45 | double newVersion = double.parse(remoteConfig 46 | .getString('force_update_current_version') 47 | .trim() 48 | .replaceAll(".", "")); 49 | if (newVersion > currentVersion) { 50 | _showVersionDialog(context); 51 | } 52 | } on FetchThrottledException catch (exception) { 53 | // Fetch throttled. 54 | print(exception); 55 | } catch (exception) { 56 | print('Unable to fetch remote config. Cached or default values will be ' 57 | 'used'); 58 | } 59 | } 60 | 61 | _showVersionDialog(context) async { 62 | await showDialog( 63 | context: context, 64 | barrierDismissible: false, 65 | builder: (BuildContext context) { 66 | String title = "New Update Available"; 67 | String message = 68 | "There is a newer version of app available please update it now."; 69 | String btnLabel = "Update Now"; 70 | return Platform.isIOS 71 | ? new CupertinoAlertDialog( 72 | title: Text(title), 73 | content: Text(message), 74 | actions: [ 75 | FlatButton( 76 | child: Text(btnLabel), 77 | onPressed: () => _launchURL(APP_STORE_URL), 78 | ), 79 | ], 80 | ) 81 | : new AlertDialog( 82 | title: Text(title), 83 | content: Text(message), 84 | actions: [ 85 | FlatButton( 86 | child: Text(btnLabel), 87 | onPressed: () => _launchURL(PLAY_STORE_URL), 88 | ), 89 | ], 90 | ); 91 | }, 92 | ); 93 | } 94 | 95 | _launchURL(String url) async { 96 | if (await canLaunch(url)) { 97 | await launch(url); 98 | } else { 99 | throw 'Could not launch $url'; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /lib/page/auth/partnerlist.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | class PartnerList { 17 | String name; 18 | String url; 19 | String message; 20 | Map logo; 21 | Map color; 22 | 23 | 24 | 25 | PartnerList({String name, String url, String message, Map logo, Map color}) { 26 | this.name = name; 27 | this.url = url; 28 | this.message = message; 29 | this.logo = logo; 30 | this.color = color; 31 | } 32 | 33 | // Idk what the fuck is happening here 34 | static final List partnerList = [ 35 | PartnerList( 36 | name: "Deploys.io", 37 | url: "https://deploys.io/", 38 | message: "", 39 | logo: { 40 | "dark": "https://pbs.twimg.com/profile_images/1010254773826793472/vjxA9idJ_400x400.jpg", 41 | "light": "https://pbs.twimg.com/profile_images/1010254773826793472/vjxA9idJ_400x400.jpg" 42 | }, 43 | color: { 44 | "primary": "#5e72e4 #825ee4 (Gradient)", 45 | "secondary": "#172b4d" 46 | }, 47 | ), 48 | PartnerList( 49 | name: "CodersLight LLC", 50 | url: "https://coderslight.com/", 51 | message: "", 52 | logo: { 53 | "dark": "https://avatars2.githubusercontent.com/u/35084758?s=280&v=4", 54 | "light": "https://cdn.discordapp.com/attachments/575721214643798036/589462220119736340/CodersLightDiscordLogo-transparent.png" 55 | }, 56 | color: { 57 | "primary": "", 58 | "secondary": "" 59 | }, 60 | ), 61 | PartnerList( 62 | name: "AccurateNode", 63 | url: "https://accuratenode.com/", 64 | message: "", 65 | logo: { 66 | "dark": "https://accuratenode.com/assets/img/icon.png", 67 | "light": "https://cdn.discordapp.com/attachments/579475423977668638/590143718703759360/logo_big.png" 68 | }, 69 | color: { 70 | "primary": "", 71 | "secondary": "" 72 | }, 73 | ), 74 | PartnerList( 75 | name: "MiniCenter", 76 | url: "https://minicenter.net/", 77 | message: "", 78 | logo: { 79 | "dark": "https://cdn.discordapp.com/attachments/487345256065662978/535521341340909588/image0.png", 80 | "light": "https://cdn.discordapp.com/attachments/487345256065662978/535521341340909588/image0.png" 81 | }, 82 | color: { 83 | "primary": "", 84 | "secondary": "" 85 | }, 86 | ), 87 | PartnerList( 88 | name: "PlanetNode", 89 | url: "https://planetnode.net/", 90 | message: "", 91 | logo: { 92 | "dark": "https://planetnode.net/templates/planetnode/img/header/logo.png", 93 | "light": "https://planetnode.net/templates/planetnode/img/header/logo-b.png" 94 | }, 95 | color: { 96 | "primary": "", 97 | "secondary": "" 98 | }, 99 | ), 100 | PartnerList( 101 | name: "ReviveNode Hosting", 102 | url: "https://revivenode.com/", 103 | message: "", 104 | logo: { 105 | "dark": "https://cdn.discordapp.com/attachments/582365380798971934/589519836997222420/RLogo.png", 106 | "light": "https://cdn.discordapp.com/attachments/582365380798971934/589519836997222420/RLogo.png" 107 | }, 108 | color: { 109 | "primary": "", 110 | "secondary": "" 111 | }, 112 | ), 113 | PartnerList( 114 | name: "RoyaleHosting", 115 | url: "http://royalehosting.nl/", 116 | message: "", 117 | logo: { 118 | "dark": "https://cdn.discordapp.com/attachments/578493714410766356/593450984941027330/logo.png", 119 | "light": "https://cdn.discordapp.com/attachments/578493714410766356/593450857039659052/0x0.png" 120 | }, 121 | color: { 122 | "primary": "", 123 | "secondary": "" 124 | }, 125 | ), 126 | ]; 127 | } -------------------------------------------------------------------------------- /lib/page/auth/shared_preferences_helper.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:shared_preferences/shared_preferences.dart'; 17 | 18 | class SharedPreferencesHelper { 19 | static Future setString(String key, String value) async { 20 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 21 | 22 | return prefs.setString(key, value); 23 | } 24 | 25 | static Future getString(String key) async { 26 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 27 | 28 | return prefs.getString(key) ?? ''; 29 | } 30 | 31 | static remove(String key) async { 32 | final SharedPreferences prefs = await SharedPreferences.getInstance(); 33 | 34 | prefs.remove(key); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/auth/sponsorlist.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | class SponsorList { 17 | final String avatarUrl; 18 | final String name; 19 | final String donation; 20 | final String message; 21 | final String link; 22 | 23 | SponsorList( 24 | {this.avatarUrl, this.name, this.donation, this.message, this.link}); 25 | 26 | static final List sponsorList = [ 27 | SponsorList( 28 | avatarUrl: 29 | "https://s3-eu-west-1.amazonaws.com/tpd/logos/5c033220e32b98000128f214/0x0.png", 30 | name: "Thunderbolt Hosting", 31 | donation: "Apple License", 32 | message: "https://thunderbolt-hosting.com/", 33 | link: "https://thunderbolt-hosting.com/", 34 | ), 35 | SponsorList( 36 | avatarUrl: "https://i.coderslight.com/CodersLight_Logo.png", 37 | name: "CodersLight LLC", 38 | donation: "\$25.00 CAD", 39 | message: "https://coderslight.com/", 40 | link: "https://coderslight.com/", 41 | ), 42 | SponsorList( 43 | avatarUrl: 44 | "https://raw.githubusercontent.com/rubentalstra/Pterodactyl-app/master/assets/images/minicenter_logo.png", 45 | name: "MiniCenter", 46 | donation: "\$21.53 CAD", 47 | message: "https://www.minicenter.net/", 48 | link: "https://www.minicenter.net/", 49 | ), 50 | SponsorList( 51 | avatarUrl: 52 | "https://pbs.twimg.com/profile_images/1010254773826793472/vjxA9idJ_400x400.jpg", 53 | name: "Deploys.io", 54 | donation: "Website and WebHost", 55 | message: "https://deploys.io/", 56 | link: 57 | "https://deploys.io/share/104?utm_source=ruben-app&utm_medium=sponsors&utm_campaign=list", 58 | ), 59 | SponsorList( 60 | avatarUrl: "https://avatars0.githubusercontent.com/u/50382144?s=460&v=4", 61 | name: "Jordy", 62 | donation: "Android License", 63 | message: "", 64 | link: "", 65 | ), 66 | SponsorList( 67 | avatarUrl: 68 | "", 69 | name: "MyServerPlanet", 70 | donation: "\$15.00 CAD", 71 | message: "MyServerPlanet started in 2014 set out to sell affordable reseller hosting with WHMCS included - MyServerPlanet sells WHMCS resellers for £12.50/month.", 72 | link: "https://myserverplanet.com/", 73 | ), 74 | SponsorList( 75 | avatarUrl: 76 | "", 77 | name: "Gabriel", 78 | donation: "\$10.00 USD", 79 | message: "", 80 | link: "", 81 | ), 82 | SponsorList( 83 | avatarUrl: "https://cdn.discordapp.com/attachments/581892189341089822/581897822589157377/SBL2kBlack_ThatDarkGreenShit-DarkBlue_grad.png", 84 | name: "Sam Walsh", 85 | donation: "€8,00 EURO", 86 | message: "<3", 87 | link: "https://samjw.xyz", 88 | ), 89 | SponsorList( 90 | avatarUrl: "", 91 | name: "FalixNodes (ItzAwesome)", 92 | donation: "£3.00 GBP", 93 | message: "Monthly Supporter <3", 94 | link: "https://falixnodes.host/", 95 | ), 96 | SponsorList( 97 | avatarUrl: 98 | "https://pbs.twimg.com/profile_images/1104864471581949952/q4wO6V9c_400x400.jpg", 99 | name: "Skoali", 100 | donation: "€5,00 EURO", 101 | message: "https://skoali.fr/", 102 | link: "https://skoali.fr/", 103 | ), 104 | SponsorList( 105 | avatarUrl: 106 | "https://raw.githubusercontent.com/rubentalstra/Pterodactyl-app/master/assets/images/discord2.png", 107 | name: "AccurateNode", 108 | donation: "€5,00 EURO", 109 | message: "https://accuratenode.com/", 110 | link: "https://accuratenode.com/", 111 | ), 112 | ]; 113 | } 114 | -------------------------------------------------------------------------------- /lib/page/client/filemanager/fileviewer.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 HoneyBadger9 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import 'package:flutter/material.dart'; 18 | import 'package:photo_view/photo_view.dart'; 19 | import 'package:pterodactyl_app/page/client/filemanager/fileactions.dart'; 20 | import 'package:pterodactyl_app/page/client/filemanager/filemanager.dart'; 21 | import 'package:pterodactyl_app/page/client/filemanager/texteditor.dart'; 22 | import 'package:pterodactyl_app/page/client/filemanager/widgets/CustomTooltip.dart'; 23 | import 'package:pterodactyl_app/page/client/filemanager/widgets/ReusableDialog.dart'; 24 | import 'package:pterodactyl_app/page/client/filemanager/widgets/SyntaxHighlighter.dart'; 25 | 26 | ///FileViewer is used by FileManager to show files before editing. 27 | class FileViewer extends StatefulWidget { 28 | final FileData fileData; 29 | final FileActions fileActions; 30 | 31 | const FileViewer({ 32 | @required this.fileData, 33 | @required this.fileActions, 34 | }); 35 | 36 | @override 37 | _FileViewerState createState() => _FileViewerState(); 38 | } 39 | 40 | class _FileViewerState extends State { 41 | final fileViewerScaffoldKey = GlobalKey(); 42 | 43 | @override 44 | Widget build(BuildContext context) { 45 | return Scaffold( 46 | key: fileViewerScaffoldKey, 47 | appBar: AppBar( 48 | backgroundColor: Colors.white, 49 | title: CustomTooltip( 50 | message: widget.fileData.name, 51 | child: Text( 52 | widget.fileData.name, 53 | style: TextStyle( 54 | color: Colors.black, 55 | ), 56 | ), 57 | ), 58 | actions: [ 59 | CustomTooltip( 60 | message: "Delete this file", 61 | child: IconButton( 62 | icon: Icon( 63 | Icons.delete, 64 | ), 65 | onPressed: _delete, 66 | ), 67 | ), 68 | if (widget.fileData.type == FileType.Text) 69 | CustomTooltip( 70 | message: "Edit this file", 71 | child: IconButton( 72 | icon: Icon( 73 | Icons.edit, 74 | ), 75 | onPressed: _edit, 76 | ), 77 | ), 78 | ], 79 | ), 80 | body: widget.fileData.type == FileType.Image ? _showImage() : _showText(), 81 | ); 82 | } 83 | 84 | void _delete() { 85 | showDialog( 86 | context: context, 87 | barrierDismissible: true, 88 | builder: (BuildContext context) => ReusableDialog( 89 | "Are you sure?", 90 | "Do you really want to delete this ${widget.fileData.type == FileType.Folder ? "folder" : "file"}: ${widget.fileData.name}", 91 | button1Text: "NO", 92 | button1Function: () {}, 93 | button2Text: "Yes, delete it.", 94 | button2Function: () => Navigator.of(context).pop(true), 95 | //popping this page with true means the previous page will process functions to delete it. MUST use only when needed. 96 | )); 97 | } 98 | 99 | Widget _showImage() { 100 | return Container( 101 | decoration: BoxDecoration( 102 | color: Colors.grey, 103 | ), 104 | child: PhotoView( 105 | backgroundDecoration: BoxDecoration(color: Colors.grey), 106 | maxScale: 2.00, 107 | minScale: 0.3, 108 | imageProvider: NetworkImage( 109 | //TODO 110 | widget.fileActions.getCompleteApiAddress(widget.fileData), 111 | headers: { 112 | "Accept": widget.fileData.mime, 113 | "Authorization": "Bearer ${widget.fileActions.getApiKey()}", 114 | }), 115 | enableRotation: false, 116 | ), 117 | ); 118 | } 119 | 120 | Widget _showText() { 121 | return FutureBuilder( 122 | future: widget.fileActions.getFile(widget.fileData), 123 | builder: (BuildContext context, AsyncSnapshot snapshot) { 124 | if (snapshot.data == null) { 125 | return Center( 126 | child: Column( 127 | mainAxisAlignment: MainAxisAlignment.center, 128 | children: [ 129 | CircularProgressIndicator(), 130 | SizedBox( 131 | height: 10, 132 | ), 133 | Text("Loading file"), 134 | ], 135 | ), 136 | ); 137 | } 138 | return _textContainer(snapshot.data); 139 | }); 140 | } 141 | 142 | Widget RichTextForConsole(List list) { 143 | List richies = []; 144 | list.forEach((t) { 145 | richies.add(Row(children: [Container(child: RichText(text: t))])); 146 | }); 147 | return Row( 148 | children: richies, 149 | ); 150 | } 151 | 152 | Widget _textContainer(String text) { 153 | List t = text.split("\n"); 154 | List res = []; 155 | SyntaxHighlighter dart = new DartSyntaxHighlighter(); 156 | t.forEach((d) { 157 | if (d != null) { 158 | res.add(dart.format(d)); 159 | } 160 | }); 161 | return Container( 162 | height: double.infinity, 163 | width: double.infinity, 164 | padding: EdgeInsets.all(10), 165 | decoration: BoxDecoration( 166 | color: Colors.grey, 167 | ), 168 | child: Container( 169 | decoration: BoxDecoration( 170 | color: Colors.white, 171 | ), 172 | child: Scrollbar( 173 | child: SingleChildScrollView( 174 | child: Container( 175 | padding: EdgeInsets.all(10), child: RichTextForConsole(res))), 176 | ), 177 | ), 178 | ); 179 | } 180 | 181 | void _edit() { 182 | var route = MaterialPageRoute( 183 | builder: (BuildContext context) => TextEditorPage( 184 | fileData: widget.fileData, 185 | fileActions: widget.fileActions, 186 | )); 187 | Navigator.of(context).push(route); 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/CustomTooltip.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 HoneyBadger9 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import 'package:flutter/material.dart'; 18 | import 'package:pterodactyl_app/widgets/tooltip/tooltip.dart' as tooltip; 19 | 20 | class CustomTooltip extends StatelessWidget { 21 | final String message; 22 | final Widget child; 23 | const CustomTooltip({ 24 | @required this.message, 25 | @required this.child, 26 | }); 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | return tooltip.Tooltip( 31 | message: message, 32 | child: child, 33 | showDuration: Duration(milliseconds: 1000), 34 | decoration: BoxDecoration( 35 | color: Colors.white.withOpacity(1), 36 | border: Border.all( 37 | width: 1, 38 | color: Colors.black, 39 | ), 40 | borderRadius: BorderRadius.circular(3), 41 | ), 42 | ); 43 | } 44 | } -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/ErrorSnackbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ErrorSnackbar extends SnackBar { 4 | @override 5 | Widget build(BuildContext context) { 6 | return SnackBar( 7 | content: Row( 8 | children: [ 9 | Icon(Icons.error), 10 | SizedBox(width: 10), 11 | Text("An error occured, please try again later.") 12 | ], 13 | ), 14 | duration: Duration( 15 | milliseconds: 1000, 16 | ), 17 | 18 | ); 19 | } 20 | } -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/ReusableDialog.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 HoneyBadger9 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import 'package:flutter/material.dart'; 18 | import 'package:flutter/cupertino.dart'; 19 | import 'dart:io'; 20 | 21 | class ReusableDialog extends StatelessWidget { 22 | final String title; 23 | final String description; 24 | final String button1Text; 25 | final Function button1Function; 26 | final String button2Text; 27 | final Function button2Function; 28 | 29 | const ReusableDialog( 30 | this.title, 31 | this.description, 32 | { 33 | this.button1Text, 34 | this.button1Function, 35 | this.button2Text, 36 | this.button2Function, 37 | } 38 | ); 39 | 40 | @override 41 | Widget build(BuildContext context) { 42 | return Platform.isIOS 43 | ? new CupertinoAlertDialog( 44 | title: Text(title), 45 | content: Text(description), 46 | actions: [ 47 | if(button1Function != null) FlatButton( 48 | child: Text(button1Text ?? "NO"), 49 | onPressed: () { 50 | Navigator.of(context).pop(); 51 | button1Function(); 52 | } 53 | ), 54 | FlatButton( 55 | child: Text(button2Text ?? "OK"), 56 | onPressed: () { 57 | Navigator.of(context).pop(); 58 | if(button2Function != null) button2Function(); 59 | }) 60 | ], 61 | ) 62 | : new AlertDialog( 63 | title: Text( 64 | title, 65 | ), 66 | content: Column( 67 | mainAxisSize: MainAxisSize.min, 68 | mainAxisAlignment: MainAxisAlignment.start, 69 | crossAxisAlignment: CrossAxisAlignment.start, 70 | children: [ 71 | Flexible( 72 | child: Text( 73 | description, 74 | ), 75 | ), 76 | ], 77 | ), 78 | actions: [ 79 | if(button1Function != null) FlatButton( 80 | child: Text(button1Text ?? "NO"), 81 | onPressed: () { 82 | Navigator.of(context).pop(); 83 | button1Function(); 84 | } 85 | ), 86 | FlatButton( 87 | child: Text(button2Text ?? "OK"), 88 | onPressed: () { 89 | Navigator.of(context).pop(); 90 | if(button2Function != null) button2Function(); 91 | }) 92 | ], 93 | ); 94 | } 95 | } -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/createdialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/cupertino.dart'; 3 | import 'dart:io'; 4 | 5 | class CreateDialog extends StatelessWidget { 6 | final TextEditingController controller; 7 | final String title; 8 | final Function onSubmitted; 9 | 10 | const CreateDialog({ 11 | @required this.controller, 12 | @required this.title, 13 | @required this.onSubmitted, 14 | }); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Platform.isIOS 19 | ? new CupertinoAlertDialog( 20 | title: Text(title), 21 | content: Container( 22 | child: TextField( 23 | controller: controller, 24 | autofocus: true, 25 | maxLines: 1, 26 | autocorrect: false, 27 | keyboardType: TextInputType.text, 28 | textInputAction: TextInputAction.done, 29 | ), 30 | ), 31 | actions: [ 32 | FlatButton( 33 | child: Text("Create"), 34 | onPressed: () { 35 | Navigator.of(context).pop(); 36 | onSubmitted(); 37 | }, 38 | ) 39 | ], 40 | ) 41 | : new AlertDialog( 42 | title: Text(title), 43 | content: Container( 44 | child: TextField( 45 | controller: controller, 46 | autofocus: true, 47 | maxLines: 1, 48 | autocorrect: false, 49 | keyboardType: TextInputType.text, 50 | textInputAction: TextInputAction.done, 51 | ), 52 | ), 53 | actions: [ 54 | FlatButton( 55 | child: Text("Create"), 56 | onPressed: () { 57 | Navigator.of(context).pop(); 58 | onSubmitted(); 59 | }, 60 | ) 61 | ], 62 | ); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/extras.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 HoneyBadger9 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import 'package:flutter/cupertino.dart'; 18 | import 'dart:io'; 19 | 20 | showComingSoonDialog(BuildContext context) { 21 | return showDialog( 22 | context: context, 23 | barrierDismissible: true, 24 | builder: (BuildContext context) { 25 | return Platform.isIOS 26 | ? new CupertinoAlertDialog( 27 | title: Text("COMING SOON"), 28 | content: Container( 29 | child: TextField( 30 | autofocus: true, 31 | maxLines: 1, 32 | autocorrect: false, 33 | keyboardType: TextInputType.text, 34 | textInputAction: TextInputAction.done, 35 | ), 36 | ), 37 | actions: [ 38 | FlatButton( 39 | child: Text("OK"), 40 | onPressed: () => Navigator.of(context).pop(), 41 | ) 42 | ], 43 | ) 44 | : new AlertDialog( 45 | title: Text("COMING SOON"), 46 | content: Container( 47 | child: TextField( 48 | autofocus: true, 49 | maxLines: 1, 50 | autocorrect: false, 51 | keyboardType: TextInputType.text, 52 | textInputAction: TextInputAction.done, 53 | ), 54 | ), 55 | actions: [ 56 | FlatButton( 57 | child: Text("OK"), 58 | onPressed: () => Navigator.of(context).pop(), 59 | ) 60 | ], 61 | ); 62 | }); 63 | } 64 | -------------------------------------------------------------------------------- /lib/page/client/filemanager/widgets/readTimestamp.dart: -------------------------------------------------------------------------------- 1 | import 'package:timeago/timeago.dart' as TimeAgo; 2 | 3 | String readTimestamp(int timestamp, {bool intoThousand = false}){ 4 | 5 | var now = new DateTime.now(); 6 | var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * (intoThousand ? 1000 : 1)); 7 | var diff = now.difference(date); 8 | 9 | final timeago = new DateTime.now().subtract(diff); 10 | 11 | return TimeAgo.format( 12 | timeago, 13 | ); 14 | 15 | } -------------------------------------------------------------------------------- /lib/page/client/home.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import 'package:pterodactyl_app/page/client/home/menu_page.dart'; 18 | import 'package:pterodactyl_app/page/client/home/zoom_scaffold.dart'; 19 | 20 | 21 | class MyHomePage extends StatefulWidget { 22 | 23 | 24 | @override 25 | _MyHomePageState createState() => _MyHomePageState(); 26 | } 27 | 28 | class _MyHomePageState extends State { 29 | 30 | 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | return new ZoomScaffold( 35 | menuScreen: MenuScreen(), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/page/client/home/circular_image.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class CircularImage extends StatelessWidget { 19 | final double _width, _height; 20 | final ImageProvider image; 21 | 22 | CircularImage(this.image, {double width = 40, double height = 40}) 23 | : _width = width, 24 | _height = height; 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return Container( 29 | width: _width, 30 | height: _height, 31 | decoration: BoxDecoration( 32 | shape: BoxShape.circle, 33 | image: DecorationImage(image: image)), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/client/settings/circular_image.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class CircularImage extends StatelessWidget { 19 | final double _width, _height; 20 | final ImageProvider image; 21 | 22 | CircularImage(this.image, {double width = 50, double height = 50}) 23 | : _width = width, 24 | _height = height; 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return Container( 29 | width: _width, 30 | height: _height, 31 | decoration: BoxDecoration( 32 | shape: BoxShape.circle, 33 | image: DecorationImage(image: image)), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/accuratenode/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class AccurateNodeAboutPage extends StatefulWidget { 19 | @override 20 | _AccurateNodeAboutPageState createState() => new _AccurateNodeAboutPageState(); 21 | } 22 | 23 | class _AccurateNodeAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/coderslight/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class CodersLightAboutPage extends StatefulWidget { 19 | @override 20 | _CodersLightAboutPageState createState() => new _CodersLightAboutPageState(); 21 | } 22 | 23 | class _CodersLightAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/companies.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | import 'package:flutter/material.dart'; 18 | 19 | // AccurateNode 20 | import 'package:pterodactyl_app/page/company/accuratenode/client/home.dart'; 21 | import 'package:pterodactyl_app/page/company/accuratenode/client/login.dart'; 22 | import 'package:pterodactyl_app/page/company/accuratenode/client/servers.dart'; 23 | import 'package:pterodactyl_app/page/company/accuratenode/client/about.dart'; 24 | import 'package:pterodactyl_app/page/company/accuratenode/client/settings.dart'; 25 | 26 | // CodersLight 27 | import 'package:pterodactyl_app/page/company/coderslight/client/home.dart'; 28 | import 'package:pterodactyl_app/page/company/coderslight/client/login.dart'; 29 | import 'package:pterodactyl_app/page/company/coderslight/client/servers.dart'; 30 | import 'package:pterodactyl_app/page/company/coderslight/client/about.dart'; 31 | import 'package:pterodactyl_app/page/company/coderslight/client/settings.dart'; 32 | 33 | // Deploys 34 | import 'package:pterodactyl_app/page/company/deploys/client/home.dart'; 35 | import 'package:pterodactyl_app/page/company/deploys/client/login.dart'; 36 | import 'package:pterodactyl_app/page/company/deploys/client/about.dart'; 37 | import 'package:pterodactyl_app/page/company/deploys/client/settings.dart'; 38 | 39 | // MiniCenter 40 | import 'package:pterodactyl_app/page/company/minicenter/client/home.dart'; 41 | import 'package:pterodactyl_app/page/company/minicenter/client/login.dart'; 42 | import 'package:pterodactyl_app/page/company/minicenter/client/servers.dart'; 43 | import 'package:pterodactyl_app/page/company/minicenter/client/about.dart'; 44 | import 'package:pterodactyl_app/page/company/minicenter/client/settings.dart'; 45 | 46 | // PlanetNode 47 | import 'package:pterodactyl_app/page/company/planetnode/client/home.dart'; 48 | import 'package:pterodactyl_app/page/company/planetnode/client/login.dart'; 49 | import 'package:pterodactyl_app/page/company/planetnode/client/servers.dart'; 50 | import 'package:pterodactyl_app/page/company/planetnode/client/about.dart'; 51 | import 'package:pterodactyl_app/page/company/planetnode/client/settings.dart'; 52 | 53 | // ReviveNode 54 | import 'package:pterodactyl_app/page/company/revivenode/client/home.dart'; 55 | import 'package:pterodactyl_app/page/company/revivenode/client/login.dart'; 56 | import 'package:pterodactyl_app/page/company/revivenode/client/servers.dart'; 57 | import 'package:pterodactyl_app/page/company/revivenode/client/about.dart'; 58 | import 'package:pterodactyl_app/page/company/revivenode/client/settings.dart'; 59 | 60 | // RoyaleHosting 61 | import 'package:pterodactyl_app/page/company/royalehosting/client/home.dart'; 62 | import 'package:pterodactyl_app/page/company/royalehosting/client/login.dart'; 63 | import 'package:pterodactyl_app/page/company/royalehosting/client/servers.dart'; 64 | import 'package:pterodactyl_app/page/company/royalehosting/client/about.dart'; 65 | import 'package:pterodactyl_app/page/company/royalehosting/client/settings.dart'; 66 | 67 | /// Dart has no functionality to dynamically create class instances 68 | /// Till then, we'll have to manually add every route. 69 | Map companyRoutes() { 70 | Map c = {}; 71 | c['accuratenode'] = { 72 | '/accuratenode/home': (BuildContext context) => new MyAccurateNodeHomePage(), 73 | '/accuratenode/login': (BuildContext context) => new LoginAccurateNodePage(), 74 | '/accuratenode/servers': (BuildContext context) => new AccurateNodeServerListPage(), 75 | '/accuratenode/about': (BuildContext context) => new AccurateNodeAboutPage(), 76 | '/accuratenode/settings': (BuildContext context) => new AccurateNodeSettingsList(), 77 | }; 78 | c['coderslight'] = { 79 | '/coderslight/home': (BuildContext context) => new MyCodersLightHomePage(), 80 | '/coderslight/login': (BuildContext context) => new LoginCodersLightPage(), 81 | '/coderslight/servers': (BuildContext context) => new CodersLightServerListPage(), 82 | '/coderslight/about': (BuildContext context) => new CodersLightAboutPage(), 83 | '/coderslight/settings': (BuildContext context) => new CodersLightSettingsList(), 84 | }; 85 | c['deploys'] = { 86 | '/deploys/home': (BuildContext context) => new MyDeploysHomePage(), 87 | '/deploys/login': (BuildContext context) => new LoginDeploysPage(), 88 | '/deploys/about': (BuildContext context) => new DeploysAboutPage(), 89 | '/deploys/settings': (BuildContext context) => new DeploysSettingsList(), 90 | }; 91 | c['minicenter'] = { 92 | '/minicenter/home': (BuildContext context) => new MyMiniCenterHomePage(), 93 | '/minicenter/login': (BuildContext context) => new LoginMiniCenterPage(), 94 | '/minicenter/servers': (BuildContext context) => new MiniCenterServerListPage(), 95 | '/minicenter/about': (BuildContext context) => new MiniCenterAboutPage(), 96 | '/minicenter/settings': (BuildContext context) => new MiniCenterSettingsList(), 97 | }; 98 | c['planetnode'] = { 99 | '/planetnode/home': (BuildContext context) => new MyPlanetNodeHomePage(), 100 | '/planetnode/login': (BuildContext context) => new LoginPlanetNodePage(), 101 | '/planetnode/servers': (BuildContext context) => new PlanetNodeServerListPage(), 102 | '/planetnode/about': (BuildContext context) => new PlanetNodeAboutPage(), 103 | '/planetnode/settings': (BuildContext context) => new PlanetNodeSettingsList(), 104 | }; 105 | c['revivenode'] = { 106 | '/revivenode/home': (BuildContext context) => new MyReviveNodeHomePage(), 107 | '/revivenode/login': (BuildContext context) => new LoginReviveNodePage(), 108 | '/revivenode/servers': (BuildContext context) => new ReviveNodeServerListPage(), 109 | '/revivenode/about': (BuildContext context) => new ReviveNodeAboutPage(), 110 | '/revivenode/settings': (BuildContext context) => new ReviveNodeSettingsList(), 111 | }; 112 | c['royalehosting'] = { 113 | '/royalehosting/home': (BuildContext context) => new MyRoyaleHostingHomePage(), 114 | '/royalehosting/login': (BuildContext context) => new LoginRoyaleHostingPage(), 115 | '/royalehosting/servers': (BuildContext context) => new RoyaleHostingServerListPage(), 116 | '/royalehosting/about': (BuildContext context) => new RoyaleHostingAboutPage(), 117 | '/royalehosting/settings': (BuildContext context) => new RoyaleHostingSettingsList(), 118 | }; 119 | return c; 120 | } 121 | 122 | 123 | List companies() { 124 | List companies = []; 125 | companies.addAll( 126 | ['deploys', 'coderslight', 'minicenter', 'planetnode', 'revivenode', 'accuratenode', 'royalehosting']); 127 | return companies; 128 | } 129 | -------------------------------------------------------------------------------- /lib/page/company/deploys/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class DeploysAboutPage extends StatefulWidget { 19 | @override 20 | _DeploysAboutPageState createState() => new _DeploysAboutPageState(); 21 | } 22 | 23 | class _DeploysAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/deploys/client/home.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import 'package:pterodactyl_app/page/company/deploys/client/home/menu_page.dart'; 18 | import 'package:pterodactyl_app/page/company/deploys/client/home/zoom_scaffold.dart'; 19 | 20 | 21 | 22 | class MyDeploysHomePage extends StatefulWidget { 23 | MyDeploysHomePage({Key key}) : super(key: key); 24 | 25 | @override 26 | _MyDeploysHomePageState createState() => _MyDeploysHomePageState(); 27 | } 28 | 29 | class _MyDeploysHomePageState extends State { 30 | 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | return new ZoomScaffold( 35 | menuScreen: MenuScreen(), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/page/company/deploys/client/home/circular_image.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class CircularImage extends StatelessWidget { 19 | final double _width, _height; 20 | final ImageProvider image; 21 | 22 | CircularImage(this.image, {double width = 40, double height = 40}) 23 | : _width = width, 24 | _height = height; 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return Container( 29 | width: _width, 30 | height: _height, 31 | decoration: BoxDecoration( 32 | shape: BoxShape.circle, 33 | image: DecorationImage(image: image)), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/deploys/client/home/menu_page.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:pterodactyl_app/page/company/deploys/client/home/circular_image.dart'; 17 | import 'package:pterodactyl_app/page/company/deploys/client/settings.dart'; 18 | import 'package:flutter/material.dart'; 19 | import 'package:pterodactyl_app/main.dart'; 20 | import 'package:shared_preferences/shared_preferences.dart'; 21 | import 'package:url_launcher/url_launcher.dart'; 22 | import 'package:simple_gravatar/simple_gravatar.dart'; 23 | 24 | class MenuScreen extends StatelessWidget { 25 | /* 26 | final gravatar = Gravatar('hello@example.com'); 27 | final String imageUrl = gravatar.imageUrl( 28 | size: 100, 29 | defaultImage: GravatarImage.retro, 30 | rating: GravatarRating.pg, 31 | fileExtension: true, 32 | ); 33 | */ 34 | 35 | final String imageUrl = 36 | "https://s3-eu-west-1.amazonaws.com/tpd/logos/5aa8567e43efc80001d1319e/0x0.png"; 37 | 38 | @override 39 | Widget build(BuildContext context) { 40 | return Container( 41 | decoration: BoxDecoration( 42 | gradient: LinearGradient( 43 | begin: Alignment.centerLeft, 44 | end: Alignment(0.8, 0.0), // 10% of the width, so there are ten blinds. 45 | colors: [const Color(0xFF5E72E4), const Color(0xFF825EE4)], // whitish to gray 46 | ), 47 | ), 48 | padding: EdgeInsets.only( 49 | top: 62, 50 | left: 32, 51 | bottom: 8, 52 | right: MediaQuery.of(context).size.width / 2.9), 53 | 54 | child: Column( 55 | children: [ 56 | Row( 57 | children: [ 58 | Padding( 59 | padding: const EdgeInsets.only(right: 16), 60 | child: CircularImage( 61 | NetworkImage(imageUrl), 62 | ), 63 | ), 64 | Text( 65 | 'clientname', 66 | style: TextStyle( 67 | color: Colors.white, 68 | fontSize: 20, 69 | ), 70 | ) 71 | ], 72 | ), 73 | Spacer(), 74 | ListTile( 75 | onTap: () {}, 76 | leading: Icon( 77 | Icons.home, 78 | color: Colors.white, 79 | size: 20, 80 | ), 81 | title: Text('Home', 82 | style: TextStyle(fontSize: 14, color: Colors.white)), 83 | ), 84 | ListTile( 85 | onTap: () { 86 | launch( 87 | 'https://deploys.io/tickets/new?utm_source=ruben-app&utm_medium=app&utm_campaign=sidebar&utm_term=ticket&utm_content=sidebar'); 88 | }, 89 | leading: Icon( 90 | Icons.question_answer, 91 | color: Colors.white, 92 | size: 20, 93 | ), 94 | title: Text('Open Support Ticket', 95 | style: TextStyle(fontSize: 14, color: Colors.white)), 96 | ), 97 | ListTile( 98 | onTap: () { 99 | launch( 100 | 'https://deploys.io/client/?utm_source=ruben-app&utm_medium=app&utm_campaign=sidebar&utm_term=client&utm_content=sidebar'); 101 | }, 102 | leading: Icon( 103 | Icons.open_in_new, 104 | color: Colors.white, 105 | size: 20, 106 | ), 107 | title: Text('Client', 108 | style: TextStyle(fontSize: 14, color: Colors.white)), 109 | ), 110 | ListTile( 111 | onTap: () { 112 | launch( 113 | 'https://panel.deploys.io/?utm_source=ruben-app&utm_medium=app&utm_campaign=sidebar&utm_term=panel&utm_content=sidebar'); 114 | }, 115 | leading: Icon( 116 | Icons.open_in_new, 117 | color: Colors.white, 118 | size: 20, 119 | ), 120 | title: Text('Panel', 121 | style: TextStyle(fontSize: 14, color: Colors.white)), 122 | ), 123 | ListTile( 124 | onTap: () { 125 | launch( 126 | 'https://panel.deploys.io/?utm_source=ruben-app&utm_medium=app&utm_campaign=sidebar&utm_term=cpanel&utm_content=sidebar'); 127 | }, 128 | leading: Icon( 129 | Icons.open_in_new, 130 | color: Colors.white, 131 | size: 20, 132 | ), 133 | title: Text('cPanel', 134 | style: TextStyle(fontSize: 14, color: Colors.white)), 135 | ), 136 | ListTile( 137 | onTap: () { 138 | launch( 139 | 'https://panel.deploys.io/?utm_source=ruben-app&utm_medium=app&utm_campaign=sidebar&utm_term=website&utm_content=sidebar'); 140 | }, 141 | leading: Icon( 142 | Icons.open_in_new, 143 | color: Colors.white, 144 | size: 20, 145 | ), 146 | title: Text('Website', 147 | style: TextStyle(fontSize: 14, color: Colors.white)), 148 | ), 149 | Spacer(), 150 | ListTile( 151 | onTap: () => Navigator.of(context) 152 | .push(MaterialPageRoute(builder: (_) => DeploysSettingsList())), 153 | leading: Icon( 154 | Icons.settings, 155 | color: Colors.white, 156 | size: 20, 157 | ), 158 | title: Text('Settings', 159 | style: TextStyle(fontSize: 14, color: Colors.white)), 160 | ), 161 | ListTile( 162 | onTap: () async { 163 | SharedPreferences prefs = await SharedPreferences.getInstance(); 164 | prefs.remove('company'); 165 | Navigator.of(context).pushNamedAndRemoveUntil( 166 | '/selecthost', (Route route) => false); 167 | }, 168 | leading: Icon( 169 | Icons.lock_open, 170 | color: Colors.white, 171 | size: 20, 172 | ), 173 | title: Text(DemoLocalizations.of(context).trans('logout'), 174 | style: TextStyle(fontSize: 14, color: Colors.white)), 175 | ), 176 | ], 177 | ), 178 | ); 179 | } 180 | } 181 | -------------------------------------------------------------------------------- /lib/page/company/deploys/client/settings.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/cupertino.dart'; 17 | import 'package:flutter/material.dart'; 18 | import 'package:shared_preferences/shared_preferences.dart'; 19 | import 'package:pterodactyl_app/models/globals.dart' as globals; 20 | import 'package:flutter/services.dart'; 21 | import 'package:get_version/get_version.dart'; 22 | import 'package:dynamic_theme/dynamic_theme.dart'; 23 | import 'package:pterodactyl_app/page/auth/shared_preferences_helper.dart'; 24 | import 'package:pterodactyl_app/main.dart'; 25 | import 'package:pterodactyl_app/sponsor.dart'; 26 | import 'package:url_launcher/url_launcher.dart'; 27 | 28 | 29 | class DeploysSettingsList extends StatefulWidget { 30 | @override 31 | SettingsListPageState createState() => new SettingsListPageState(); 32 | } 33 | 34 | class SettingsListPageState extends State { 35 | String _projectVersion = ''; 36 | 37 | @override 38 | initState() { 39 | super.initState(); 40 | initPlatformState(); 41 | } 42 | 43 | // Platform messages are asynchronous, so we initialize in an async method. 44 | initPlatformState() async { 45 | String projectVersion; 46 | // Platform messages may fail, so we use a try/catch PlatformException. 47 | try { 48 | projectVersion = await GetVersion.projectVersion; 49 | } on PlatformException { 50 | projectVersion = 'Failed to get project version.'; 51 | } 52 | 53 | if (!mounted) return; 54 | 55 | setState(() { 56 | _projectVersion = projectVersion; 57 | }); 58 | } 59 | 60 | void handelTheme(bool value) async { 61 | // save new value 62 | final sharedPreferences = await SharedPreferences.getInstance(); 63 | sharedPreferences.setBool('Value', value); 64 | setState(() { 65 | globals.useDarkTheme = value; 66 | print(globals.useDarkTheme); 67 | }); 68 | if (value == true) { 69 | DynamicTheme.of(context).setBrightness(Brightness.dark); 70 | } else { 71 | DynamicTheme.of(context).setBrightness(Brightness.light); 72 | } 73 | } 74 | 75 | @override 76 | Widget build(BuildContext context) { 77 | return new Scaffold( 78 | appBar: new AppBar( 79 | elevation: 0.0, 80 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 81 | leading: IconButton( 82 | color: globals.useDarkTheme ? Colors.white : Colors.black, 83 | onPressed: () => Navigator.of(context).pop(), 84 | icon: Icon(Icons.arrow_back, 85 | color: globals.useDarkTheme ? Colors.white : Colors.black), 86 | ), 87 | title: Text(DemoLocalizations.of(context).trans('settings'), 88 | style: TextStyle( 89 | color: globals.useDarkTheme ? Colors.white : Colors.black, 90 | fontWeight: FontWeight.w700)), 91 | ), 92 | body: SingleChildScrollView( 93 | child: SafeArea( 94 | child: ListBody( 95 | children: [ 96 | Container( 97 | height: 10.0, 98 | ), 99 | ListTile( 100 | leading: Icon( 101 | Icons.notifications, 102 | ), 103 | title: Text( 104 | DemoLocalizations.of(context).trans('notifications'), 105 | ), 106 | subtitle: Text( 107 | DemoLocalizations.of(context).trans('notifications_sub'), 108 | ), 109 | //trailing: Switch( 110 | //onChanged: handelTheme, 111 | //value: globals.useDarkTheme, 112 | //), 113 | ), 114 | Divider( 115 | height: 20.0, 116 | ), 117 | ListTile( 118 | leading: Icon( 119 | Icons.color_lens, 120 | ), 121 | title: Text( 122 | DemoLocalizations.of(context).trans('dark_mode'), 123 | ), 124 | subtitle: Text( 125 | DemoLocalizations.of(context).trans('dark_mode_sub'), 126 | ), 127 | trailing: Switch( 128 | value: globals.useDarkTheme, 129 | onChanged: (bool switchValue) { 130 | handelTheme(switchValue); 131 | }), 132 | ), 133 | Divider( 134 | height: 20.0, 135 | ), 136 | new ListTile( 137 | leading: Icon(Icons.insert_drive_file), 138 | title: Text(DemoLocalizations.of(context).trans('license')), 139 | subtitle: 140 | new Text(DemoLocalizations.of(context).trans('license_sub')), 141 | onTap: () { 142 | launch( 143 | 'https://github.com/rubentalstra/Pterodactyl-app/blob/master/LICENSE'); 144 | }, 145 | ), 146 | Divider( 147 | height: 20.0, 148 | ), 149 | new ListTile( 150 | leading: Icon(Icons.euro_symbol), 151 | title: Text('Sponsors'), 152 | subtitle: new Text('Everyone who sponsored this project'), 153 | onTap: () { 154 | Navigator.of(context) 155 | .push(MaterialPageRoute(builder: (_) => SponsorPage())); 156 | }, 157 | ), 158 | Divider( 159 | height: 20.0, 160 | ), 161 | new ListTile( 162 | leading: new Icon(Icons.info), 163 | title: Text(DemoLocalizations.of(context).trans('app_version')), 164 | subtitle: new Text(_projectVersion), 165 | //onTap: () { 166 | //Navigator.of(context) 167 | //.push(MaterialPageRoute(builder: (_) => LicencePage())); 168 | //}, 169 | ), 170 | Divider( 171 | height: 20.0, 172 | ), 173 | Divider( 174 | height: 20.0, 175 | ), 176 | new ListTile( 177 | leading: Icon(Icons.delete_forever, color: Colors.red), 178 | title: Text(DemoLocalizations.of(context).trans('delete_data')), 179 | subtitle: new Text( 180 | DemoLocalizations.of(context).trans('delete_data_sub')), 181 | onTap: () async { 182 | SharedPreferencesHelper.remove("api_deploys_Key"); 183 | SharedPreferences prefs = await SharedPreferences.getInstance(); 184 | prefs.remove('company'); 185 | Navigator.of(context).pushNamedAndRemoveUntil( 186 | '/selecthost', (Route route) => false); 187 | }, 188 | ), 189 | ], 190 | ), 191 | )), 192 | ); 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /lib/page/company/minicenter/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class MiniCenterAboutPage extends StatefulWidget { 19 | @override 20 | _MiniCenterAboutPageState createState() => new _MiniCenterAboutPageState(); 21 | } 22 | 23 | class _MiniCenterAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/planetnode/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class PlanetNodeAboutPage extends StatefulWidget { 19 | @override 20 | _PlanetNodeAboutPageState createState() => new _PlanetNodeAboutPageState(); 21 | } 22 | 23 | class _PlanetNodeAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/revivenode/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class ReviveNodeAboutPage extends StatefulWidget { 19 | @override 20 | _ReviveNodeAboutPageState createState() => new _ReviveNodeAboutPageState(); 21 | } 22 | 23 | class _ReviveNodeAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/page/company/royalehosting/client/about.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | 18 | class RoyaleHostingAboutPage extends StatefulWidget { 19 | @override 20 | _RoyaleHostingAboutPageState createState() => new _RoyaleHostingAboutPageState(); 21 | } 22 | 23 | class _RoyaleHostingAboutPageState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return new Scaffold( 27 | appBar: new AppBar( 28 | title: new Text('About'), 29 | backgroundColor: Colors.blue[300], 30 | ), 31 | body: new Center( 32 | child: new Text("About Page", style: new TextStyle(fontSize: 35.0)), 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/partner.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import 'package:pterodactyl_app/models/globals.dart' as globals; 18 | import 'package:pterodactyl_app/page/auth/partnerlist.dart'; 19 | import 'package:url_launcher/url_launcher.dart'; 20 | 21 | class PartnerPage extends StatefulWidget { 22 | @override 23 | _PartnerPageState createState() => new _PartnerPageState(); 24 | } 25 | 26 | class _PartnerPageState extends State { 27 | @override 28 | Widget build(BuildContext context) { 29 | return Scaffold( 30 | appBar: new AppBar( 31 | elevation: 0.0, 32 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 33 | leading: IconButton( 34 | color: globals.useDarkTheme ? Colors.white : Colors.black, 35 | onPressed: () => Navigator.of(context).pop(), 36 | icon: Icon(Icons.arrow_back, 37 | color: globals.useDarkTheme ? Colors.white : Colors.black), 38 | ), 39 | title: Text('Partner List', 40 | style: TextStyle( 41 | color: globals.useDarkTheme ? Colors.white : Colors.black, 42 | fontWeight: FontWeight.w700)), 43 | ), 44 | body: Container( 45 | child: ListView.builder( 46 | itemCount: PartnerList.partnerList.length, 47 | itemBuilder: (context, index) { 48 | PartnerList _model = PartnerList.partnerList[index]; 49 | return GestureDetector( 50 | child: Column( 51 | children: [ 52 | Divider( 53 | height: 12.0, 54 | ), 55 | ListTile( 56 | leading: CircleAvatar( 57 | radius: 24.0, 58 | backgroundImage: NetworkImage(globals.useDarkTheme ? _model.logo["dark"] : _model.logo["light"]), 59 | ), 60 | title: Row( 61 | children: [ 62 | Text(_model.name) 63 | ], 64 | ), 65 | subtitle: Text(_model.message), 66 | trailing: Icon( 67 | Icons.arrow_forward_ios, 68 | size: 14.0, 69 | ), 70 | ), 71 | ], 72 | ), 73 | onTap: () { 74 | launch(_model.url); 75 | }, 76 | ); 77 | }, 78 | ), 79 | ) 80 | ); 81 | } 82 | } -------------------------------------------------------------------------------- /lib/sponsor.dart: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018-2019 Ruben Talstra and Yvan Watchman 3 | * 4 | * Licensed under the GNU General Public License v3.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.gnu.org/licenses/gpl-3.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | import 'package:flutter/material.dart'; 17 | import 'package:pterodactyl_app/models/globals.dart' as globals; 18 | import 'package:pterodactyl_app/page/auth/sponsorlist.dart'; 19 | import 'package:url_launcher/url_launcher.dart'; 20 | 21 | class SponsorPage extends StatefulWidget { 22 | @override 23 | _SponsorPageState createState() => new _SponsorPageState(); 24 | } 25 | 26 | class _SponsorPageState extends State { 27 | @override 28 | Widget build(BuildContext context) { 29 | return Scaffold( 30 | appBar: new AppBar( 31 | elevation: 0.0, 32 | backgroundColor: globals.useDarkTheme ? null : Colors.transparent, 33 | leading: IconButton( 34 | color: globals.useDarkTheme ? Colors.white : Colors.black, 35 | onPressed: () => Navigator.of(context).pop(), 36 | icon: Icon(Icons.arrow_back, 37 | color: globals.useDarkTheme ? Colors.white : Colors.black), 38 | ), 39 | title: Text('Sponsor List', 40 | style: TextStyle( 41 | color: globals.useDarkTheme ? Colors.white : Colors.black, 42 | fontWeight: FontWeight.w700)), 43 | ), 44 | body: Container( 45 | child: ListView.builder( 46 | itemCount: SponsorList.sponsorList.length, 47 | itemBuilder: (context, index) { 48 | SponsorList _model = SponsorList.sponsorList[index]; 49 | return GestureDetector( 50 | child: Column( 51 | children: [ 52 | Divider( 53 | height: 12.0, 54 | ), 55 | ListTile( 56 | leading: CircleAvatar( 57 | radius: 24.0, 58 | backgroundImage: NetworkImage(_model.avatarUrl), 59 | ), 60 | title: Row( 61 | children: [ 62 | Text(_model.name), 63 | SizedBox( 64 | width: 16.0, 65 | ), 66 | Text( 67 | _model.donation, 68 | style: TextStyle(fontSize: 12.0), 69 | ), 70 | ], 71 | ), 72 | subtitle: Text(_model.message), 73 | trailing: Icon( 74 | Icons.arrow_forward_ios, 75 | size: 14.0, 76 | ), 77 | ), 78 | ], 79 | ), 80 | onTap: () { 81 | _launchURL(_model.link); 82 | }, 83 | ); 84 | }, 85 | ), 86 | ), 87 | floatingActionButton: FloatingActionButton.extended( 88 | onPressed: () { 89 | _launchURL('https://www.paypal.me/RDTalstra'); 90 | }, 91 | icon: Icon(Icons.add), 92 | label: Text('Donate'), 93 | ), 94 | ); 95 | } 96 | } 97 | 98 | _launchURL(String url) async { 99 | if (await canLaunch(url)) { 100 | await launch(url); 101 | } else { 102 | throw 'Could not launch $url'; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /partners.json: -------------------------------------------------------------------------------- 1 | { 2 | "partners": [ 3 | { 4 | "name": "Deploys.io", 5 | "url": "https://deploys.io", 6 | "logo": { 7 | "dark": "https://deploys.io/img/deploys.io/logo/text/light.png", 8 | "light": "https://deploys.io/img/deploys.io/logo/text/dark.png" 9 | } 10 | }, 11 | { 12 | "name": "CodersLight LLC", 13 | "url": "https://coderslight.com/", 14 | "logo": { 15 | "dark": "https://avatars2.githubusercontent.com/u/35084758?s=280&v=4", 16 | "light": "https://pbs.twimg.com/profile_images/1041472632984616961/uIjCN238.jpg" 17 | } 18 | }, 19 | { 20 | "name": "MiniCenter", 21 | "url": "https://minicenter.net/", 22 | "logo": { 23 | "dark": "", 24 | "light": "" 25 | } 26 | }, 27 | { 28 | "name": "PlanetNode", 29 | "url": "https://planetnode.net/", 30 | "logo": { 31 | "dark": "https://planetnode.net/templates/planetnode/img/header/logo-b.png", 32 | "light": "https://planetnode.net/templates/planetnode/img/header/logo-b.png" 33 | } 34 | }, 35 | { 36 | "name": "Revivenode Hosting", 37 | "url": "https://revivenode.com/", 38 | "logo": { 39 | "dark": "https://cdn.discordapp.com/attachments/582365380798971934/589519836997222420/RLogo.png", 40 | "light": "https://cdn.discordapp.com/attachments/582365380798971934/589519836997222420/RLogo.png" 41 | } 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: pterodactyl_app 2 | description: A Pterodactyl Mobile App. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 4.3.8+54 15 | authors: 16 | - Ruben Talstra 17 | - Yvan Watchman 18 | 19 | environment: 20 | sdk: ">=2.2.2 <3.0.0" 21 | 22 | dependencies: 23 | flutter: 24 | sdk: flutter 25 | 26 | flutter_localizations: 27 | sdk: flutter 28 | 29 | cupertino_icons: any # any is love <3 30 | http: any # any is love <3 31 | convert: any # any is love <3 32 | flutter_sparkline: any # any is love <3 33 | flutter_staggered_grid_view: any # any is love <3 34 | shared_preferences: any # any is love <3 35 | flutter_cupertino_settings: any # any is love <3 36 | font_awesome_flutter: any # any is love <3 37 | dynamic_theme: any # any is love <3 38 | get_version: any # any is love <3 39 | firebase_messaging: any # any is love <3 40 | url_launcher: any # any is love <3 41 | firebase_remote_config: any # any is love <3 42 | adhara_socket_io: any # any is love <3 43 | simple_gravatar: any # any is love <3 44 | flutter_speed_dial: any # any is love <3 45 | titled_navigation_bar: any # any is love <3 46 | division: any # any is love <3 47 | responsive_container: any # any is love <3 48 | logger: any # any is love <3 49 | photo_view: 0.5.0 # any is love <3 50 | pinput: any # any is love <3 51 | timeago: any # any is love <3 52 | 53 | 54 | dbutils: 55 | git: 56 | url: git://github.com/AndriousSolutions/dbutils.git 57 | 58 | dev_dependencies: 59 | flutter_test: 60 | sdk: flutter 61 | 62 | flutter: 63 | 64 | uses-material-design: true 65 | 66 | assets: 67 | - assets/images/pterodactyl_icon.png 68 | - assets/lang/en-US.json 69 | - assets/lang/en-GB.json 70 | - assets/lang/de-DE.json 71 | - assets/lang/fr-FR.json 72 | - assets/lang/nl-BE.json 73 | - assets/lang/nl-NL.json 74 | - assets/lang/da-DK.json 75 | - assets/lang/nn-NO.json 76 | - assets/lang/pl-PL.json 77 | - assets/lang/it-IT.json 78 | - assets/lang/es-ES.json 79 | - assets/lang/zh-CN.json 80 | - assets/lang/zh-TW.json 81 | - assets/lang/sl-SI.json 82 | - assets/lang/sv-SE.json 83 | - assets/lang/id-ID.json 84 | - assets/lang/ar-AE.json 85 | - assets/lang/he-IL.json 86 | 87 | # An image asset can refer to one or more resolution-specific "variants", see 88 | # https://flutter.io/assets-and-images/#resolution-aware. 89 | fonts: 90 | - family: Cairo 91 | fonts: 92 | - asset: assets/fonts/Cairo-Regular.ttf 93 | - asset: assets/fonts/Cairo-Bold.ttf 94 | weight: 700 95 | -------------------------------------------------------------------------------- /test/app_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | 5 | } 6 | --------------------------------------------------------------------------------