leolion.tk
Open in
urlscan Pro
185.199.108.153
Public Scan
Submitted URL: http://leolion.tk/
Effective URL: https://leolion.tk/
Submission: On June 29 via api from US — Scanned from DE
Effective URL: https://leolion.tk/
Submission: On June 29 via api from US — Scanned from DE
Form analysis
0 forms found in the DOMText Content
PORTFOLIO LEONARD HADDAD'S LITTLE PORTFOLIO WEBSITE USING GITHUB PAGES AND JEKYLL, CONTAINING A BUNCH OF USEFUL TOOLS. View on GitHub Welcome Resume Tools Publications More from me Google Play Contact WELCOME, FRIEND On this website you can find a bunch of useful tools, both for your personal workstation, as well as for your professional life. This website also serves as my Portfolio, so if you’re looking to hire me, or are interested in filing a development request, don’t hesitate to use the contact section below. For resources to help you with University subjects, check out my other website All tools provided on this website are free to use and change, misuse however, is prohibited. Any damage caused by these tools, in addition to violations of local restrictions, are your own problem, not mine. -------------------------------------------------------------------------------- WHO AM I? Welcome to my profile!👋 My name is Leonard Haddad! I’m a 23 years old software developer from Israel currently residing in Germany. described by colleagues, clients, friends and family as "a whole IT department - in one person." ⚡"Real-life Tony Stark"⚡ Visitor count Some of my skills Github stats Wanna know if you should hire me or need a software developed? Check out my interactive digital resume below (or here ). Show Resume MY RESUME This section is included, should you be interested in my capabilities for whatever reason (I’m always open for fun projects, freelance work or similar offers). The CV is also available as a PDF document here -------------------------------------------------------------------------------- Education, Certifications, Trainings Work Experience Skills Projects Apps Languages Programming and Scripting Languages Operating Systems Tools I use -------------------------------------------------------------------------------- THIS IS ME This is me. My name is Leonard Haddad. I am 23 years old and I am working on my Computer Science Masters degree at the University of Bremen in Germany. I come originally from Israel (with both the Israeli and German passports), but am currently residing in Bremen. Back to top -------------------------------------------------------------------------------- EDUCATION, CERTIFICATIONS, TRAININGS SCHOOL Don’t think it interests anyone, but here you go: * Finished high school with Israeli Bagrut in 2017. Main subjects: Physics, Mathematics, Electronics and English. EARNED CERTIFICATES I’ve successfully attained the following certifications: * Computer Science Bsc. (View certificate) CERTIFICATIONS * TryHackMe Advent of Code 2023 (View certificate) TRAININGS I’ve participated in the following trainings: * FirstSpirit® Advanced Training (View certificate) CAREER CENTER I’ve also participated in the following Career Center courses: * Blockchain - A technology with a wide range of applications (View certificate) * An introduction to business for engineers (View certificate) * Agile Work Techniques (View certificate) PENDING I’m persuing the following certifications: * Cisco Certified Network Associate (CCNA, eta. 2024) * Computer Science Msc. (eta. 2024) * Computer Science Phd. (eta. 2028) Back to top -------------------------------------------------------------------------------- WORK EXPERIENCE Freelance Software Development at Studicon GmbH 12/2022- 01/2022- </link> </link> Java Full Stack and FirstSpirit® developer at adesso SE Freelance Software and App Development at IsraTech (Contact ) 2021- 10/2019-02/2022 Media informatics tutor at University of Bremen (basics of computer science media). Tech Support, System and Network Administration at Gech-BJ Engineering 2015- 04/2018-07/2018 Vacation work at Mercedes Benz Factory (Daimler) Bremen. Worked at the print shop Defus ha Hoshen Roberto 09/2017-01/2018 pre-2017 Worked as a surveyor's assistant for Gech-BJ Engineering Back to top -------------------------------------------------------------------------------- SKILLS Some skills I have (besides flirting and dark humor): * IT Consulting (6+ years experience) * Pentesting (3 years experience) * Scrum Master/Project Management (2 years experience) * Regex (regular expressions) * Googling (apparantly a skill) * Teaching and tutoring * Team playing, providing help * (Abstract-) Problem solving * Finding help when needed and getting projects done Back to top -------------------------------------------------------------------------------- PROJECTS A couple projects I worked on: * Project Deep Anatomy (in collab with Fraunhofer Mevis ) (Master’s project, Python, TensorFlow). * B-Human (in collab with DFKI ) Framework (Bachelor’s thesis, C++). See my publication for more infos. * Projekt SEE (Bachelor’s project). * Hotel management system (Freelance, JavaEE with an H2 Database using Wildfly as the application server): A hotel management software which keeps track of what guests are located in what rooms, where their luggage is, when they are leaving (and where they are leaving to) and a couple other features. Closed source for my client’s privacy. * Student grading system (Freelance, JavaFX with Sqlite): A simple app which keeps track of students and their grades. Closed source for my client’s privacy. * Galaxytrucker - a clone of the game FTL: Faster Than Light (University Project, using LibGDX as the game engine, a client/server architecture with an H2 Database and manual network communication using the Java Sockets API). Source code: Gitlab * SFB Farbige Zustaende (University Project, JavaEE with an H2 Database using Wildfly as the application server): A system for managing staff, experiment results and sample data. Source code: Gitlab * Of course there are also the projects from work. These however cannot be mentioned for obvious reasons. Technologies used there: Java, JavaEE, Spring Boot, PostgreSQL, MySQL, FirstSpirit®. Back to top -------------------------------------------------------------------------------- APPS I’ve published a couple apps on the Google Play Store. Check them out below (the code is mostly terrible, then again it was one of the first things I did): * Open Source Easy File Transfer (Java, Socket API, desktop version using JavaFX). * Sharky the Angry Sharkfish (C# and Unity for Android) * Open-Source Password Generator (Java with the processing library). Source code: Github * Semester Planer Schedule Generator (Java with Android SDK). Back to top -------------------------------------------------------------------------------- LANGUAGES SPOKEN I speak the following languages: * German (Mother Tongue) * Arabic (Mother Tongue) * Hebrew (Fluent) * English (Fluent) LEARNING I’m learning the following languages for fun: * Spanish * French * Turkish Back to top -------------------------------------------------------------------------------- PROGRAMMING AND SCRIPTING LANGUAGES IN-USE Some of the programming languages I regularly use: * Java (SE and EE) * My main language (at work) * Especially for Enterprise (JavaEE, Spring Boot, FirstSpirit®) * Python (ML, Flask) * Mainly in my academic fields * For free-time projects * C# (with Unity) * C, C++ * In academic fields * for pentesting * for Arduino * Haskell (academically) * PHP (with JobRouter®) * JavaScript * SQL. I’ve worked with the following databases: * MySQL, MariaDB * PostgreSQL * SQLite * FirstSpirit® XML (Custom scripting syntax) * HTML * CSS * Bash * Powershell * Batch * DuckyScript * Markdown (as you see) * LaTeX * RISC-V Assembly (academically) * Solidity (check out my proof-of-concept crypto currency “Salvation” ) LEARNING Im also learning the following languages: * Dart * Kotlin Back to top -------------------------------------------------------------------------------- OPERATING SYSTEMS I regularly use the following operating systems: * Windows - on my main machine * MacOS-X - in my professional life * Linux (both professionally and on my own machines) * Ubuntu 18/20.04 * Kali * Debian * Mint * Arch * Raspbian Buster (both Headless and with GUI) * HiveOS * Unifi OS by Ubiquiti Back to top -------------------------------------------------------------------------------- TOOLS I USE Pieces of software I use in my professional and daily life. PROFESSIONALLY Tools I use at work: * Jetbrains IDEs * FirstSpirit® * Docker * Git (commandline) * Maven * Gradle * Termius * Postman * Terminal * Sublime Text * Microsoft Teams, Outlook * Obsidian (Notebook) * GnuPG * Tmux * Nano * Vim IN MY DAILY LIFE Tools I generally use (in addition to the abovementioned ones): * Anaconda * Visual Studio and Visual Studio Code * Adobe Creative Cloud * Photoshop * After Effects * Premiere Pro * Lightroom * Illustrator * VEGAS Pro * Hitfilm Express * Autodesk Pixlr * Autodesk AutoCAD * Blender * Unity Engine * Unreal Engine * VirtualBox * Pentesting frameworks * Metasploit * Hashcat * John the Ripper * Dirbuster * Netcat * OpenSSH * Metamask * Windows Terminal (with Powershell 7 and WSL) * MS Office Tools Back to top -------------------------------------------------------------------------------- OK, SO WHAT'S ON THE MENU? Well you can stick around and take a look at the list below, or you can go browse the repository! Java -------------------------------------------------------------------------------- EASY FILE TRANSFER TOOL (CROSS-PLATFORM) Click to view Details SIMPLE FILE TRANSFER PC Desktop version for the Android app Open Source Easy File Transfer. This is a companion App for the Python script ptransfer. For more information, as well as the network protocol used by the application, check out the source code of the Android app on Github. Licensed in accords with the Apache License 2.0 AUTHOR Created and authored by Leonard Haddad. Portfolio BUILDING To build from source, simply clone this repository and execute mvn clean verify javafx:run This requires a valid maven installation with at least JDK 11. Alternatively, download the latest release from here. OPERATING SYSTEMS This App is written with cross-platform support. It runs on any operating system with Java 11. PREVIEW Back to Top -------------------------------------------------------------------------------- Python -------------------------------------------------------------------------------- FILE TRANSFER TOOL Click to view Details PYTHON FILE TRANSFER TOOL This is a super duper mega simple file transfer tool which may be used to transfer files between two different systems on the same network. (*) Note: The file is sent in an unencrypted manner. USAGE The script can be ran in either send or receive mode, with either the sender or the receiver acting as the host. It can either be ran with all arguments given when running the command, or by merely supplying the ip address and setting the remaining variables through prompts. Syntax: ptransfer <IP Address> [[s]end/[r]eceive] [reversed (T/F)] [filepath] [port] * IP Address: The Interface to listen on/connect to. * Mode (Optional): [s]end or [r]eceive. * Reversed (Optional): [f]alse or [t]rue. Usually the sender acts as the server, but this can be reversed on machines where opening a port is disallowed. * Filepath (Optional): Path to the file to send. * Port (Optional): Port to connect to/listen on. Note: While the arguments are optional, it is mandatory to include them in a row (script does not use getopt!). If the port is supplied, then all arguments preceeding it need to be supplied as well! Running without arguments: #> ptransfer 127.0.0.1 Please select type send/receive #> r Would you like to run in reverse connection mode (sender connects to receiver)? - True: Receiver must start script FIRST. - False (default): Sender must start script FIRST. (*) Note: Android and Java variants dont support reverse mode! (True/False) #> f FUNCTION The file is read in and sent in chunks of up to 2 MB of data per cycle (speeds may be slower based on network performance). After the file is completely sent, the hash of the original file on the server’s end is computed and then sent to the receiving end to compare to the hash of the received file in order to insure data integrity. If the hashes do not match, you will be prompted whether or not you want to keep the local file. LIST OF AVAILABLE DISTROS This script has a Java GUI-Equivalent, as well as an Android app. Here is a list of available distros: * PC Release * Android App * Python CLI Tool * PC Source * Android Source AUTHOR Leonard Haddad Provided in accords with the MIT License NETWORK PROTOCOL The script uses a proprietary protocol through TCP. The exchanged messages are displayed below. In hindsight, it would’ve been smarter to use JSON for information exchange (or refrain from using sockets in the first place in favour of TLS), perhaps it will get updated in the future, stay tuned! Before doing a transfer, the server allows pings to be received to support the scan feature of mobile and java clients. Here is the initial protocol step (A is the sender/server, B the receiver/client): B→A:PING A→B:REPLY If B sends a ping, it receives a reply from the server, otherwise (if it sends init) the following messages are exchanged: B→A:"init" A→B:File name B→A:"Received Name" A→B:File size At this point the client has the file name and size. Now they proceed to check whether the file already exists, and if so, read the existing n-bytes into a new file, while renaming the existing file into file name_old.ext. The next message sent to A is either of: B→A:"NONEXISTENT" or B→A:"SIZE:current size" If the file exists, the server proceeds sending the remaining m-n bytes of the file, otherwise, it sends all m-bytes of the file. A→B:"Ready for transfer!" B→A:"Beginning file transfer..." (printed on client side) A→B:File data in chunks of 2MB (*) The client calculates the received data by himself. After receiving all m-bytes of the file, the client checks the file hash against that of the server. B→A:"GIVE ME HASH" A→B:Original file hash If the hashes dont match, the client prompts for deletion of the data. With the last message, the connection terminates. Back to Top -------------------------------------------------------------------------------- FINANZBLICK API TEMPLATE Click to view Details FINANZBLICK LOGIN API This api has a demo script for signing into the german banking app Finanzblick. The demo script performs the sign-in and bearer token retrieval which can be used to access any other functions required. The demo script currently fetches the balance of the first bank account within the retrieved list of accounts. Back to Top -------------------------------------------------------------------------------- GMAIL PERMUTATION GENERATOR Click to view Details GMAIL EMAIL PERMUTATION GENERATOR Few people know that Gmail ignores some special characters and allows emails to be permutated in a variety of ways. For example, the below email addresses are all one and the same address: test@gmail.com test@googlemail.com t.ES.t@gmail.com t.est+netflix@gmail.com Gmail inherently ignores dots [.] and character cases within email addresses, as well as allowing suffixes to be added to your email (using +) based on the website you’re signing up for: test+netflix@gmail.com test+disneyplus@gmail.com test+instagram@gmail.com This tool generates these combinations and exports them for you to use. USAGE Using the tool is pretty straightforward: python3 ./permutate.py username <charcase - True/False> [optional service name] [optional export file name] * Username: your Gmail username. * Charcase: Permutate character case as well? * Service name (optional): include a service name (such as +netflix). * Export file name: Where output should be written to. DEMO No Charcase, service included: No service: Service and charcase: Back to Top -------------------------------------------------------------------------------- ONOC TOOLS Click to view Details ONOC TOOLS Just a bunch of tools for the annual ONOC. PIZZA BOT Bot for notifying you per Telegram when your pizza order has arrived. Just fill the watched array with your order ids. REQUIREMENTS The following libs are required: requests APScheduler And a Telegram group, as well as a Telegram Bot. DEMO Back to Top -------------------------------------------------------------------------------- ISRAEL RED-ALERT TELEGRAM NOTIFIER Click to view Details RED ALERT TELEGRAM NOTIFIER This python script allows setting up Telegram Notifications for the Israeli Red Alerts issued by Pikud Haeoref during emergencies. The API is queried every 15 seconds for updates, which are reformatted and sent per Telegram. (*) The app runs in debug (PoC) mode by default. If you’d like to actually use it, set the DEBUG variable to false. This is done since the app only works from within Israeli territory due to firewall and national security restrictions. REQUIREMENTS This script only requires 2 libraries to run (flask is optional and only used for the test-server): requests flask These can also be installed from the provided requirements.txt file. FUNCTIONALITY The application utilizes 2 threads (3 in test-mode, the third one is used by flask): 1. UI/CMD Thread: Allows changing which regions are monitored. 2. API/Query Thread: Used for making requests to the API every 15 seconds. The UI Thread allows you to change which regions are monitored through the various integrated commands: Note: when first running the app, it will attempt to download the JSON file targets.json. Should you not be using Linux, ensure that either curl is available in your Windows Shell, or manually download the file and place it next to this script. HOW TO RUN THIS APP Since the app has a main UI thread, running in in a simple terminal instance is quite annoying. I recommend starting a screen instance, running the app and adding the regions you’d like to monitor and then leaving the screen instance using ctrl+A D. CREDIT Credit where credit is due: This project was inspired by the red-alert-python project. The targets.json file (containing the monitored regions and first downloaded when running the app), is also taken from there. DEMO Back to Top -------------------------------------------------------------------------------- DL ENVELOPE PRINTABLE GENERATOR Click to view Details DL ENVELOPE GENERATOR This script allows quickly generating printable DL envelope docx files. SETUP LIBS First, install the required python modules: pip install -r requirements.txt DOCX Then open the .docx file and enter your personal details (And replace the IsraTech logo with your own. If you decide to remove it, change the image in the python script from word/media/image2.png to word/media/image1.png. It would be easier to replace it with a blank image). Do not replace the default stamp or the BLANK entries! SHELL The script comes with a .cmd script which allows you to generate the stamp in any directory you want. Never execute the script in the default directory, as then the template will be overwritten! To use this script, add it to a folder within your system’s PATH, and replace the /mypath/to within it to the paths of the docx template and .py script’s. If done correctly, this allows you to execute envelope within any path to quickly generate printable docx files. USAGE The script allows you to generate DL envelope templates with and without stamps. To quickly generate a docx template without a stamp, just execute envelope within a path and fill out the details as shown in the screenshot below. To add a stamp, get yourself a printable PDF stamp from your post office provider with cut-out marks around the corners (see the testprint_deutsche_post.pdf file ) and execute the script with the pdf file as the first argument envelope test_deutsche_post.pdf. This will make you enter the details like in the default mode, but substitute the template file within the docx template with the printable stamp. If you’d like to try this mode, go ahead and do some with the provided stamp. Now just open the docx file and print it! Viola! Back to Top -------------------------------------------------------------------------------- EARTHQUAKE MONITOR W/ TELEGRAM NOTIFICATIONS Click to view Details SIMPLE EARTHQUAKE MONITOR W/ TELEGRAM NOTIFICATIONS This module implements a simple application to monitor a country (or city) for earthquakes. REQUIREMENTS The module only requires two libraries requests APScheduler DEMO To run the app, simply start it using python3 ./monitor.py (preferably in a detachable screen), then enter the country, city and telegram credentials. The app will execute a test-run using the latest earthquake to make sure the Telegram messages are sent correctly, afterwards it will start the listener for future data retrieval. Quakes that have been notified about will get cached. The cache gets cleared every 7 days automatically. The monitor automatically reaches out to the API every 30 seconds for an update on current quakes, hopefully giving you enough time to find shelter! BOT DEMO Back to Top -------------------------------------------------------------------------------- TELEGRAM TRASH SCHEDULE NOTIFIER Click to view Details TRASH SCHEDULE NOTIFIER This script runs an active scheduler which queries the API of the Bremer Stadtreinigung and looks up the trash schedule for the next day. The script then proceeds to send a telegram message to the given chat-id if the garbage collection is happening on the next day. The script can best be ran in a screen session on some hosted server. No need to worry about credentials - everything is passed in using the getpass module. REQUIREMENTS The script requires 2 modules: apscheduler requests They can be installed using the provided requirements.txt file. To allow Telegram notifications, a Bot needs to be created (see how) and the Chat-ID of the chat/group-chat needs to be provided to the script. Since the contacted API service is quite “primitive”, the street address and house number need to be provided in the correct abbreviations and capitalisations. To check how your address is spelled, check the network logs when accessing the service at https://www.die-bremer-stadtreinigung.de/abfallkalender. DEMO Back to Top -------------------------------------------------------------------------------- ICAL FILE GENERATOR Click to view Details ICAL EVENT GENERATOR This simple tool can be used to generate iCal files for quick event importing into other software like Google and Apple Calendar. REQUIREMENTS It requires two python modules, Flask and icalendar pip3 install icalendar Flask For using the Google Maps feature, the Google Maps API key for address autocompletion needs to be inserted at the bottom of templates/index.html after the https://maps.googleapis.com/maps/api/js?key=INSERT_HERE. The generated iCal file is downloaded to the client system when hitting the Generate button. DEMO Back to Top -------------------------------------------------------------------------------- CANARY TRACKING PIXEL Click to view Details CANARY TRACKING TOKEN This script allows generating canary tracking tokens for emails. Canary tokens are generated based on the recipient and the email subject. The generation is done in a simple bootstrap interface. Server logs are stored in a app.log file. The app can be extended to send messages through Telegram or Discord, instead of writing logs. Use it as you desire. REQUIREMENTS To run the app, Flask and sqlite3 are required. They can be installed using pip3 install -r requirements.txt GUI The GUI is shown below Back to Top -------------------------------------------------------------------------------- STUDIP REST API Click to view Details STUDIP REST API Since StudIP comes with a REST API which is disabled by default, this REST API is used to perform various actions on StudIP using simple HTTP requests. So far the only feature that has been implemented is an automated course sign up on a given time and date. REQUIREMENTS This app requires the libraries: * Flask - for running the REST API * requests - for performing HTTP Requests * APScheduler - for task scheduling To run the app simply execute python3 ./flaskapp.py Back to Top -------------------------------------------------------------------------------- STREAMTOGETHER (SYNCHRONOUS STREAMING) Click to view Details STREAM TOGETHER - A DYI APPROACH So you’ve come across the scenario where you and your friends want to watch a movie together - each of you on their own machine in their own streaming platform. How do you start the movie synchronously? How do you pause it synchronously for bathroom breaks? Thats where this module comes in! With StreamTogether you can pause your media - and that of everyone else as well! REQUIREMENTS This module requires two libraries: pyautogui keyboard They can be installed from the requirements.txt file. FUNCTIONALITY One of you is going to act as the server. Whoever this is needs to run the script as a server: python3 ./stream_together.py server [IPv4-/Public IP-Address] The others will connect as clients: python3 ./stream_together.py client [IPv4-/Public IP-Address] Then, just click all of your media players and hit the spacebar to start streaming synchronously! (More keys will be added soon) DEMO Back to Top -------------------------------------------------------------------------------- MINIHTTPSERVER (MINIMAL HTTP SERVER) Click to view Details MINIHTTPSERVER A minimal python HTTP Server (similar to the built in module http.server). Supports only GET requests and requires no external libraries. Provided by Leonard Haddad in accords with the MIT License. USAGE The server runs on port 80 and listens on all interfaces (0.0.0.0) by default. To change this, execute the script while adding the IP address and ports to listen on. ./server # serves http on http://0.0.0.0:80 ./server 8080 # serves http on http://0.0.0.0:8080 ./server 127.0.0.1 8080 # serves http on http://127.0.0.1:8080 Back to Top -------------------------------------------------------------------------------- DUPLICATE FILE DELETER Click to view Details DUPLICATE FILE DETECTOR This tool attempts to locate duplicate files and prompts you for deletion if files are found. The script can be changed to only detect specific file extensions by commenting in the removed lines. The detection sensitivity is set to 90% by default (just seemed to yield good results for my use-case) and can be adjusted as needed. DEMO python3 ./duplicate_filte_deleter.py Enter the directory to search for duplicate files: ./ Output: Back to Top -------------------------------------------------------------------------------- KEEPBUSY MOUSE MOVER Click to view Details KEEPBUSY MOUSE MOVER Need your PC to stay active? Just use this simple tool. To stop, simply use your switch-window shortcut (Alt-Tab on Windows, Ctrl-Tab on MacOS/Linux) and hit Ctrl-C to stop. REQUIREMENTS This tool requires the Python module pyautogui. ADJUSTING SPEED To adjust to refresh rates beyond 60Hz, make sure to set the refresh_rate = 144 to your monitor’s refresh rate. This will ensure the cursor does not move too quickly. USAGE Run the tool from a commandline window (easiest) or double click the file. chmod +x ./keepbusy ./keepbusy The tool will start moving the mouse in a circle pattern. To stop, hit Ctrl+C. ADJUSTMENTS To make the circle bigger, simply change the r (radius) variable to whatever size you want. DEMO Back to Top -------------------------------------------------------------------------------- INVESTMENT YIELD CALCULATOR Click to view Details INVESTMENT YIELD CALCULATOR Calculates the amount of money one gets for a given annual yield percentage, a certain amount of starting cash and a given timespan. Can also be given an annual investment value so the accumulative wealth is calculated over time. REQUIREMENTS By default, the script does not require any libraries. If you do wish do visualize the annual yield over time, then matplotlib is required. pip install matplotlib USAGE Usage (variable in quare braces is optional): python calc.py <initial $> <Years> <Annual yield as floating point number> [Annual invested money] [graphical - default False] Example given 25k$ starting cash, 25 years timespan, 15% annual yield and 25k$ invested yearly: #> python ./calc.py 25000 25 0.15 25000 Yield using 15.0% annual yield and 25000.0$ starting money and an investment of 25000.0$ annually over 25 years is: 6142799.25$ OPTIONAL: GRAPH VISUALISATION To toggle graph visualisation, add the 5th commandline argument: #> python ./calc.py 25000 25 0.15 25000 True OUTPUT Back to Top -------------------------------------------------------------------------------- BANK-BALANCE CALCULATOR Click to view Details NET BANK-ACCOUNT BALANCE CALCULATOR This tool calculates over a given period of time how much money you will have in your bank account based on your income(s) and expenses. PREREQUISITES Needed libraries: matplotlib USAGE: Open the file config.js and set the parameters. These are as follows: * The array “income” lists a set of income streams * The “income_change_time” should be set to an amount of months after which your income changes to a new amount. If it doesn’t change, set it to Zero (0). * The “changed_income” parameter works just like the income parameter, only it is only used after the “income_change_time” has passed. * The “additional_starting_cash” is money that should be taken into account when starting the calculation, for instance money that people owe you, redeemable credit card points, coupons or similar stuff. * The “expenses” are your expenses. These have the format {“every_x_months” : [payments_seperated_by_commas]}. An example is a monthly payment of 100$: {“1” : [ 100 ]} where 1 stands for paid 1x per month and 100 is the amount paid. Multiple payments would look like this: {“1” : [50, 100, 30]}. * The “limited_expenses” are expenses that will stop being paid after a given amount of time, such as loans or similar. The format here is {“months_remaining” : [payments_seperated_by_commas]}. Example: a 50$/month payment plan that has 3 months remaining would be formatted as {“3” : [50]}. Multiple payments would have the format {“3” : [69, 420, 66]} * The “food” is self explanatory. It lists your food expenses, seperated by commas, similar to the income parameter. To execute the script, use the following syntax: python3 calc.py current_bank_balance months_to_calculate config.json Where: * “current_bank_balance” is how much you currently have in your account and * “months_to_calculate” is how many months ahead you want to calculate (BE WARNED that with too many values the plot will be filled to the brim!) EXAMPLE The below example runs a computation over 12 months time with a current bank balance of 696$, an income of 2300$ (consisting of 2 different income streams), a changed income after 5 months (new income is 700$ down from 2300$), 50$ in additional starting cash (let’s assume he got a gift from a friend or something), 700$ in monthly expenses, 50$ in quarterly expenses, 1500$ in semesterly expenses, 400$/month for food and a payment plan for 2 months for 150$/month. CONFIG.JSON { "income" : [ 2000, 300 ], "income_change_time" : 5, "changed_income" : [ 700 ], "additional_starting_cash" : [ 50 ], "expenses" : { "1" : [ 500, 150, 50 ], "3" : [ 10, 35, 5 ], "6" : [ 1500 ] }, "limited_expenses" : { "2" : [ 50, 100 ] }, "food" : [ 400 ] } python3 calc.py 696 12 config.json OUTPUT Back to Top -------------------------------------------------------------------------------- PASSWORD VAULT Click to view Details PYTHON PASSWORD VAULT This small script contains a standalone password vault, secured with Multi-Layer AES-256 Encryption. The passwords are stored within an unencrypted SQLite Database, the data inside the database is however fully encrypted. REQUIREMENTS The following libraries are required to run the software: pycryptodome pyperclip getpass hashlib FUNCTIONALITY The Password Vault - like any good password manager - can store as many passwords as you wish. These can be modified at any point with the appropriate commands. * Note: the ID parameter is the Primary Key used in the SQLite database, it can be shown using the –list command * The following commands are supported by the Password Vault: --list [username] - list all stored password usernames (passwords are hidden) --display username ID - display password for a specific username --copy username ID - Copy a password to clipboard --add username password - add a new password to the database --edit usr pass newusr newpass ID - edit an existing password --remove username ID - remove a password from the database --changepass - change login password clear or cls - clear the screen --exit - exit NOTE: LOSING THE MASTER PASSWORD MEANS LOSING ACCESS TO THE DATABASE! DO. NOT. LOSE. THE. MASTER. PASSWORD. TECHNICAL FUNCTIONALITY Disclaimer: I’d like to state first and foremost that I’m no expert in cryptography and this is one of my first cryptographic projects. I did however do my research and take into account the security risks involved in creating such a project. As such, the database uses AES-CBC to encrypt its data. The database encryption key is encrypted using 2 layers of AES-256 and 3 different salts (each layer unlocks the next) which can be found in the “decryptEverything” function. To prevent brute-force attacks against the password, the password hash is computed in combination with the 3 abovementioned salts and a bit of AES-256 (completely insane, but does the job). The password is used to decrypt the first salt. The password is then encrypted using the first salt, then concatenated with the first salt to create the decryption key for the second salt. The second salt is then used along with the encrypted second salt as the decryption key for the saved password hash, which is then ran against the hash of the entered password. As mentioned before, insane. The password hash is then concatenated with the first salt to create a decryption key for the database key, which is finally used to decrypt the actual data in the SQLite database. AUTHOR Created by: Leonard Haddad LICENSE This script is provided under the terms of the MIT License. You may modify, share and use the script however you like. I do not take responsibility for any damage caused by the use of this script. Back to Top -------------------------------------------------------------------------------- PASSWORD TRANSFER TOOL Click to view Details PASSWORD TRANSFER TOOL (INSECURE) Use this tool to send passwords or sensitive text over LAN. USAGE The tool can be used with the sender’s IP Address as a CMD argument, or it can be specified through the input field. The password is read from the sender’s clipboard using Pyperclip or using getpass if Pyperclip fails to do so. ./passtransfer [senders_ip_address] REQUIREMENTS The following modules are required: getpass pyperclip Back to Top -------------------------------------------------------------------------------- MASS GIT DIFF Click to view Details MASS GIT DIFF Executes git diff for multiple files simultaneously and generates a greppable changelog file. Authored by Leonard Haddad, provided in accords with the MIT License. USAGE * Open the file and set the commit to the hash of whatever commit you’d like to compare to. * Fill the changed_files list with a list of file names that you’d like to check for changes as strings. * Optional: Add your own enumeration at the bottom of the file. ~> ./massgdiff Output log written to changelog.log Back to Top -------------------------------------------------------------------------------- SPOTIFY API MODULES Click to view Details SPOTIFY API SCRIPTS Tools: * Fetch playlist songs * Create playlist copy REQUIREMENTS * A Spotify API Token * The following python modules: requests STRUCTURE The file config.json contains the necessary Spotify API data. This should be filled accordingly. The module settings_config is used for handling repeated global functionality. The submodules are named according to their functionalities. Back to Top -------------------------------------------------------------------------------- ETHERMINE TICKER Click to view Details ETHERMINE TICKER USAGE Set the ADDRESS constant to your ethereum address, the API_TOKEN to your Etherscan API Token and the POLY_API_TOKEN to your Polygonscan API Token. Get API Tokens: Etherscan: https://etherscan.io/apis Polyscan: https://polygonscan.com/apis Output example (number of x’s after the comma is predefined as seen below): #> ./ethermine_fetch_outstanding_balance.py ===== Ethermine status ===== --- Account Statistics --- Account Balance: x.xxxx ⧫ Polygon Balance: x.xxxx ⧫ --------------------------- Total Balance: x.xxxx ⧫ Total Balance USD: x.xx $ --- Miner Statistics --- Current Hashrate: x MH/s Reported Hashrate: x MH/s Unpaid Balance: x.xxxxx ⧫ Active Workers: x Valid Shares: x Invalid Shares: x Stale Shares: x ============================ REQUIREMENTS The script requires the following modules: # requests_html - not required unless you want to view the next payout date, currently not working requests Please note that getting the requests_html library to work on ARM Chips (for instance Raspberry Pi’s) requires a bit of additional fiddling, check the guide below. AUTHOR Leonard Haddad REQUESTS_HTML ON ARM ONE-LINERS Chromium installation: sudo apt install python3-pip libxslt-dev chromium-codecs-ffmpeg-extra chromium-browser -y && pip3 install --upgrade requests && pip3 install --upgrade requests_html Replacing x86/x64 version of chromium with ARM version: rm -rf ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/* && cd ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/ && ln -s /usr/bin/chromium-browser chrome && cd ~ DETAILED DOCUMENTATION Install pip3 using sudo apt install python3-pip -y Install the required libraries pip3 install requests && pip3 install requests_html To get the ARM chromium browser running (used in background by requests_html) execute sudo apt-get install libxslt-dev chromium-codecs-ffmpeg-extra chromium-browser -y Now execute the python script, this will download a x86/x64 Version of Chromium, however just let it run. The script will then spit out an error as the browser can’t be run on the ARM Chip, this however is completely fine. Execute the following to remove the x86/x64 version of chromium and create a symbolic link in its place pointing to the ARM version of chromium rm -rf ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/* && cd ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/ && ln -s /usr/bin/chromium-browser chrome && cd ~ Back to Top -------------------------------------------------------------------------------- MONOALPHABETIC DECYPHERER Click to view Details MONOALPHABETIC DECYPHERER Authored By: Leonard Haddad LICENSE Access is hereby granted in accords with the MIT License. You may modify and change the provided script files however you like. Any damage caused however, will be your own problem. USAGE The provided decypherer has a wide variety of options. * To get started, enter the cyphered text (without newline breaks, as these will be read in as commands - python input standards) After doing so you can enter a custom alphabet and decide whether all the text should be in lowercase or not. PROVIDED TOOLS As mentioned above, the decypherer has a wide variety of options: * Normal Letter Decypher Mode - Replaces a single manually provided letter with another single manually provided letter * Brute-Force/Round-Robin Letter Mode - Replaces a single manually provided letter with every letter of the alphabet * Word-Match Mode (random/specific) - Attemps to replace an entire word with a provided word, replacing all letters in the text with the ones of the provided word. The word that gets replaced is either random or specific based on your decision. * Letter-Count - Displays letter counts + percentages * Json-Serialise - Allows export of found matchings to a Json file * Json-Deserialise - Allows import of matches from a Json file Usage of these options is explained in the script. To view all available commands, type –help Back to Top -------------------------------------------------------------------------------- REVERSE SHELL Click to view Details PYTHON REVERSE SHELL BY TESTING AND CHECKING OUT THESE SCRIPTS YOU ARE AWARE OF THE DISCLAIMER BELOW AND AGREE TO THE TERMS OF USAGE. VERSION Python Version 3.7.3 NOTES * Make sure to change the IP Adress in the Client script, or this WILL NOT WORK! * Make sure the host PC has port forwarding enabled. Preferably use port 443 to avoid Firewall. * Default Address and Port are 127.0.0.1 and 5050 (127.0.0.1:5050) TERMS AND DISCLAIMER TERMS OF USAGE: USAGE OF THESE SCRIPTS IS PERMITTED FOR EDUCATIONAL AND PEN-TESTING USE ONLY ON SYSTEMS THAT YOU HAVE PROPER PERMISSION TO USE. SHALL YOU DECIDE TO ABUSE THESE SCRIPTS FOR MALICIOUS ACTIVITIES, YOU, AND YOU ONLY, WILL BE HELD RESPONSIBLE. YOU ARE RESPONSIBLE FOR YOUR OWN ACTIONS, AND I SHALL, AND WILL NOT BE HELD RESPONSIBLE FOR ANY MISUSE OF THESE SCRIPTS. BY USING THESE SCRIPTS, YOU ARE AGREEING TO THESE TERMS AND THE DISCLAIMER BELOW. YOU HAVE BEEN WARNED! DISCLAIMER THE PROVIDED SCRIPTS ARE FOR EDUCATIONAL PURPOSES ONLY. THEY AIM TO EDUCATE THE READER ABOUT SOCKETS AND HOW TO BUILD A CONNECTION BETWEEN THEM, WHILE ALSO ISSUING COMMANDS ON THE OTHER END. THESE SCRIPTS ARE INTENTED FOR THAT AND PEN-TESTING PURPOSES ONLY! MISUSE AND OR ABUSE OF THIS TOOL IS FORBIDDEN AND WILL HAVE LEGAL CONSEQUENCES. I SHALL AND WILL NOT BE HELD RESPONSIBLE FOR ANY MISUSE OF THE PROVIDED SCRIPTS. Back to Top -------------------------------------------------------------------------------- MARKDOWN/TEXT EDITOR Click to view Details PYTHON MARKDOWN EDITOR This is a nice little markdown/text editor with built in markdown/html preview and code execution. This script is inspired by the article How to Build a Toy Markdown Editor with Python and Tkinter By Palash Bauri Link to Article Provided unter the MIT License Back to Top -------------------------------------------------------------------------------- YOUTUBE MP3 DOWNLOADER Click to view Details YOUTUBE TO MP3 DOWNLOADER This tool allows you to simply copy a link of a youtube video to your clipboard, which will automatically start downloading that video to MP3. It can also be used on playlists, where it will then download the entire thing. REQUIREMENTS To use this tools, the following libraries are required: youtube-dl ffmpeg ffprobe Alternatively to ffprobe, one might use avprobe on Linux. Using pip install ffmpeg on Windows often doesn’t work, thats why the file ffmpeg.encoded ist included. To get the exe, simply execute certutil -decode ffmpeg.encoded ffmpeg.exe The SHA-256 checksum for the exe is 55720D404B2476631C82F1EFB636A2244BBEB1E197373D553EA724CA1B2A23FE then paste the exe in Python3x/Scripts and add the folder to PATH. LICENSE Provided under the MIT License. Please note that local regulations differ from region to region, and usage of this tool may therefor be prohibited! I do not take responsibility for any damages caused by the use of this script. AUTHOR Author: Leonard Haddad Back to Top -------------------------------------------------------------------------------- POWERSHELL TCP REVERSE SHELL GENERATOR Click to view Details POWERSHELL REVERSE TCP PAYLOAD GENERATOR By: Leonard Haddad USAGE [BATCHFILE] [Setup]: * Change path_to_template_file in batchfile to the path containing the template file * Change path_to_script in batchfile to the path containing the python file [Usage]: shellgen.cmd ip_address port * ip_address - Address that the payload should connect to using reverse connection (attacker IP address) * port - The port to connect to -------------------------------------------------------------------------------- [PYTHON] [Usage]: shellgen.py export_path template_path ip_address port * export_path - The path to export the payload.ps1 file to * template_path - Template file path (including filename and extension) * ip_address - Attacker IP Address * port - Attacker port DISCLAIMER * Privilege Escalation Exploit - By lokiuox on Hak5 Forums * Powershell TCP Reverse Shell - By bascoe10 on Github Back to Top -------------------------------------------------------------------------------- CHAT SPAMMER Click to view Details CHAT SPAMMER This tool is only intended for trolling your friends and family. Use this tool to troll your friends/family by showing them who is the real typing boss! REQUIREMENTS This module requires the modules pyautogui and keyboard (and pyperclip for super speed). Install them using pip install pyautogui keyboard pyperclip USAGE To use the tool, simply pass the text you would like to spam as an argument to the script: python3 spam.py I like to show people who is the boss. Spaces are dealt with automatically, so you do not need quotation marks. To exit, simply hit q while the spammer is running. Back to Top -------------------------------------------------------------------------------- PYTHON INTRODUCTION Click to view Details GETTING STARTED WITH PYTHON INSTALLING PYTHON WINDOWS * Go to https://www.python.org/ * Hover over the “Downloads” button and click on “Python 3.x.x” * Run the executeable and go through the installation wizard ADDING PYTHON TO PATH If python wasn’t automatically added * Navigate to “C:\Python39” if you chose “Install for All Users” or to “C:\Users\Your-Username\AppData\Local\Programs\Python\Python3x" if you chose “Install only for Current User” * Copy the current file path * Go to “This PC”, right click on the empty space and select “Properties” * Click on “Advanced system settings” * Open the “Advanced” tab (if it didn’t automatically open) and click on “Environment Variables…” at the bottom * Under the second section “System Variables”, scroll down until you find a Variable named “Path”. Click on it and then click the “Edit” button. * Click on “New” and paste in the file path you copied earlier * Ok/apply and exit out of everything To check if you correctly defined the Python system variable, fire up your favourite terminal and type the command python --version If you correctly defined the variable, you should get a prompt with your Python version, for instance: #> python --version Python 3.9.5 LINUX Fire up a terminal and type in sudo apt update && sudo apt install python3 python3-pip -y To check if Python got installed correctly, type in the command python3 --version If you correctly defined the variable, you should get a prompt with your Python version, for instance: #> python3 --version Python 3.9.5 COMMENTS In Python, single line comments can be added using #. Multi-line comments are added using triple quotation marks ‘”””’. Example: # This is a single-line comment """ This is a multi-line comment """ DATA TYPES Python has the following data types: * Text: Strings (consists of a list of characters, each of which is also a string on its own. Strings can be defined either with single, or with double quotes) * Numeric types: int, float, complex * Sequence types: list (defined using [ ]), tuples and range * Mapping types: dictionary (defined using { }) * Set types: set, frozenset * Booleans: bool (True/False, first letter uppercase) * Binary types: bytes, bytearray, memoryview Unlike other programming languages (Java/C/etc.) the type keyword of a variable does not need to be provided, and the type of a variable can change dynamically throughout a program. Example: a = 10 print(type(a)) # int a = 's' print(type(a)) # string a = [1,2,3] print(type(a)) # list a = b'hello world' print(type(a)) # bytes Type casting can be done using the corresponding method call: a = 11.5 print(type(a)) # float a = int(a) print(type(a)) # int INPUT/OUTPUT Python offers its own input/output engine using the input and print methods. The input method takes in a string that is displayed before the user’s input. The print method takes in a string and prints it to the screen. (Note: special characters like backslash and single ticks will be printed as escaped out characters, e.g. “'” instead of “’”) Example program to get a user’s name. Note the usage of ‘f’ before the string’s quotation marks, this is used to format the string and can also be done similarily to C with ‘%s’ (e.g. print('Hello %s' % (variable_name))): text = input('Give me your name: ') print(f'Hello {text}!') Will yield the output: #> python input_output.py Give me your name: Test Hello Test! #> INDENTATION Unlike programming languages like Java and C, python does not use curly brackets for indentation. Instead it uses a uniform amount of spaces or tabs. These need to be uniformally used throughout the program (E.g. you can’t use tabs at one location and spaces at another and you can’t change the amount of tabs/spaces used for indentation throughout the program). Method definitions, loops and conditionals use ‘:’ before an indented block. The following example demonstrates this. Java code: void someMethod(){ // Your code } Equivalent python code: def some_method(): # Your code MAIN METHOD Although not necessarily required (except in a dozen scenarios, but you should know that simple scripts can be written without a main method) the “main” method in python is defined using: if __name__ == '__main__': # Your code METHODS Methods in python are defined using the def keyword. The below code gives an example of a method that takes in two variables and gives the sum of them: def sum(a,b): return a + b Methods can have a return type (which can also be dynamic! Pay close attention to your variable types!) or have none (You may also use the return keyword without a provided value). CONDITIONALS Python uses the keywords if, elif and else for conditionals. The elif is a keyword for an else if scenario. Example: if something: # Do something elif something_else: # Do something else else: # Whatever LOOPS Python uses for and while loops. The special thing is that a while loop allows an else statement at the end of it to execute some code when the loop conditional becomes false. Example: # A simple counting loop for _ in range(10): # _ is a wildcard, range(n) creates a list containing the elements k..n-1. # Additional paramters define k and the stepping per iteration. By default k=0 and step=1. # Do something # A simple while loop while something: # Do something else: # Executed when something == False Loops also include the pass, break and continue keywords. The latter two of which work just like in any other prgramming language. pass however, works differently. pass and continue do completely different things. pass simply does nothing, while continue goes on with the next loop iteration. The following example demonstrates this: a = [0, 1, 2] for element in a: if not element: pass print(element) for element in a: if not element: continue print(element) The outputs respectively: 0 1 2 1 2 Source: https://stackoverflow.com/a/9484008/13399409 IMPORTING MODULES Modules/Libraries may be imported using the import keyword. Example: import requests r = requests.get('https://www.google.com') print(r.status_code) # returns http status code, 200 - OK, 404 - Not Found, etc. To run the abovementioned code snippet, the library requests must be installed using pip: Windows: pip install requests Linux: pip3 install requests To install requirements out of a file (most repos come with a requirements.txt file), use the command: pip install -r requirements.txt Back to Top -------------------------------------------------------------------------------- Windows Terminal/Batchfile -------------------------------------------------------------------------------- WINDOWS TERMINAL CUSTOMIZATION Click to view Details CUSTOMIZE POWERSHELL TO LOOK AMAZING These customizations make powershell look sick :) PREREQUISITES For the installation to run successfully, please make sure you are using Windows Terminal and are using Powershell 7 (otherwise PowerShellGet and other modules will not be installable). Also, make sure that running of Powershell scripts is enabled with Set-ExecutionPolicy RemoteSigned. CONTENTS This guide offers multiple add-ons for Powershell (and Windows Terminal) in general. These are: * Unix Toolkit (installable using Git SCM): Allows using tools like standard curl, OpenSSL and similar unix tools. * Chocolatey as a package manager. * Oh-My-Posh (Powershell version of oh-my-zsh) * WSL Customization Note that if you would like to use regular curl, you have to add the command Remove-Item Alias:curl to your PowerShell’s $PROFILE file, since it has an alias for Invoke-WebRequest in PowerShell, which does not support the native curl syntax. -------------------------------------------------------------------------------- UNIX TOOLS To use unix tools like nano/vim either install Chocolatey or install Git-SCM with the optional Unix Tools checked (latter is easier/quicker). -------------------------------------------------------------------------------- CHOCOLATEY Install the choco package manager for Windows Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) -------------------------------------------------------------------------------- FONTS The Caskaydia Cove Nerd Font allows rendering Documents, Git and other Icons within Windows Terminal. To install them, either download the Caskaydia Cove Nerd Font from here: https://www.nerdfonts.com/font-downloads Or click here. -------------------------------------------------------------------------------- OH-MY-POSH This section describes how to install Oh-My-Posh to decorate your terminal in a fashion similar to oh-my-zsh. The available themes can be found here. UPDATE POWERSHELLGET First of all, update PowerShellGet since it is probably outdated. Install-Module -Name PowerShellGet -Force INSTALL PSREADLINE Then install PSReadLine to allow shell line customization and recoloring. Install-Module PSReadLine -AllowPrerelease -Force INSTALL POSH-GIT AND OH-MY-POSH Next up, install Oh-My-Posh and Posh-Git. Install-Module posh-git -Scope CurrentUser winget install JanDeDobbeleer.OhMyPosh -s winget ADD THEME TO POWERSHELL PROFILE Add the following to your PowerShell’s $PROFILE file to enable Oh My Posh on terminal launch. Note that the theme (below set to aliens) can be changed to any of the ones available here by changing the name aliens to the corresponding one. nano $PROFILE Import-Module posh-git oh-my-posh init pwsh --config ~/.aliens.omp.json | Invoke-Expression Set-PoshPrompt -Theme aliens ADD FILE ICONS AND COLORS To enable file type highlighting and icons, install the following package. Install-Module -Name Terminal-Icons -Repository PSGallery Then add this to your PowerShell’s $PROFILE file Import-Module -Name Terminal-Icons ADD AUTOCOMPLETE To enable autocompleting commands and command history, add the following to your PowerShell’s $PROFILE file Import-Module PSReadLine Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle ListView Set-PSReadLineOption -EditMode Windows -------------------------------------------------------------------------------- START NEW WINDOWS TERMINAL WINDOW IN LAST LOCATION If you would like new PowerShell instances to be launched from the folder you were lastly inside of, add the following function to your PowerShell’s $PROFILE file: function z { param ([string]$newpath) cd $newpath $path = "$env:USERPROFILE\AppData\Local\Packages\Microsoft.WindowsTerminal_[YOUR_WT_VERSION]\LocalState\settings.json" $todir = ("$pwd") -replace "\\","\\" ((Get-Content -path $path) -replace '("startingDirectory":)(.*")(.*)', ("`$1`"$todir`"`$3")) | Set-Content -Path $path } Now when changing directories, use the z targetDirectory/ command instead of cd targetDirectory/. Do note that if the directory gets deleted you might encounter a PowerShell launch error and need to start it in a profileless mode to change the directory. z target_directory Kudos to the creator of the caching function1 -------------------------------------------------------------------------------- POWERSHELL PROFILE FILE The complete $PROFILE file looks like this: Import-Module posh-git oh-my-posh init pwsh --config ~/.aliens.omp.json | Invoke-Expression Import-Module -Name Terminal-Icons Import-Module PSReadLine Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle ListView Set-PSReadLineOption -EditMode Windows $ChocolateyProfile = "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" if (Test-Path($ChocolateyProfile)) { Import-Module "$ChocolateyProfile" } function z { param ([string]$newpath) cd $newpath $path = "$env:USERPROFILE\AppData\Local\Packages\Microsoft.WindowsTerminal_[YOUR_WT_VERSION]\LocalState\settings.json" $todir = ("$pwd") -replace "\\","\\" ((Get-Content -path $path) -replace '("startingDirectory":)(.*")(.*)', ("`$1`"$todir`"`$3")) | Set-Content -Path $path } -------------------------------------------------------------------------------- WINDOWS TERMINAL SETTINGS NEW WAY (2023) Change the Color Scheme and font used within Windows Terminal’s Settings to colorScheme - myCampbell and font face - CaskaydiaCove NF. OLD WAY Add/Modify these in the settings.json File: "colorScheme": "myCampbell", "fontFace": "CaskaydiaCove NF", BACKGROUND NEW WAY (2023) Open Windows Terminal’s settings and add the background in the designated spot. To increase readability, change the foreground font’s color to lime or pink and enable opacity, while setting the background’s opacity to 50%. If the background does not fill the entire console, set its mode to stretch. OLD WAY To add a background to your terminal, paste it in: %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_[YOUR_VERSION_PATH]\RoamingState Add this to the Windows Terminal JSON File under “default”: "backgroundImage" : "ms-appdata:///roaming/yourimage.jpg", "backgroundImageStretchMode" : "fill", "useAcrylic" : true, "acrylicOpacity" : 0.5, -------------------------------------------------------------------------------- CUSTOM COMMANDS For advanced users who wish to make their lives easier, you can use the custom command toolkit provided by me here. These are regularily updated with increasing functionality, so it might be wise to keep them within the repository and somehow link them to your environment variables (symlinks in Windows can be created with mklink /D target/directory linkName for directories and mklink target/file/path linkName). -------------------------------------------------------------------------------- WSL The bellow commands add oh-my-zsh to your WSL installation (they have to be executed in a valid WSL installation). To further customize the shell, check out this README. wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/posh-linux-amd64 -O /usr/local/bin/oh-my-posh chmod +x /usr/local/bin/oh-my-posh mkdir ~/.poshthemes wget https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/themes.zip -O ~/.poshthemes/themes.zip unzip ~/.poshthemes/themes.zip -d ~/.poshthemes chmod u+rw ~/.poshthemes/*.json rm ~/.poshthemes/themes.zip 1. https://github.com/microsoft/terminal/issues/3158#issuecomment-817515727 ↩ Back to Top -------------------------------------------------------------------------------- CUSTOM WINDOWS COMMANDS AND GIT SHORTCUTS Click to view Details CUSTOM WINDOWS COMMANDS This package adds multiple shotcuts/combined git commands, and some other useful commands. To use the tools from the command line, add the current folder to your System PATH. After doing so you may use them from the command line. For example: “c” would execute the c.cmd script. SETUP Most commands work out-of-the-box. The following commands require a file path to the scripts to be added to function: * genpass * hashcmp * numconv * oneline * pingme * ptransfer * pv * unzipall FEATURES REQUIREMENTS For the python scripts to work, pyperclip and hashlib need to be installed. A requirements.txt file is available in the Scipts subdirectory. For the password vault to work, check out its page GIT SHORTCUTS Note: the use of the world “params” is used to showcase that the given command can receive parameters. In order to automate the workflow when using git, the following commands were added: * “git add params” shortcut a [params] * “git branch params” shortcut b [params] * “git add –ignore-errors params all && git commit -a” shortcut c [params] * “git checkout params” shortcut checkout [params] * “git fetch params” shortcut f [params] * “git diff params” shortcut gdiff [params] * “git lgs” fancy log shortcut (see disclaimer below) l * “git logs” shortcut lgs * “git merge params” shortcut m [params] * “git pull params” shortcut git pull [params] * “git add * && git commit -a && git pull params” shortcut pull [params] * “git add –ignore-errors * && git commit -a && git pull && git push params” shortcut push [params] * “git remote params” shortcut remote [params] * “git status” shortcut s * “git stash params” shortcut stash [params] ETC AUTOMATIONS * “certutil -decode source [target]” shortcut b64d source [target] * “certutil -encode source [target]” shortcut b64e source [target] * LaTeX delete build files (keeps only .pdf and .tex and deletes generated build files) clean * Python password generation on-the-fly genpass * “netsh wlan show profile [params] key=clear” - if “params” (name of wifi network, in quotation marks if it contains spaces) is supplied, shows the wifi network’s password. getpass [params] * Check file hash using powershell. The “algorithm” needs to be one of powershell’s supported hashes and written as follows (SHA1, SHA256, MD5, etc.) hashcmp (provided_hash) (path/to/source_file) (algorithm) * Get public ip address ip * Convert number from any base to any other base numconv * Performs a “shutdown params /t 0”. “params” is the shutdown type (for instance /r for restart, /s for shutdown) off params * Reads a file out in one line oneline /path/to/file * Attempts to connect to an ip address on a given port pingme * Radio player, currently supports (Requires VLC to be installed!): * NDR 2 Radio [ndr2] * FFN Radio [ffn] * Rotana Radio Jordan [rotana] play [station_name] play stop * Kills radio player/vlc stop * File transfer using python ptransfer ip_address_of_file_sender * Starts python password vault pv * Starts serving an http server using python serve * Unzips all zip files in the current directory unzipall * Opens the current directory wd * Lists network profiles wifi PLEASE NOTE: * To use the “l.cmd” file properly, please execute (in an administrative command shell) the command included at the end of the l.cmd file. This only needs to be done once. DISCLAIMER: The customized git log command included in the “l.cmd” file is not made by me. All credits go to the creator: https://coderwall.com/p/euwpig/a-better-git-log Back to Top -------------------------------------------------------------------------------- Linux/Bash -------------------------------------------------------------------------------- CUSTOMIZE TERMINAL WITH OH-MY-ZSH Click to view Details SETUP OH MY ZSH INSTALL ZSH AND POWERLINE FONTS sudo apt install zsh -y && sudo apt-get install powerline fonts-powerline -y CLONE OH MY ZSH git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh CREATE NEW ZSH CONFIG FILE cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc INSTALL POWERLEVEL9K git clone https://github.com/Powerlevel9k/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k SETUP THEME nano .zshrc ZSH_THEME="powerlevel9k/powerlevel9k" POWERLEVEL9K_DISABLE_RPROMPT=true POWERLEVEL9K_PROMPT_ON_NEWLINE=true POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="" CHANGE DEFAULT SHELL chsh -s /bin/zsh SYNTAX HIGHLIGHTING git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$HOME/.zsh-syntax-highlighting" --depth 1 && echo "source $HOME/.zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> "$HOME/.zshrc" ONE-LINER sudo apt install zsh -y && sudo apt-get install powerline fonts-powerline -y && git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh && cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc && git clone https://github.com/Powerlevel9k/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k && chsh -s /bin/zsh && git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$HOME/.zsh-syntax-highlighting" --depth 1 && echo "source $HOME/.zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> "$HOME/.zshrc" && nano .zshrc REVERT ON ERROR chsh -s /bin/bash SOURCE https://caffeinedev.medium.com/customize-your-terminal-oh-my-zsh-on-ubuntu-18-04-lts-a9b11b63f2 CHANGE COLORS In .zshrc: ZSH_THEME="powerlevel9k/powerlevel9k" Clone tmux-powerline: git clone https://github.com/erikw/tmux-powerline .tmux-powerline Paste files .tmux.conf and .tmux.conf.local in ~/ ONE-LINER sudo apt install tmux -y && git clone https://github.com/erikw/tmux-powerline .tmux-powerline OPTIONAL TOOLS In the folder “tools/” there are a couple tools included: * A file transfer tool written in python 3, * A script to print the content of a file in one line, useful when working with encoding/decoding * A script that converts Windows file endings to unix ones, useful when transferring a file using the above tool from Windows to Linux To add them, execute the following: cd ~ && mkdir etc && echo "export PATH=$PATH:~/etc" >> .zshrc then copy the files into the “etc/” folder. Back to Top -------------------------------------------------------------------------------- CUSTOM LINUX/MACOS COMMANDS Click to view Details CUSTOM LINUX/MACOS COMMANDS Here is a list of custom commands crafted as extensions for your OS’s commands. They include git shortcuts, common task shortcuts and some shortened commands. INSTALLATION To install and use the commands, simply download the install.sh file and execute it: QUICK INSTALL curl https://raw.githubusercontent.com/leolion3/Portfolio/master/Linux/CustomCommands/install.sh | /bin/bash MANUAL INSTALL curl -O https://raw.githubusercontent.com/leolion3/Portfolio/master/Linux/CustomCommands/install.sh chmod +x install.sh ./install.sh The command executables will be placed under ~/.commands, which you then need to add to your shell’s rc file. Back to Top -------------------------------------------------------------------------------- Etc -------------------------------------------------------------------------------- DLU LEGO UNIVERSE SERVER SETUP Click to view Details HOW TO SET UP A LEGO UNIVERSE SERVER USING DLU FOREWORD This guide showcases how to set up a Darkflame Universe server for Lego Universe on Linux (and the Windows Subsystem for Linux WSL) It has been tested and deemed working ob both WSL 1 running Ubuntu 20.04, HiveOS (basically Ubuntu 18.04) and on Ubuntu 20.04 Azure and Oracle VMs. The guide is constantly being updated to be more accurate for inexperienced users and to showcase ways of automating the setup process, as well as showcasing how to automate server maintenance and how to keep it up to date. YOUTUBE TUTORIAL (SEMI-)AUTOMATIC INSTALLATION (*) As of recently, there is a Dockerfile available for easily building the server. To run this, download it to the folder where the res and locale directories are present, and then just execute docker build . -t lego_universe to build the image, and then run the image using docker run -p 1001:1001/udp -p 2000:2000/udp -p 2005:2005/udp -p 3000-3300:3000-3300/udp lego_universe The server will listen on the docker container’s ip address by default, and you will be able to access the server on localhost. Below you can find a tool called buildserver.sh that automatically does almost all the steps in this tutorial. The only thing you need to do is download the client to the machine you wish to build the server on and supply the res folder’s location to the tool when prompted. Note: Due to the nature of Bash, usage of ~ is not permitted. Furthermore, leave out the trailing slash and use slashes instead of backslashes. A valid res path would look like this /home/ubuntu/client/res PREREQUISITES Install the Windows Subsystem for Linux (WSL), it is much easier than doing the stuff in native windows. Or drop Windows for the server altogether and use Linux. This might generally be a good idea as I’ve had 6 Bluesreens of Death because of memory leaks in the MySQL connector and due to accidentally misconfiguring the server’s ini files. On linux the MySQL server would crash, where on Windows it wouldn’t be able to handle MySQL crashing in WSL. After installing wsl, launch a commandline console (Windows Terminal preferrably) and enter “wsl” and hit enter to launch the Windows Subsystem for Linux. On Linux, open a Terminal instance. GETTING THE SOURCECODE You can get the sourcecode from Darkflame’s Github or from my Fork INSTALLING GIT Install git using sudo apt install git -y DOWNLOADING THE SOURCECODE To clone the repository, copy the repository link and execute git clone https://github.com/DarkflameUniverse/DarkflameServer.git --recursive **Note:** If you forget the "--recursive" tag then you need to initialize the submodules afterwards using git submodule init git submodule update --recursive INSTALLING REQUIRED LIBRARIES To compile the sourcecode you need both cmake and gcc, along with the ZLib library. Install them using sudo apt update && sudo apt upgrade -y && sudo apt install gcc cmake zlib1g-dev -y You might have to install build-essential and zlib aswell sudo apt-get update sudo apt-get install build-essential -y sudo apt-get install zlib1g-dev -y SETTING THE CORRECT NETWORK PROTOCOL Nano into the file “CMakeVariables.txt” and set “NET_VERSION” to 171022. If using a DLU Client (modded), set it to 171023. Nano can be used by typing in “nano” followed by the file you would like to edit. To exit nano, hit CTRL+X then y and then enter to save. If you wish to discard the changes, type n instead of y when prompted. For example, to edit the CMakeVariables.txt file type in nano CMakeVariables.txt COMPILING THE SOURCECODE CD into the directory that was created and then execute the following series of commands mkdir build cd build cmake .. make ONE-LINER mkdir build && cd build && sudo apt update && sudo apt upgrade -y && cmake .. && make SETTING UP THE DATABASE MARIADB * Install MariaDB sudo apt-get install mariadb-server -y * Start the service sudo /etc/init.d/mysql start on Linux, you can just execute sudo service mysql start instead. * Login sudo mysql -u root -p and enter the password (if you haven’t changed it, the password is also root) * Create a new database and name it whatever you like, in this example we're using "darkflame" CREATE DATABASE `darkflame`; * Create a new user for the darkflame server (the server should NOT connect using the root user!) CREATE USER 'dflame'@'localhost' IDENTIFIED BY 'dflame'; GRANT ALL PRIVILEGES ON darkflame.* TO 'dflame'@'localhost'; * Note: The user also needs access to the dbo.UNIX_TIMESTAMP subroutine so the WorldServer doesn’t crash whenever you load a leaderboard ingame. Execute GRANT EXECUTE ON PROCEDURE dbo.UNIX_TIMESTAMP TO 'dflame'@'localhost'; or GRANT EXECUTE ON PROCEDURE UNIX_TIMESTAMP TO 'dflame'@'localhost'; * You can check the available databases to make sure yours was created using show databases; * Select the database using use darkflame; CREATING TABLES * Either execute the following while in the build/ directory mysql -u dflame -p darkflame < ../migrations/dlu/0_initial.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/1_unique_charinfo_names.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/2_reporter_id.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/3_add_performance_cost.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/4_friends_list_objectids.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/5_brick_model_sd0.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/6_property_behaviors.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/7_make_play_key_id_nullable.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/8_foreign_play_key.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/9_Update_Leaderboard_Storage.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/10_Security_updates.sql mysql -u dflame -pdflame darkflame < ../migrations/dlu/11_fix_cheat_detection_table.sql * Or create the tables from the initial.sql file manually (you can copy paste each query - or the whole big query - into the console and then hit enter) CREATE OR REPLACE TABLE accounts ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(35) NOT NULL UNIQUE, password TEXT NOT NULL, gm_level INT UNSIGNED NOT NULL DEFAULT 0, locked BOOLEAN NOT NULL DEFAULT FALSE, banned BOOLEAN NOT NULL DEFAULT FALSE, play_key_id INT NOT NULL DEFAULT 0, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), mute_expire BIGINT UNSIGNED NOT NULL DEFAULT 0 ); CREATE OR REPLACE TABLE charinfo ( id BIGINT NOT NULL PRIMARY KEY, account_id INT NOT NULL REFERENCES accounts(id), name VARCHAR(35) NOT NULL, pending_name VARCHAR(35) NOT NULL, needs_rename BOOLEAN NOT NULL DEFAULT FALSE, prop_clone_id BIGINT UNSIGNED AUTO_INCREMENT UNIQUE, last_login BIGINT UNSIGNED NOT NULL DEFAULT 0, permission_map BIGINT UNSIGNED NOT NULL DEFAULT 0 ); CREATE OR REPLACE TABLE charxml ( id BIGINT NOT NULL PRIMARY KEY REFERENCES charinfo(id), xml_data LONGTEXT NOT NULL ); CREATE OR REPLACE TABLE command_log ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, character_id BIGINT NOT NULL REFERENCES charinfo(id), command VARCHAR(256) NOT NULL ); CREATE OR REPLACE TABLE friends ( player_id BIGINT NOT NULL REFERENCES charinfo(id), friend_id BIGINT NOT NULL REFERENCES charinfo(id), best_friend BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (player_id, friend_id) ); CREATE OR REPLACE TABLE leaderboard ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, game_id INT UNSIGNED NOT NULL DEFAULT 0, last_played TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), character_id BIGINT NOT NULL REFERENCES charinfo(id), time BIGINT UNSIGNED NOT NULL, score BIGINT UNSIGNED NOT NULL DEFAULT 0 ); CREATE OR REPLACE TABLE mail ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, sender_id INT NOT NULL DEFAULT 0, sender_name VARCHAR(35) NOT NULL DEFAULT '', receiver_id BIGINT NOT NULL REFERENCES charinfo(id), receiver_name VARCHAR(35) NOT NULL, time_sent BIGINT UNSIGNED NOT NULL, subject TEXT NOT NULL, body TEXT NOT NULL, attachment_id BIGINT NOT NULL DEFAULT 0, attachment_lot INT NOT NULL DEFAULT 0, attachment_subkey BIGINT NOT NULL DEFAULT 0, attachment_count INT NOT NULL DEFAULT 0, was_read BOOLEAN NOT NULL DEFAULT FALSE ); CREATE OR REPLACE TABLE object_id_tracker ( last_object_id BIGINT UNSIGNED NOT NULL DEFAULT 0 PRIMARY KEY ); CREATE OR REPLACE TABLE pet_names ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, pet_name TEXT NOT NULL, approved INT UNSIGNED NOT NULL ); CREATE OR REPLACE TABLE play_keys ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, key_string CHAR(19) NOT NULL UNIQUE, key_uses INT NOT NULL DEFAULT 1, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), active BOOLEAN NOT NULL DEFAULT TRUE ); CREATE OR REPLACE TABLE properties ( id BIGINT NOT NULL PRIMARY KEY, owner_id BIGINT NOT NULL REFERENCES charinfo(id), template_id INT UNSIGNED NOT NULL, clone_id BIGINT UNSIGNED REFERENCES charinfo(prop_clone_id), name TEXT NOT NULL, description TEXT NOT NULL, rent_amount INT NOT NULL, rent_due BIGINT NOT NULL, privacy_option INT NOT NULL, mod_approved BOOLEAN NOT NULL DEFAULT FALSE, last_updated BIGINT NOT NULL, time_claimed BIGINT NOT NULL, rejection_reason TEXT NOT NULL, reputation BIGINT UNSIGNED NOT NULL, zone_id INT NOT NULL ); CREATE OR REPLACE TABLE ugc ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, account_id INT NOT NULL REFERENCES accounts(id), character_id BIGINT NOT NULL REFERENCES charinfo(id), is_optimized BOOLEAN NOT NULL DEFAULT FALSE, lxfml MEDIUMBLOB NOT NULL, bake_ao BOOLEAN NOT NULL DEFAULT FALSE, filename TEXT NOT NULL DEFAULT '' ); CREATE OR REPLACE TABLE properties_contents ( id BIGINT NOT NULL PRIMARY KEY, property_id BIGINT NOT NULL REFERENCES properties(id), ugc_id INT NULL REFERENCES ugc(id), lot INT NOT NULL, x FLOAT NOT NULL, y FLOAT NOT NULL, z FLOAT NOT NULL, rx FLOAT NOT NULL, ry FLOAT NOT NULL, rz FLOAT NOT NULL, rw FLOAT NOT NULL ); CREATE OR REPLACE TABLE activity_log ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, character_id BIGINT NOT NULL REFERENCES charinfo(id), activity INT NOT NULL, time BIGINT UNSIGNED NOT NULL, map_id INT NOT NULL ); CREATE OR REPLACE TABLE bug_reports ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, body TEXT NOT NULL, client_version TEXT NOT NULL, other_player_id TEXT NOT NULL, selection TEXT NOT NULL, submitted TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ); CREATE OR REPLACE TABLE servers ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name TEXT NOT NULL, ip TEXT NOT NULL, port INT NOT NULL, state INT NOT NULL, version INT NOT NULL DEFAULT 0 ); * Check to see that all tables were created using SHOW TABLES; * Exit by typing in “exit” and hitting enter RES FOLDER SETUP * In the “build/” directory create a new directory called “res” mkdir res * Copy the folders “maps”, “macros”, “BrickModels”, “names” and the file “chatplus_en_us.txt” from the “res/” folder in your client to the “res/” folder in the server’s “build/” folder * If you want to be able to use additonal words other than the ones in the chatplus file, execute the following (while in “build/res”): curl -O https://raw.githubusercontent.com/dwyl/english-words/master/words.txt cat words.txt >> chatplus_en_us.txt rm words.txt This will add “over 466k English words” to the allowed wordlist (including cuss words, you can remove these). * [NOTE] In earlier commits the chat didn’t work because the “chatplus_en_us.txt” had DOS line endings (\n\r) and these needed to be converted to unix ones (\n). One way to do this is using dos2unix: sudo apt-get install dos2unix -y dos2unix chatplus_en_us.txt * [NOTE] In earlier commits unapproved pet names also had a visual bug where the background was shifted. This was also due to their DOS line endings. If you face this issue, go into the “names/” directory and execute dos2unix for every txt file in it. * Unzip the “/resources/navmeshes.zip” file to “build/res/maps/navmeshes” (the binary files should be inside the folder navmeshes). The following command can be executed from the “build/” directory. mkdir res/maps/navmeshes/ unzip ../resources/navmeshes.zip res/maps/navmeshes/. [NOTE] If you missed this step you will notice as soon as stromlings start glitching through walls. * In the build directory create a “locale” directory if it does not already exist. mkdir locale * Copy over or create symlinks from “locale.xml” in your client’s “locale” directory to the “build/locale” directory (simlink: “ln -s path/to/client/directory/locale/locale.xml locale/locale.xml” - note that the client directory must always be accessible to the server and the location must never change, therefor copying it is recommended) SQLITE SETUP * Download this using the following command (on Windows execute the following in CMD, DO NOT execute it in Powershell as the syntax will be marked as incorrect, because “curl” in Powershell is an alias of Invoke-WebRequest. You can remove the alias using “Remove-Alias -Name curl” or in powershell 5.x+ “Remove-Item Alias:someAlias”) curl -O https://raw.githubusercontent.com/lcdr/utils/master/utils/fdb_to_sqlite.py and place it inside the unpacked client’s “res” folder, then execute (while in the clients unpacked “res/” folder, on Windows omit the “3” in “python3”) python3 ./fdb_to_sqlite.py ./cdclient.fdb * Rename “cdclient.sqlite” into “CDServer.sqlite” and move it from the client’s “res/” folder into the server’s “build/res” directory. (“build/res/CDServer.sqlite”) * Install sqlite3 sudo apt install sqlite3 -y * Execute the queries found under “migrations/cdserver” (while in “/build/res”). [NOTE] If it says that the files cannot be found, you either did not use the –recursive flag while cloning the directory or did not move the CDServer.sqlite into the right location. Please see above how to initiate the submodules after having already cloned the repository if the first point applies. sqlite3 CDServer.sqlite < ../../migrations/cdserver/0_nt_footrace.sql sqlite3 CDServer.sqlite < ../../migrations/cdserver/1_fix_overbuild_mission.sql sqlite3 CDServer.sqlite < ../../migrations/cdserver/2_script_component.sql sqlite3 CDServer.sqlite < ../../migrations/cdserver/3_plunger_gun_fix.sql sqlite3 CDServer.sqlite < ../../migrations/cdserver/4_nt_footrace_parrot.sql DO NOT DELETE THE cdclient.fdb FILE AS DLU NOW CHECKS FOR ITS EXISTANCE TO DETERMINE THE CLIENT VERSION. If you are updating your server to the latest version, you need to copy the file over again if you deleted it prior to the latest update (October 2022). INI FILES * In the build folder there will now be 4 ini files (authconfig.ini, chatconfig.ini, masterconfig.ini, worldconfig.ini, sharedconfig.ini). Nano into each of them (or use whatever other text editor you use) and set the database address to 127.0.0.1 (or localhost), the username and password to the ones you set above in MariaDB and the database name to the name you set above. Example: mysql_host=127.0.0.1 mysql_database=darkflame mysql_username=dflame mysql_password=dflame Additionally, you might have to add the following line to sharedconfig.ini: client_location=./res If you want to run the server locally or online, you will have to also set the “external_ip” accordingly. See section “Online Multiplayer” for help setting this address. VALIDATE Before running the server, make sure your “build” directory has the following structure and that no files are missing: DarkflameServer/ ├── build/ | ├── AuthServer | ├── ChatServer | ├── MasterServer | ├── WorldServer | ├── locale/ | │ └── locale.xml | ├── res/ | | ├── cdclient.fdb | | ├── CDServer.sqlite | | ├── chatplus_en_us.txt | | ├── macros/ | | | └── ... | | ├── BrickModels/ | | | └── ... | | ├── maps/ | | | ├── navmeshes/ | | | | └── ... | | | └── ... | | └── names/ | | └── ... | ├── authconfig.ini | ├── chatconfig.ini | ├── masterconfig.ini | ├── worldconfig.ini | ├── sharedconfig.ini | └── ... └── ... ADDING ADMIN USER AND RUNNING SERVER * While in the server’s “build” directory, execute ./MasterServer -a to add an admin * Run the server using sudo ./MasterServer (sudo because the port is under 1000 and either needs firewall access or sudo) BRICK-BY-BRICK BUILDING Note: it seems like this issue has been fixed and it is no longer required to do any of the following steps. If you’re still on an older server version, you should update it. For Brick-by-Brick building, an HTTP server should be running and returning error code “404-Not Found” at all times on the client side. This can be achieved by running a python simple HTTP server in the background. To do this, execute the following command on a client’s machine: python3 -m http.server 80 & The HTTP server may later be terminated by bringing it back to the foreground using fg and then by hitting CTRL+C. Alternatively, you can set the client’s UGCSERVERIP in the client’s boot.cfg file to leolion3.github.io/404 as shown below: UGCSERVERIP=0:leolion3.github.io/404 KNOWN ERRORS ERRORS IN MYSQL CONNECTOR If you receive any type of error saying there was an error with the MySQL Connector, then ensure that: * the MySQL Service is running sudo service mysql status * The database was configured correctly, and the server is able to access the database you created. To test this, try to manually log into mysql using the username/password you set for the server mysql -u dflame -p then check to make sure the database exists show databases; then check to make sure the tables exist use darkflame; show tables; the following tables should exist: +---------------------+ | Tables_in_darkflame | +---------------------+ | accounts | | activity_log | | bug_reports | | charinfo | | charxml | | command_log | | friends | | leaderboard | | mail | | object_id_tracker | | pet_names | | play_keys | | properties | | properties_contents | | servers | | ugc | +---------------------+ then check to make sure the tables configured correctly by attempting to read out some of the data select * from accounts; which should return a table containing some data (if you already created an admin), as shown below +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | id | name | password | gm_level | locked | banned | play_key_id | created_at | mute_expire | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | 1 | TestAccount | $2a$12$N0bXz4ERLQFr9pcrhl3JtekXrj0tLFamObrkDjwi/QGMv46TRHnWm | 9 | 0 | 0 | 0 | 2021-12-05 00:00:00 | 0 | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ MANUALLY UPDATING USER DATA If for some reason you need to manually update user data, you can do so by logging into mysql and updating the tables. In this example, I will showcase how to manually update a user’s password. The user passwords are hashed using BCrypt with 12 rounds. For creating the hash and keeping things simple, I will be using an online tool. Our reference user is going to be a user named “TestAccount” with a current password of “Test” (irrelevant) and an ID of “1” (knowing the user’s ID is key to being able to change his data in the table). My current “accounts” table looks like this (see above how to show data from a table in MySQL): +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | id | name | password | gm_level | locked | banned | play_key_id | created_at | mute_expire | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | 1 | TestAccount | $2a$12$N0bXz4ERLQFr9pcrhl3JtekXrj0tLFamObrkDjwi/QGMv46TRHnWm | 9 | 0 | 0 | 0 | 2021-12-05 00:00:00 | 0 | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ * First off, log into mysql using your username/password combination and then select the server’s database: mysql -u dflame -p USE darkflame; * Generate a new password using the online tool. My new password will be “test123” (your hash for the same password will look different because of the different salt used), with a hash value of “$2a$12$J.38IJLJLbvPwkaYsCayqef.9lsXFwyuUFiaAN0Om2XVpzMIvyHjK”. * Update the “password” column in the “accounts” table using: UPDATE accounts SET password='$2a$12$J.38IJLJLbvPwkaYsCayqef.9lsXFwyuUFiaAN0Om2XVpzMIvyHjK' WHERE id=1; * You should get a prompt telling you the query executed successfully Query OK, 1 row affected (0.017 sec) Rows matched: 1 Changed: 1 Warnings: 0 * Check to see the changed data select * from accounts; +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | id | name | password | gm_level | locked | banned | play_key_id | created_at | mute_expire | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ | 1 | TestAccount | $2a$12$J.38IJLJLbvPwkaYsCayqef.9lsXFwyuUFiaAN0Om2XVpzMIvyHjK | 9 | 0 | 0 | 0 | 2021-12-05 00:00:00 | 0 | +----+-------------+--------------------------------------------------------------+----------+--------+--------+-------------+---------------------+-------------+ CLIENT CONFIG Please ensure that you and your friends change the line UGCUSE3DSERVICES=7:1, in your boot.cfg file to UGCUSE3DSERVICES=7:0, Not doing this can result in disconnects after finishing certain missions/achievements on an attempted world switch. AVANT GARDENS SURVIVAL BUG As stated on the Darkflame Repository: “The client script for the survival minigame has a bug in it which can cause the minigame to not load.” Fox fixing this, do the following: * open the client’s “res/scripts/ai/minigame/survival/l_zone_survival_client.lua” in a text editor. (preferably one with line count displayed) * Navigate all the way to the bottom to line 617 * Where it says “PlayerReady(self)”, change it to “onPlayerReady(self)” * Save the file, overwriting Read-only mode. If it cannot be edited in Notepad++, click on “Edit” and then on “Clear Read-Only Flag” and repeat the steps above. ASSEMBLY LOGO NOT DISPLAYED The Assembly Logo is not correctly displayed in some unpacked clients. The reason for this is a misconfigured path in the client’s “assembly_sign_anim_sm.kfm” file. To fix it, do the following: * open the file “res/animations/3dui/assembly_sign_anim_sm.kfm”. Don’t worry about all the “NULL” flags, this is due to the nature of the file type. * In Notepad++, clear the read only flag. See “Avant Gardens Survival Bug” on how to do this. In other text editors, you will have to overwrite the read-only flag when saving. * Replace the very first readable symbol from a “9” to a “(“. * Replace “z:lwo\4_game\client\res” by .\..\.. * The resulting file should look like this CONNECTING TO THE SERVER Based on how your server is hosted, you have to set the server’s ip address in the client’s “boot.cfg” to either of the following: * localhost - if the server is hosted on the same machine * The server’s IPv4 Address - if the server is hosted on the same network * The server’s public IP Address - if the server is hosted on a different network. To change the IP Address in the client, edit the “boot.cfg” file and set the IP Address for both the “PATCHSERVERIP” and “AUTHSERVERIP”. A valid configuration for a server on the same network (with an IPv4 Address of “192.168.1.123”) would look as shown below. SERVERNAME=0:Your Server's Name, PATCHSERVERIP=0:192.168.1.123, AUTHSERVERIP=0:192.168.1.123, [... More stuff down here ...] AUTOMATION FOREWORD This section is NOT intended for normal server operators. While the functionalities below are indeed very useful they may be a tad too complex for normal users. You may attempt to set up some of the below functionalities for your server, but you may indeed fail. Note: Don’t forget to enable the x-bit on the bash scripts to be able to execute them (if not using a .sh file extension) using chmod +x filename KEEPING SERVER UP-TO-DATE Now since the server’s source code is ever changing, one wants to be able to update the server without losing the current ingame progress. To cope with this, one might want to use 2 repositories instead of 1: * One containing the server’s source code, which is updated occasionally to include the newest features and bug fixes * Another one containing the actual server, which is backed up to the cloud (or to a local resource) to store the users’ progress and not have to go through the entire setup process every single time the server is updated. The way I set this up is with the following structure: Somefolder/ └── DarkflameServer/ └── Github/ └── DarkflameServer/ The “DarkflameServer” has the same internal structure of “Github/DarkflameServer”, however instead of actually containing the same directories and C++ source files it instead has symlinks to the files inside the “Github/DarkflameServer” directory. This allows me to independantly update the “DarkflameServer” repository without affecting the current server’s status, since the “DarkflameServer” directory is also a git repository, which is instead used for backing up the server. To skip the whole “res” folder setup, I also chose to keep the “res” folder in my own repository by removing it from the .gitignore. This means that all I have to do when updating the server’s source code is to re-run the “make” instruction and then replace the ini files with my server’s config files, where both tasks have also been automated using some bash scripts. Note: In the following steps, whenever the “original DarkflameServer directory” is mentioned we are talking about the “DarkflameServer/” directory and not about “Github/DarkflameServer”. E.g. your own repository with your own version of the server which only contains symlinks, not the actual clone of DarkflameServer by DLU. To do this yourself * Create the top directory and clone a version of “DarkflameServer” into it and set it up as explained above (set up the server as you normally would). After doing so, navigate into the root of the cloned repository and delete the following directories and files: * .git - since we are going to set up a different git repository for backing up our server. You may aswell just change the upstream URL inside the .git/config file, but this is not recommended for less experienced people. * CMakeLists.txt * CMakeVariables.txt * dAuthServer * dChatFilter * dChatServer * dCommon * dDatabase * dGame * dMasterServer * dNet * dPhysics * dScripts * dNavigation * dWorldServer * dZoneManager * migrations * resources * thirdparty * vanity * versions.txt using: rm -rf .git rm CMakeLists.txt rm CMakeVariables.txt rm -rf dAuthServer rm -rf dChatFilter rm -rf dChatServer rm -rf dCommon rm -rf dDatabase rm -rf dGame rm -rf dMasterServer rm -rf dNet rm -rf dPhysics rm -rf dScripts rm -rf dNavigatiom rm -rf dWorldServer rm -rf dZoneManager rm -rf migrations rm -rf resources rm -rf thirdparty rm -rf vanity rm versions.txt * Navigate out of the “DarkflameServer” directory and create a new directory called “Github”. cd into this directory and clone the “DarkflameServer” repository again. * Create symlinks for the previously deleted files to the newly cloned repository (execute these while in the original “DarkflameServer” directory, not the “Github/DarkflameServer” one) ln -s ../Github/DarkflameServer/CMakeLists.txt CMakeLists.txt ln -s ../Github/DarkflameServer/CMakeVariables.txt CMakeVariables.txt ln -s ../Github/DarkflameServer/dAuthServer dAuthServer ln -s ../Github/DarkflameServer/dChatFilter dChatFilter ln -s ../Github/DarkflameServer/dChatServer dChatServer ln -s ../Github/DarkflameServer/dCommon dCommon ln -s ../Github/DarkflameServer/dDatabase dDatabase ln -s ../Github/DarkflameServer/dGame dGame ln -s ../Github/DarkflameServer/dMasterServer dMasterServer ln -s ../Github/DarkflameServer/dNet dNet ln -s ../Github/DarkflameServer/dPhysics dPhysics ln -s ../Github/DarkflameServer/dNavigation dNavigation ln -s ../Github/DarkflameServer/dScripts dScripts ln -s ../Github/DarkflameServer/dWorldServer dWorldServer ln -s ../Github/DarkflameServer/dZoneManager dZoneManager ln -s ../Github/DarkflameServer/migrations migrations ln -s ../Github/DarkflameServer/resources resources ln -s ../Github/DarkflameServer/thirdparty thirdparty ln -s ../Github/DarkflameServer/vanity vanity ln -s ../Github/DarkflameServer/versions.txt versions.txt * Create a directory called ini_files and cd into it * Copy over the 4 ini files you configured previously to this directory * Create a file called fix_ini_files: cp authconfig.ini ../build/authconfig.ini cp chatconfig.ini ../build/chatconfig.ini cp masterconfig.ini ../build/masterconfig.ini cp worldconfig.ini ../build/worldconfig.ini * Whenever you rebuild the server, simply cd into ini_files and execute ./fix_ini_files to copy over your configs. * Modify the “.gitignore” file inside the original “DarkflameServer” directory to include the “res/” and “locale/” directories: !build/res/ !build/locale/ * Create a new repository somewhere (locally or on Github/Gitlab etc.) and clone it locally. Then move the .git directory from it into the original “DarkflameServer” directory. (replacing the one we deleted previously) * You may now back-up your server independently, all the while keeping it up to date with Darkflame. (You just have to pull the “Github/DarkflameServer” repository whenever it is updated and recompile your server) Note: Since the symlinks may break when you clone the repository to a different system, you may want to add a “fixlnks” file in the root of your repository to automate the symlink creation: rm CMakeLists.txt rm CMakeVariables.txt rm dAuthServer rm dChatFilter rm dChatServer rm dCommon rm dDatabase rm dGame rm dMasterServer rm dServer rm dNet rm dPhysics rm dScripts rm dWorldServer rm dZoneManager rm migrations rm resources rm thirdparty rm vanity rm cmake rm versions.txt ln -s ../Github/DarkflameServer/dServer dServer ln -s ../Github/DarkflameServer/cmake cmake ln -s ../Github/DarkflameServer/CMakeLists.txt CMakeLists.txt ln -s ../Github/DarkflameServer/CMakeVariables.txt CMakeVariables.txt ln -s ../Github/DarkflameServer/dAuthServer dAuthServer ln -s ../Github/DarkflameServer/dChatFilter dChatFilter ln -s ../Github/DarkflameServer/dChatServer dChatServer ln -s ../Github/DarkflameServer/dCommon dCommon ln -s ../Github/DarkflameServer/dDatabase dDatabase ln -s ../Github/DarkflameServer/dGame dGame ln -s ../Github/DarkflameServer/dMasterServer dMasterServer ln -s ../Github/DarkflameServer/dNet dNet ln -s ../Github/DarkflameServer/dPhysics dPhysics ln -s ../Github/DarkflameServer/dScripts dScripts ln -s ../Github/DarkflameServer/dWorldServer dWorldServer ln -s ../Github/DarkflameServer/dZoneManager dZoneManager ln -s ../Github/DarkflameServer/migrations migrations ln -s ../Github/DarkflameServer/resources resources ln -s ../Github/DarkflameServer/thirdparty thirdparty ln -s ../Github/DarkflameServer/vanity vanity ln -s ../Github/DarkflameServer/versions.txt versions.txt BACKING UP AND RESTORING SERVER DATABASE To back up your server’s database, you can dump it to an sql file: sudo /etc/init.d/mysql start mysqldump -u dflame -p darkflame > backup.sql sudo /etc/init.d/mysql stop The data can also be restored using: sudo /etc/init.d/mysql start mysql -u dflame -p darkflame < darkflame.sql sudo /etc/init.d/mysql stop If you have set up your own github repository for your server as shown previously, then you might want to automate the back-up process of your database. To do this, in the root of your repository “DarkflameServer/”: * create a directory called darkflame_database and another one called fix_database. * cd into fix_database * create a file named export_database: rm ../darkflame_database/darkflame.sql sudo /etc/init.d/mysql start mysqldump -u dflame -p darkflame > ../darkflame_database/darkflame.sql sudo /etc/init.d/mysql stop * create a second file called import_database: sudo /etc/init.d/mysql start mysql -u dflame -p darkflame < ../darkflame_database/darkflame.sql sudo /etc/init.d/mysql stop * To export your database you may now execute ./export_database. To import it ./import_database. Note: See the next section for how to automate the backup process further. Note: Restoring the database without it being empty will most likely not work. To avoid conflicts in the SQL Database, drop the current one and import your backup instead. drop database darkflame; create database darkflame; Note: If you would like to automate your repo backup using a Cron job while the server is running, then you have to omit the sudo /etc/init.d/mysql start and sudo /etc/init.d/mysql stop commands in the backup script (export_database). SERVER RUN/SHUTDOWN/BACKUP AUTOMATION To automate the server further, cd into the build directory. * Create a file called “runserver”: sudo service mysql start sudo ./MasterServer * Create another file called “endserver”: cd ../fix_database ./export_database sudo service mysql stop cd .. git add . git commit -m "update database" git push * To run the server, simply execute “./runserver”. To stop it and back-up your progress, execute “./endserver”, which will automatically back up the database to an sql file and push the stuff to your repository. AUTOMATED BACKUP USING CRON JOB Note: if you want to back up your server/database while the server is running then you have to omit the sudo /etc/init.d/mysql start and sudo /etc/init.d/mysql stop in export_database and endserver scripts * Create a new cron job using crontab -e * Scroll all the way to the bottom and add a new cron job (The syntax for the first 2 parameters is MM HH, e.g. at what time the job should run. I will set mine to run at 1 am every night). Note that you have to first cd into your server’s “build/” directory to be able to execute the backup script, so you need to chain the execution command to a cd command. ``` * 1 * * * cd /path/to/DarkflameServer/build && ./endserver ``` * Exit crontab by pressing ESC and then hitting 0 MULTIPLAYER To set up the server for multiplayer you need to change the “external_ip” in the masterserver’s ini file and the IP Addresses in the client’s boot config file (set the client’s ip address to whatever you set the server’s address in the steps below). LAN MULTIPLAYER To play on LAN you need to set the “external_ip” to your local IPv4 address. To get it on windows, execute ipconfig and copy the value beside “IPv4 Address” To get it on Linux, execute ip route get 1.2 * If you don’t have “ip”, use the legacy “ifconfig” command ifconfig ONLINE MULTIPLAYER To create an online multiplayer the “external_ip” needs to be set to your Public IP Address. You can get this by executing curl https://api.ipify.org in Linux or on Windows in CMD (Powershell has an Alias that sets Curl to use Invoke-WebRequest, which returns the data inside the Content variable, so in powershell you would have to execute (curl https://api.ipify.org).Content to get the ip address) * Alternatively you can go to a website like “https://www.whatismyip.com/” or similar to get your public IP Address FIREWALL RULES AND PORT FORWARDING For using online multiplayer you need your firewall to allow access as well as your router to forward the ports to your local machine. Besides the legal limitations on running a Lego Universe online multiplayer server, I would not recommend running a server on your own machine, on your own network, while having this many ports open because of the security concerns it brings with it for inexperienced users. Proceed at your own risk. Lego Universe requires the following ports to operate: * Port 1001 UDP for client authentication * Port 2000 UDP for the masterserver * Port 2005 UDP for the chat server * Ports 3000-3300 (start port is defined in the masterserver’s ini and set to 3000) UDP for the worlds * Port 5000 TCP for the Account Manager You will need to both allow access through firewall for these ports as well as forward them. Note: If you are running advanced networking gear then make sure “L2 Isolation” is NOT enabled. If you are concerned about security, set up the server on a different virtual network and enable some firewall rules. (In Unifi, create a new Network and set it to be isolated from the rest of your networks, then set LAN In rules to Drop any traffic originating from the Network and going into one of your other networks) COMMANDS AND ITEMS COMMANDS Notation: * <> brackets: this value has to be set * [] brackets: this value is optional Command Functionality GM Level /gmlevel <level> Set player’s GM level. 9 is Mythran, 0 is for normal players. /gmadditem <itemID> [quantity] Give the player an item (or many if quantity was set) 8 For more see the Darkflame Repo SPECIAL ITEMS Item Description Objects_1727_name (Jetpack) 1727 Objects_2243_name (Insta-kill hammer) 2243 Back to Top -------------------------------------------------------------------------------- PUBLICATIONS TRASH SEPARATION USING AI (PROTOTYPE PAPER) A paper proposing a robot-arm trash separation approach, applicable on a large-scale using IoT Devices and public networks. The paper can be found here B-MORE-HUMAN: DYNAMIC CHEERING REACTIONS FOR HUMANOID FOOTBALL-ROBOTS (BACHELOR THESIS) The B-Human football robots were incapable of showing emotions during RoboCup games. This has been changed. The process of doing so required various tweaks dozens of code-fragments throughout the B-Human framework and the introduction of various new mechanisms. The thesis can be found here The thesis was graded with a 1.3 (an A if an A+ is the highest possible grade). * The professors’ assessments can be provided upon request. Long live open source and free access to information! Check out the dancing robots below! See some dancing robots! Back to Top CYBERBULLYING - CAUSES, APPEARANCES AND PREVENTION Cyberbullying is one of the 21st century’s new demons, where due to technology it is easier than ever to bully someone without being within their physical vicinity. In this homework for the “Informatik und Gesellschaft” (literally translated “IT and Society”) we dive into the topic of cyberbullying, display some of its root causes and manifestations and then describe ways of preventing it. This publication can be found here It was graded with a 1.3 and the assessment can be provided upon request. If you are suffering from cyberbullying, reach out to either an adult who is close to you, or to your national cyberbullying helpline! If you know someone suffering from cyberbullying, reach out and offer help and/or contact the local authorities! -------------------------------------------------------------------------------- MORE FROM ME TEESPRING MERCH Check out the various cool merch on my Teespring store -------------------------------------------------------------------------------- Check out my Google Play Apps! (*) Note: Google has taken my old developer account offline for being “inactive”. The apps “Sharky” and “Semesterplaner” are temporarily unavailable. The “Easy File Transfer” can be downloaded from its Github link below, while the “Password Generator” needs to be built from source. The apps will be available again soon (on a different app store and maybe on Google Play again…). Self-hosted alternatives are in the works. * OPEN SOURCE EASY FILE TRANSFER (GOOGLE PLAY ) Tired of sending files back and forth through Whatsapp, just to transfer them from your PC to your Phone and vice versa? Would you like an AirDrop equivalent for Android and Windows? Well, this is it! Simply pick the file you want to send, and let the receiving device connect to your device and viola! This is a companion app for the Python File Transfer Tool found above. A Java graphical variant (cross-platform) can be found here The source code can be found on Github Simple File Transfer Android SIMPLE FILE TRANSFER ANDROID This app can be used to transfer files easily between two hosts on any operating system. This app is specifally designed for Android, see below for other operating systems. It is the companion app to the python script ptransfer Licensed in accords with the Apache License 2.0 AUTHOR Created and authored by Leonard Haddad. Portfolio DEMO COMMUNICATION The following illustrates the communication occurring between both clients before, during and after the file transfer. The illustration uses the server (the client sending the file) as a viewpoint. For the client, the transfer direction is simply reversed. --- Server --- Repeat until init signal <- PING -> REPLY --- Actual protocol <- init -> file name <- "Received Name" -> file size <- "SIZE:FILE_SIZE" or "NONEXISTANT" (determines whether the file transfer should start from scratch or resume where it was interrupted) -> "Ready for transfer!" <- "Beginning file transfer..." -> file data <- "GIVE_ME_HASH" -> FILE_HASH Back to Top Simple File Transfer PC SIMPLE FILE TRANSFER PC Desktop version for the Android app Open Source Easy File Transfer. This is a companion App for the Python script ptransfer. For more information, as well as the network protocol used by the application, check out the source code of the Android app on Github. Licensed in accords with the Apache License 2.0 AUTHOR Created and authored by Leonard Haddad. Portfolio BUILDING To build from source, simply clone this repository and execute mvn clean verify javafx:run This requires a valid maven installation with at least JDK 11. Alternatively, download the latest release from here. OPERATING SYSTEMS This App is written with cross-platform support. It runs on any operating system with Java 11. PREVIEW Back to Top List of available Distros: * PC Release * Android App * Python CLI Tool * PC Source * Android Source * SHARKY THE HUNGRY SHARKFISH GAME (GOOGLE PLAY ) Sharky is very Hungry! Help by feeding him as many fish as you can, but watch out for those nasty harpoons! Sharky is a family-friendly game designed for all ages. Furthermore it is completely FREE and AD-FREE. Collect coins to unlock powerups and new skins, and get that highscore! Sharky is a great time killer for your free time as well! Be it while waiting at the airport, or in the subway, sharky can played anywhere at any given time! What are you still waiting for? Get Sharky today! * SEMESTERPLANER - PLAN YOUR SCHEDULE! (GOOGLE PLAY ) Tired of using the same old photoshop template for your semester schedule? Why not automate your schedule creation today using Semester Planer! Just select your work days, how long you work per day and hit that button! Semester Planer will automatically create you a schedule table that can be filled, edited and exported to PNG at any given time! Stop wasting your time and use Semester Planer today! * OPEN-SOURCE PASSWORD GENERATOR APP (GOOGLE PLAY ) Passwords can be a real hustle, especially when you have a thousand accounts for a gazillion different websites... There are some great password generators out there, however how can you ever really trust such a service if it is not open sourced? Stop worrying about your passwords today, with this Free, Open-Source Password Generator! Password Generator is completely FREE and AD-FREE, it works 100% offline an creates you a password in seconds! The source code can be found on Github -------------------------------------------------------------------------------- CONTACT You can contact me using my email address or on Instagram @xleolion3