You are browsing as a guest. Sign up (or log in) to start making projects!

Pterodactyl Panel (Android App)

  • 38 Devlogs
  • 98 Total hours

An app to manage https://pterodactyl.io. Pterodactyl is a server management panel which runs each server in an isolated docker container

Open comments for this post

1h 1m 44s logged

  • In the account settings screen created the activity tab (i think i finished all the client side of the app :yayayayayay: , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that)
  • Moved ActivityDisplay in the general components as it’s used in the accoutn activity too
  • Updated ActivityDisplay to include the user agent button when available
0
0
13
Open comments for this post

2h 54m 54s logged

  • In the account settings screen created the API credentials tab
  • Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab).
    Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name :pf: )
  • Applied same changes as above to the account settings screen
  • Updated the formatDate function to include a param to toggle the year in the date
0
0
8
Open comments for this post

5h 25m 16s logged

  • Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done :yayayayayay: )
  • in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added
  • Now each warning popup in the server screen has its own icon instead of all using the suspended icon
  • in all places, replaced refreshIndex += 1 with refreshIndex++
  • The app now no longer shows “Missing Server ID” toast as soon as you open a server
  • Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded :wiltedrose: (without /disable it acts as enable endpoint))
  • Fixed get qr code response as it was different from what the API docs listed :hs:
  • In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on :wiltedrose: … shitty API fr)
  • Added a simple regex to parse emails (so the change email button is enabled only if this regex passes)
  • Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page)
  • Same as above for the server screen activity tab (jusy 25 logs per page)
  • Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages (.total) instead of the total number of pages (.totalPages), idk how i missed that :hs: )
  • Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag

I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret :pf:

0
0
9
Open comments for this post

5h 15m 1s logged

  • Created the activity tab (finally finished all server tabs :yayayayayay: :D) along with a function to parse the variables in the logs’ description
  • Improved loading for schedules, backup and databases tabs
  • Fixed JSON text highlighting not highlighting strings inside of arrays
  • Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components
  • In the settings tab added a popup to confirm the reinstallation of the server
  • Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it
  • Renamed AccountActivity to ActivityLog as it’s used in server activity too
  • Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid :wiltedrose: )
  • add .trim() to all user inputs
  • Now tabs refresh only when the server ID changes instead of anything in the server object
0
0
7
Open comments for this post

4h 19m 54s logged

  • Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place
  • Added the pull to refresh gesture to servers list & server details screens
  • Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that)
  • In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.)
  • The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge)
  • The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched
  • Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times
  • Moved StartupContainer to a more general Container
  • Moved ServerStatus enum to Server.Status
  • Removed navController from all tabs as it was unused
0
0
3
Open comments for this post

44m 49s logged

  • Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes
  • Doubled hamburger menu icon left padding to match the avatar padding on the right
  • Doubled the gaps between the cards in the backups & network tabs
  • Halved the gaps between the cards in the schedules tab

I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back :wiltedrose:

0
0
7
Open comments for this post

1h 57m 5s logged

  • Added the network tab to manage server allocations
  • Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀)
  • Fixed allocation endpoints using String instead of Long
  • Moved backup popups outside of the padded Column
  • Updated my github username in the readme
0
0
5
Open comments for this post

26m 37s logged

After i tested more the additions of the last devlog i found some issues so here i fixed them

  • Fixed backups downloading as .gz instead of .tar.gz
  • Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all)
  • Disabled inputs in the restore & create popups when respectively restoring and creating
  • Removed the enabled param in the BackupDisplay as it was basically useless
0
0
3
Open comments for this post

4h 29m 2s logged

  • Finished the users tab
  • Made the backups tab
  • Made all popup’s horizontal padding equal
  • When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list
  • Disabled the “Create Database” button when at the limit
  • Renamed File to FileDisplay for consistency with other components
  • Fixed edit & create user body still using String instead of ServerSubuser.Permission
  • Fixed the deleteServerBackup function which was marked as GET instead of DELETE
  • Made the truncate param required in the restoreServerBackup function as it’s required in the API
0
0
5
Open comments for this post

5h 27m 46s logged

  • Started making the users tab but it’s really WIP, none of the buttons except create new user works)
  • Handled subuser permissions for all current tabs
  • Added a LabeledCheckbox component
  • Removed some function params that were pointless to have
  • Installed the Gravatar SDK for the subusers’ avatar

I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine

0
0
4
Open comments for this post

3h 46m 12s logged

  • Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management
  • In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.)
  • Added a function to convert ISO date strings in human-readable strings
  • Added a missing endpoint to execute a schedule
  • Added a missing only_when_online property in the ServerSchedule data class
  • Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs)
  • Fixed ScrollableTabRow not using all the horizontal space when in landscape mode
0
0
4
Open comments for this post

2h 31m 27s logged

  • Finished the UI side of the schedule details popup (still WIP for backend like button handling)
  • Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files
  • Changed task action from a normal screen to an enum
  • Took the formatDate function from my Zipline app
0
0
3
Open comments for this post

4h 13m 27s logged

  • Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management)
  • Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one
  • Improved code layout by using returns in some places instead of many if else blocks
  • Fixed ScrollableTabRow component improperly placing icons when there was no text
  • Moved ‘linked’ data classes inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits
0
0
6
Open comments for this post

5h 37m 54s logged

  • Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw
  • Added the databases tab with handling for creation, deletion and rotation of the password
  • Fixed rotateServerDatabasePassword and deleteServerDatabase, they were using the wrong endpoint (/server instead of /servers)
  • Made each tab independently scrollable instead of making the parent component scrollable
  • Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that)
  • Changed the Notification object component’s background color
1
0
5
Open comments for this post

2h 7m 29s logged

  • FInished file handling (handled edit & save files & create new file)
  • Added file highlighting for .env files
  • Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string)
  • Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag
0
0
5
Open comments for this post

2h 38m 42s logged

  • Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving
    (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file)
  • Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace
  • On the login screen i disabled the application api key input till the admin side is actually done
0
0
6
Open comments for this post

4h 26m 5s logged

(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB)

  • In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive
  • Filled the File component’s “more actions” menu (before it was empty)
  • Updated uploadServerFiles to be able to upload multiple files at once
  • Added a function to convert linux string permissions (like drwxr-xr-x) to int/octal (like 755)
  • Added a regex for the linux int/octal permission
  • Took the Popup component and Storage object form my Zipline app
  • Updated the SecureStorage class to add the file download folder variable
0
0
6
Open comments for this post

2h 9m 47s logged

  • Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn)
  • Created a File component to avoid repeating same code
  • Added a new color surfaceContainer used in notifications
  • Took the “More Actions” component from my Zipline app
  • Took the “Checkbox” component from my Zipline app and modified it to be toggleable
  • In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll
  • moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)
0
0
4
Open comments for this post

3h 30m 25s logged

  • Added charts to the console tab of the server screen
  • Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting
  • Created a component for the chart container & top scrollbar to avoid repetition
  • Added AI declaration in the readme cuz i only found out now that it’s required
  • Removed a double new line the Button component
0
0
4
Open comments for this post

3h 25m 48s logged

  • Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity)
    The server screen itself is WIP as it’s missing the buttons to switch between the sections
    The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O)
    (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep :heavysob: )
  • Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime
  • In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense

On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)

0
0
1
Open comments for this post

2h 57m 48s logged

  • Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header)
  • Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display
    Also suspended servers’ names now are grayed out
  • Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭)
  • Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list
  • Created a object to easily access the WebSocketManager from a ViewModel class

Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished

0
0
5
Open comments for this post

3h 58m 25s logged

  • Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage)
  • Added pterodactyl panel colors to be used in the server status (red, green and yellow)
  • Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl, then after it threw an error i googled it and realized i just had to put .)
  • Updated getServerResources response class, now the server state uses a enum instead of a generic string
  • Updated Server class to better fix some typed and add 1 missing key
  • Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭
  • Improved login process to handle the case when the user logged with just an application api key and not a client one
  • Added application API key validation for the same reason as the login
  • Took shimmerable modifier from my Zipline app to make skeleton loading
  • Added definitions & placeholders for all screens until i make them
0
0
4
Open comments for this post

2h 52m 9s logged

  • Created Loading and Login Screen
  • After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it
  • Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it
  • Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too
  • I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login
0
0
3
Open comments for this post

2h 53m 27s logged

  • Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars)
    (except for the download* ones, i took those from my other app Zipline)
  • I also took the Transfer Service from my Zipline app
  • Updated all the libraries
  • Set target SDK to 37 (Android 17)

now i gotta do the frontend part

0
0
5
Open comments for this post

48m 21s logged

  • Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app)
  • Added some util modules that i also use in my other apps
  • Created an empty login screen
0
0
4
Open comments for this post

57m 45s logged

  • I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now
  • Added the WebSocket handling (untested)
  • Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6
0
0
5
Open comments for this post

38m 1s logged

Finished adding the application API HTTP requests (added application/servers/{serverId}/databases, application/nests and application/nests/{nestId}/eggs)
Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭
you can see them in the commit here


even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts

0
0
4
Open comments for this post

1h 6m 20s logged

  • Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys)
  • Fixed some wrong or missing types
  • Finished adding the HTTP requests for the client API
  • Started adding the HTTP requests for the application API
0
0
8
Open comments for this post

2h 41m 38s logged

Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations….

anyway i added:

  • GET /api/client/account/activity
  • GET /api/client/account/ssh-keys
  • POST /api/client/account/ssh-keys
  • POST /api/client/account/ssh-keys/remove
  • GET /api/client/servers/{identifier}
  • GET /api/client/servers/{identifier}/resources
  • POST /api/client/servers/{identifier}/command
  • POST /api/client/servers/{identifier}/power
  • GET /api/client/servers/{identifier}/databases
  • POST /api/client/servers/{identifier}/databases
  • POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password
  • DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier}
  • GET /api/client/servers/{identifier}/files/list
  • GET /api/client/servers/{identifier}/files/contents
  • GET /api/client/servers/{identifier}/files/download
  • POST /api/client/servers/{identifier}/files/write
  • POST /api/client/servers/{identifier}/files/create-folder
  • POST /api/client/servers/{identifier}/files/copy
  • PUT /api/client/servers/{identifier}/files/rename
  • POST /api/client/servers/{identifier}/files/compress
  • POST /api/client/servers/{identifier}/files/decompress
  • POST /api/client/servers/{identifier}/files/delete
  • GET /api/client/servers/{identifier}/files/upload
  • POST /api/client/servers/{identifier}/files/chmod
  • GET /api/client/servers/{identifier}/schedules
  • GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier}
  • POST /api/client/servers/{identifier}/schedules
  • POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier}
  • DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier}
  • POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks
  • POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier}
  • DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier}

Writing all these took alot of time

0
0
7
Open comments for this post

1h 34m logged

Started adding some HTTP requests typedef, still missing alot tho
for now i added:

  • GET /api/client
  • GET /api/client/permissions
  • GET /api/client/account
  • GET /api/client/account/two-factor
  • POST /api/client/account/two-factor (enable)
  • POST /api/client/account/two-factor (disable)
  • PUT /api/client/account/email
  • PUT /api/client/account/password
  • GET /api/client/account/api-keys
  • DELETE /api/client/account/api-keys/{identifier}
  • POST /api/client/account/api-keys

no frontend yet, i’m doing the backend first

0
0
3
Open comments for this post

27m 43s logged

Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now)
now working on writing the code for HTTP requests to the pterodactyl API and their response types

0
0
3

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…