diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..cb1b9c8
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,76 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+#
+name: "CodeQL"
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "main" ]
+ schedule:
+ - cron: '21 13 * * 0'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'java' ]
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
+ # Use only 'java' to analyze code written in Java, Kotlin or both
+ # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
+ # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+
+ # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
+ # queries: security-extended,security-and-quality
+
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v2
+
+ # âšī¸ Command-line programs to run using the OS shell.
+ # đ See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
+
+ # If the Autobuild fails above, remove it and uncomment the following three lines.
+ # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
+
+ # - run: |
+ # echo "Run, Build Application using script"
+ # ./location_of_script_within_repo/buildscript.sh
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
+ with:
+ category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
new file mode 100644
index 0000000..f5e6591
--- /dev/null
+++ b/.github/workflows/gradle.yml
@@ -0,0 +1,34 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
+
+name: Java CI with Gradle
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ - name: Build with Gradle
+ uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
+ with:
+ arguments: build
diff --git a/README.md b/README.md
index 0c300bc..dd42129 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,130 @@
# SimplexSS
+
+ ![](https://img.shields.io/github/license/SimplexDevelopment/SimplexSS)
+ ![](https://img.shields.io/github/languages/top/SimplexDevelopment/SimplexSS)
+ ![](https://img.shields.io/github/workflow/status/SimplexDevelopment/SimplexSS/CodeQL/main)
+ ![](https://img.shields.io/github/v/release/SimplexDevelopment/SimplexSS?include_prereleases)
+ ![](https://jitpack.io/v/SimplexDevelopment/SimplexSS.svg)
+ ![](https://img.shields.io/github/issues/SimplexDevelopment/SimplexSS)
+ ![](https://img.shields.io/github/stars/SimplexDevelopment/SimplexSS?style=social)
+ ![](https://img.shields.io/github/forks/SimplexDevelopment/SimplexSS?style=social)
+
A reactive non blocking api for scheduling runnable tasks (called services)
+
+# Adding SimplexSS to your project
+
+ In order to use SimplexSS in your project, you need to add the jitpack repository to your build.gradle or pom.xml file.
+
+ Here's an example, in Gradle:
+
+ ```gradle
+ repositories {
+ maven {
+ id 'jitpack'
+ url 'https://jitpack.io'
+ }
+ }
+ ```
+
+ Then, you can add the dependency.
+
+ The `groupId` is `com.github.SimplexDevelopment`
+
+ The `artifactId` is `SimplexSS`
+
+ The `version` is `1.0.1-SNAPSHOT`
+
+ It is recommended you use either the Maven Shade Plugin,
+
+ ```maven
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ...
+
+
+
+ true
+ path.to.MainClass
+
+
+
+ ...
+
+
+
+ ```
+
+ or the Gradle Shadow Plugin (com.github.johnrengelman.shadow).
+
+ ```gradle
+ plugins {
+ id 'com.github.johnrengelman.shadow' version '7.1.2'
+ }
+ ```
+
+ Here is an example of the dependency, in Gradle:
+
+ ```gradle
+ dependencies {
+ shadow 'com.github.SimplexDevelopment:SimplexSS:1.0.1-SNAPSHOT'
+ }
+ ```
+
+# Using SimplexSS
+
+ To use Simplex Scheduling System, the first thing you need to do is initialize a new instance of the Scheduling System.
+
+ ```Java
+ private SchedulingSystem scheduler;
+
+ @Override
+ public void onEnable() {
+ this.scheduler = new SchedulingSystem<>(this);
+ }
+ ```
+
+ Then, you should use the Service Manager to create some new service pools. You can use `ServicePool#emptyBukkitServicePool(String, JavaPlugin)` for a service pool which will operate on the main server thread, or you can use `ServicePool#emptyServicePool(String, boolean)` for a completely separate, non-blocking scheduler which can be either singular or multithreaded. You should also use the service manager stream to register your services, and assign a Flux object so we can cancel the services later on in `JavaPlugin#onDisable()`.
+
+ ```Java
+ private Flux disposables;
+
+ @Override
+ public void onEnable() {
+ this.scheduler = new SchedulingSystem<>(this);
+
+ YourFirstService firstService;
+ YourSecondService secondService;
+ YourThirdService thirdService;
+
+ scheduler.getServiceManager().subscribe(manager -> {
+ manager.emptyBukkitServicePool("pool_name", this).subscribe(pool -> {
+ Set dispos = new HashSet<>();
+
+ firstService = new YourFirstService(pool, "first_service_name");
+ secondService = new YourSecondService(pool, "second_service_name", 20 * 60L);
+ thirdService = new YourThirdService(pool, "third_service_name", 20 * 60L, 20 * 60 * 10L, true, false);
+
+ scheduler.queue(firstService).subscribe(dispos::add);
+ scheduler.queue(secondService).subscribe(dispos::add);
+ scheduler.queue(thirdService).subscribe(dispos::add);
+
+ disposables = Flux.fromIterable(dispos);
+ });
+ });
+ }
+ ```
+
+ You can then stop, cancel, and/or dispose of the tasks in your `JavaPlugin#onDisable()` method by calling:
+ ```Java
+ @Override
+ public void onDisable() {
+ scheduler.getServiceManager().subscribe(manager -> {
+ manager.getServicePools().doOnEach(signal -> Objects.requireNonNull(signal.get())
+ .stopServices(disposables)
+ .subscribe());
+ });
+ }
+ ```