commit 8d35bec77bc4bae98a5e72cd795e564c7fe894e5 Author: RGBCube Date: Fri Dec 16 22:10:01 2022 +0300 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..517d63e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.v] +indent_style = tab +indent_size = 4 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f4011a7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,7 @@ +* text=auto eol=lf +*.bat eol=crlf + +**/*.v linguist-language=V +**/*.vv linguist-language=V +**/*.vsh linguist-language=V +**/v.mod linguist-language=V diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..ac3ea74 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,48 @@ +name: Deploy Docs + +on: push + +jobs: + deploy-docs: + runs-on: ubuntu-latest + steps: + - name: Set Up V + uses: vlang/setup-v@v1.1 + with: + check-latest: true + + - name: Checkout Repository + uses: actions/checkout@v3 + + - name: Checkout Site Repository + uses: actions/checkout@v3 + with: + repository: RGBCube/rgbcube.github.io + path: site + + - name: Generate Docs + run: | + mv ./src ./revolt.v # For the docs header + cp ./README.md ./revolt.v/ # For the README to be included in the docs. + v doc -readme -f html -o ./ -m ./revolt.v + + rm -rf ./site/docs/revolt || true + mkdir -p ./site/docs/revolt + cp -r ./_docs/* ./site/docs/revolt/ + + - name: Add Private Key To SSH Agent + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: ${{ secrets.RGBCUBE_GITHUB_IO_PRIVATE_KEY }} + + - name: Push Docs To GitHub + continue-on-error: true + run: | + cd site + + git config user.name "GitHub Actions" + git config user.email "actions@users.noreply.github.com" + + git add ./ + git commit -m "Deploy revolt.v docs" + git push git@github.com:RGBCube/rgbcube.github.io master diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..89d8e22 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,20 @@ +name: Test + +on: + - pull_request + - push + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Set Up V + uses: vlang/setup-v@v1.1 + with: + check-latest: true + + - name: Checkout Repository + uses: actions/checkout@v3 + + - name: Test + run: v test ./ diff --git a/.github/workflows/verify-formatting.yml b/.github/workflows/verify-formatting.yml new file mode 100644 index 0000000..feb2fd0 --- /dev/null +++ b/.github/workflows/verify-formatting.yml @@ -0,0 +1,20 @@ +name: Verify Formatting + +on: + - pull_request + - push + +jobs: + verify-formatting: + runs-on: ubuntu-latest + steps: + - name: Set Up V + uses: vlang/setup-v@v1.1 + with: + check-latest: true + + - name: Checkout Repository + uses: actions/checkout@v3 + + - name: Verify That The Code Is Formatted + run: v fmt -verify ./ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b00bfca --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +main +revolt +*.exe +*.exe~ +*.so +*.dylib +*.dll +bin/ +.DS_Store +.idea/ +.vscode/ +*.iml diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6c8625b --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2022-present RGBCube + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..01de1d7 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +
+ +

revolt.v

+ +[Docs](https://rgbcube.github.io/docs/revolt) | [Examples](https://github.com/RGBCube/bonfire.v/tree/master/examples) + +A Revolt.chat API wrapper for the V programming language. + +
+ +## Installation + +After doing these, you can use the module in your V programs by importing `rgbcube.revolt`. + +### Via VPM + +```bash +v install RGBCube.revolt +``` + +### Via Git + +```bash +git clone https://github.com/RGBCube/revolt.v ~/.vmodules/rgbcube/revolt +``` + +## Examples + +Here are some examples to get you started: + +TODO + +## License + +``` +MIT License + +Copyright (c) 2022-present RGBCube + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` diff --git a/src/id_holder.v b/src/id_holder.v new file mode 100644 index 0000000..d11cd0b --- /dev/null +++ b/src/id_holder.v @@ -0,0 +1,28 @@ +module revolt + +import time +import encoding.binary +import encoding.base32 + +const ulid_base32_alphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'.bytes() + +// IdHolder is a holder for ULID. Every Revolt object has an (UL)ID. +[noinit] +pub struct IdHolder { + id string +} + +// FIXME: This is broken. + +// created_at returns the creation time of the IdHolder. +pub fn (idh IdHolder) created_at() !Time { + encoder := base32.new_encoding_with_padding(revolt.ulid_base32_alphabet, base32.no_padding) + + str_10_bytes := idh.id[..10].bytes() + u64_bytes := encoder.decode(str_10_bytes) or { return error('invalid ULID') } + + milliseconds_total := dump(binary.big_endian_u64_end(u64_bytes)) + seconds := i64(milliseconds_total / 1000) + microseconds := int(milliseconds_total % 1000) * 1000 + return time.unix2(seconds, microseconds * 1000) +} diff --git a/src/time.v b/src/time.v new file mode 100644 index 0000000..49d759b --- /dev/null +++ b/src/time.v @@ -0,0 +1,25 @@ +module revolt + +import time + +// Time is a time.Time that can be formatted as a Revolt timestamp. +pub type Time = time.Time + +// TimeFormat is an enum of all possible Revolt timestamp formats. +// See https://developers.revolt.chat/markdown#timestamps. +pub enum TimeFormat as u8 { + short_time = u8(`t`) // 21:27 + long_time = u8(`T`) // 21:27:42 + short_date = u8(`d`) // 4/12/2022 + long_date = u8(`D`) // 4 December 2022 + short_date_time = u8(`f`) // 4 December 2022 21:27 + long_date_time = u8(`F`) // Sunday, 4 December 2022 21:27 + relative = u8(`R`) // 2 days ago, Now, etc. +} + +// format returns a Revolt representation of the time in the given format. +// E.g. for TimeFormat.short_date_time ran on a time of 1670178420. +[inline] +pub fn (t Time) format(format TimeFormat) string { + return '' +} diff --git a/v.mod b/v.mod new file mode 100644 index 0000000..fb86ccf --- /dev/null +++ b/v.mod @@ -0,0 +1,8 @@ +Module { + name: 'revolt' + description: 'A Revolt.chat API wrapper for the V programming language.' + version: '0.0.1' + license: 'MIT' + repo_url: 'https://github.com/RGBCube/revolt.v' + dependencies: [] +}