ð¨ chore: crlf -> lf
This commit is contained in:
parent
48a53a8c96
commit
ad9278ea4b
11 changed files with 433 additions and 438 deletions
|
@ -1,4 +1,4 @@
|
|||
FROM rust:1.74 AS builder
|
||||
FROM rust:1.80 AS builder
|
||||
WORKDIR /usr/src/tamako
|
||||
COPY . .
|
||||
RUN cargo install sqlx-cli --no-default-features --features native-tls,postgres
|
||||
|
@ -12,4 +12,4 @@ COPY --from=builder /usr/src/tamako/tamako /app/
|
|||
COPY --from=builder /usr/src/tamako/migrations/ /app/migrations/
|
||||
COPY --from=builder /usr/src/tamako/assets/ /app/assets/
|
||||
COPY --from=builder /usr/local/cargo/bin/sqlx /usr/local/bin/sqlx
|
||||
CMD [ "/app/tamako" ]
|
||||
CMD [ "/app/tamako" ]
|
||||
|
|
344
LICENSE
344
LICENSE
|
@ -1,172 +1,172 @@
|
|||
Open Software License ("OSL") v. 3.0
|
||||
|
||||
This Open Software License (the "License") applies to any original work of
|
||||
authorship (the "Original Work") whose owner (the "Licensor") has placed the
|
||||
following licensing notice adjacent to the copyright notice for the Original
|
||||
Work:
|
||||
|
||||
Licensed under the Open Software License version 3.0
|
||||
|
||||
1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free,
|
||||
non-exclusive, sublicensable license, for the duration of the copyright, to do
|
||||
the following:
|
||||
|
||||
a) to reproduce the Original Work in copies, either alone or as part of a
|
||||
collective work;
|
||||
|
||||
b) to translate, adapt, alter, transform, modify, or arrange the Original
|
||||
Work, thereby creating derivative works ("Derivative Works") based upon the
|
||||
Original Work;
|
||||
|
||||
c) to distribute or communicate copies of the Original Work and Derivative
|
||||
Works to the public, with the proviso that copies of Original Work or
|
||||
Derivative Works that You distribute or communicate shall be licensed under
|
||||
this Open Software License;
|
||||
|
||||
d) to perform the Original Work publicly; and
|
||||
|
||||
e) to display the Original Work publicly.
|
||||
|
||||
2. Grant of Patent License. Licensor grants You a worldwide, royalty-free,
|
||||
non-exclusive, sublicensable license, under patent claims owned or controlled
|
||||
by the Licensor that are embodied in the Original Work as furnished by the
|
||||
Licensor, for the duration of the patents, to make, use, sell, offer for sale,
|
||||
have made, and import the Original Work and Derivative Works.
|
||||
|
||||
3. Grant of Source Code License. The term "Source Code" means the preferred
|
||||
form of the Original Work for making modifications to it and all available
|
||||
documentation describing how to modify the Original Work. Licensor agrees to
|
||||
provide a machine-readable copy of the Source Code of the Original Work along
|
||||
with each copy of the Original Work that Licensor distributes. Licensor
|
||||
reserves the right to satisfy this obligation by placing a machine-readable
|
||||
copy of the Source Code in an information repository reasonably calculated to
|
||||
permit inexpensive and convenient access by You for as long as Licensor
|
||||
continues to distribute the Original Work.
|
||||
|
||||
4. Exclusions From License Grant. Neither the names of Licensor, nor the names
|
||||
of any contributors to the Original Work, nor any of their trademarks or
|
||||
service marks, may be used to endorse or promote products derived from this
|
||||
Original Work without express prior permission of the Licensor. Except as
|
||||
expressly stated herein, nothing in this License grants any license to
|
||||
Licensor's trademarks, copyrights, patents, trade secrets or any other
|
||||
intellectual property. No patent license is granted to make, use, sell, offer
|
||||
for sale, have made, or import embodiments of any patent claims other than the
|
||||
licensed claims defined in Section 2. No license is granted to the trademarks
|
||||
of Licensor even if such marks are included in the Original Work. Nothing in
|
||||
this License shall be interpreted to prohibit Licensor from licensing under
|
||||
terms different from this License any Original Work that Licensor otherwise
|
||||
would have a right to license.
|
||||
|
||||
5. External Deployment. The term "External Deployment" means the use,
|
||||
distribution, or communication of the Original Work or Derivative Works in any
|
||||
way such that the Original Work or Derivative Works may be used by anyone
|
||||
other than You, whether those works are distributed or communicated to those
|
||||
persons or made available as an application intended for use over a network.
|
||||
As an express condition for the grants of license hereunder, You must treat
|
||||
any External Deployment by You of the Original Work or a Derivative Work as a
|
||||
distribution under section 1(c).
|
||||
|
||||
6. Attribution Rights. You must retain, in the Source Code of any Derivative
|
||||
Works that You create, all copyright, patent, or trademark notices from the
|
||||
Source Code of the Original Work, as well as any notices of licensing and any
|
||||
descriptive text identified therein as an "Attribution Notice." You must cause
|
||||
the Source Code for any Derivative Works that You create to carry a prominent
|
||||
Attribution Notice reasonably calculated to inform recipients that You have
|
||||
modified the Original Work.
|
||||
|
||||
7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
|
||||
the copyright in and to the Original Work and the patent rights granted herein
|
||||
by Licensor are owned by the Licensor or are sublicensed to You under the
|
||||
terms of this License with the permission of the contributor(s) of those
|
||||
copyrights and patent rights. Except as expressly stated in the immediately
|
||||
preceding sentence, the Original Work is provided under this License on an "AS
|
||||
IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without
|
||||
limitation, the warranties of non-infringement, merchantability or fitness for
|
||||
a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK
|
||||
IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this
|
||||
License. No license to the Original Work is granted by this License except
|
||||
under this disclaimer.
|
||||
|
||||
8. Limitation of Liability. Under no circumstances and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise, shall the
|
||||
Licensor be liable to anyone for any indirect, special, incidental, or
|
||||
consequential damages of any character arising as a result of this License or
|
||||
the use of the Original Work including, without limitation, damages for loss
|
||||
of goodwill, work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses. This limitation of liability shall not
|
||||
apply to the extent applicable law prohibits such limitation.
|
||||
|
||||
9. Acceptance and Termination. If, at any time, You expressly assented to this
|
||||
License, that assent indicates your clear and irrevocable acceptance of this
|
||||
License and all of its terms and conditions. If You distribute or communicate
|
||||
copies of the Original Work or a Derivative Work, You must make a reasonable
|
||||
effort under the circumstances to obtain the express assent of recipients to
|
||||
the terms of this License. This License conditions your rights to undertake
|
||||
the activities listed in Section 1, including your right to create Derivative
|
||||
Works based upon the Original Work, and doing so without honoring these terms
|
||||
and conditions is prohibited by copyright law and international treaty.
|
||||
Nothing in this License is intended to affect copyright exceptions and
|
||||
limitations (including "fair use" or "fair dealing"). This License shall
|
||||
terminate immediately and You may no longer exercise any of the rights granted
|
||||
to You by this License upon your failure to honor the conditions in Section
|
||||
1(c).
|
||||
|
||||
10. Termination for Patent Action. This License shall terminate automatically
|
||||
and You may no longer exercise any of the rights granted to You by this
|
||||
License as of the date You commence an action, including a cross-claim or
|
||||
counterclaim, against Licensor or any licensee alleging that the Original Work
|
||||
infringes a patent. This termination provision shall not apply for an action
|
||||
alleging patent infringement by combinations of the Original Work with other
|
||||
software or hardware.
|
||||
|
||||
11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this
|
||||
License may be brought only in the courts of a jurisdiction wherein the
|
||||
Licensor resides or in which Licensor conducts its primary business, and under
|
||||
the laws of that jurisdiction excluding its conflict-of-law provisions. The
|
||||
application of the United Nations Convention on Contracts for the
|
||||
International Sale of Goods is expressly excluded. Any use of the Original
|
||||
Work outside the scope of this License or after its termination shall be
|
||||
subject to the requirements and penalties of copyright or patent law in the
|
||||
appropriate jurisdiction. This section shall survive the termination of this
|
||||
License.
|
||||
|
||||
12. Attorneys' Fees. In any action to enforce the terms of this License or
|
||||
seeking damages relating thereto, the prevailing party shall be entitled to
|
||||
recover its costs and expenses, including, without limitation, reasonable
|
||||
attorneys' fees and costs incurred in connection with such action, including
|
||||
any appeal of such action. This section shall survive the termination of this
|
||||
License.
|
||||
|
||||
13. Miscellaneous. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent necessary
|
||||
to make it enforceable.
|
||||
|
||||
14. Definition of "You" in This License. "You" throughout this License,
|
||||
whether in upper or lower case, means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this License.
|
||||
For legal entities, "You" includes any entity that controls, is controlled by,
|
||||
or is under common control with you. For purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the direction or
|
||||
management of such entity, whether by contract or otherwise, or (ii) ownership
|
||||
of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
|
||||
ownership of such entity.
|
||||
|
||||
15. Right to Use. You may use the Original Work in all ways not otherwise
|
||||
restricted or conditioned by this License or by law, and Licensor promises not
|
||||
to interfere with or be responsible for such uses by You.
|
||||
|
||||
16. Modification of This License. This License is Copyright © 2005 Lawrence
|
||||
Rosen. Permission is granted to copy, distribute, or communicate this License
|
||||
without modification. Nothing in this License permits You to modify this
|
||||
License as applied to the Original Work or to Derivative Works. However, You
|
||||
may modify the text of this License and copy, distribute or communicate your
|
||||
modified version (the "Modified License") and apply it to other original works
|
||||
of authorship subject to the following conditions: (i) You may not indicate in
|
||||
any way that your Modified License is the "Open Software License" or "OSL" and
|
||||
you may not use those names in the name of your Modified License; (ii) You
|
||||
must replace the notice specified in the first paragraph above with the notice
|
||||
"Licensed under <insert your license name here>" or with a notice of your own
|
||||
that is not confusingly similar to the notice in this License; and (iii) You
|
||||
may not claim that your original works are open source software unless your
|
||||
Modified License has been approved by Open Source Initiative (OSI) and You
|
||||
comply with its license review and certification process.
|
||||
Open Software License ("OSL") v. 3.0
|
||||
|
||||
This Open Software License (the "License") applies to any original work of
|
||||
authorship (the "Original Work") whose owner (the "Licensor") has placed the
|
||||
following licensing notice adjacent to the copyright notice for the Original
|
||||
Work:
|
||||
|
||||
Licensed under the Open Software License version 3.0
|
||||
|
||||
1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free,
|
||||
non-exclusive, sublicensable license, for the duration of the copyright, to do
|
||||
the following:
|
||||
|
||||
a) to reproduce the Original Work in copies, either alone or as part of a
|
||||
collective work;
|
||||
|
||||
b) to translate, adapt, alter, transform, modify, or arrange the Original
|
||||
Work, thereby creating derivative works ("Derivative Works") based upon the
|
||||
Original Work;
|
||||
|
||||
c) to distribute or communicate copies of the Original Work and Derivative
|
||||
Works to the public, with the proviso that copies of Original Work or
|
||||
Derivative Works that You distribute or communicate shall be licensed under
|
||||
this Open Software License;
|
||||
|
||||
d) to perform the Original Work publicly; and
|
||||
|
||||
e) to display the Original Work publicly.
|
||||
|
||||
2. Grant of Patent License. Licensor grants You a worldwide, royalty-free,
|
||||
non-exclusive, sublicensable license, under patent claims owned or controlled
|
||||
by the Licensor that are embodied in the Original Work as furnished by the
|
||||
Licensor, for the duration of the patents, to make, use, sell, offer for sale,
|
||||
have made, and import the Original Work and Derivative Works.
|
||||
|
||||
3. Grant of Source Code License. The term "Source Code" means the preferred
|
||||
form of the Original Work for making modifications to it and all available
|
||||
documentation describing how to modify the Original Work. Licensor agrees to
|
||||
provide a machine-readable copy of the Source Code of the Original Work along
|
||||
with each copy of the Original Work that Licensor distributes. Licensor
|
||||
reserves the right to satisfy this obligation by placing a machine-readable
|
||||
copy of the Source Code in an information repository reasonably calculated to
|
||||
permit inexpensive and convenient access by You for as long as Licensor
|
||||
continues to distribute the Original Work.
|
||||
|
||||
4. Exclusions From License Grant. Neither the names of Licensor, nor the names
|
||||
of any contributors to the Original Work, nor any of their trademarks or
|
||||
service marks, may be used to endorse or promote products derived from this
|
||||
Original Work without express prior permission of the Licensor. Except as
|
||||
expressly stated herein, nothing in this License grants any license to
|
||||
Licensor's trademarks, copyrights, patents, trade secrets or any other
|
||||
intellectual property. No patent license is granted to make, use, sell, offer
|
||||
for sale, have made, or import embodiments of any patent claims other than the
|
||||
licensed claims defined in Section 2. No license is granted to the trademarks
|
||||
of Licensor even if such marks are included in the Original Work. Nothing in
|
||||
this License shall be interpreted to prohibit Licensor from licensing under
|
||||
terms different from this License any Original Work that Licensor otherwise
|
||||
would have a right to license.
|
||||
|
||||
5. External Deployment. The term "External Deployment" means the use,
|
||||
distribution, or communication of the Original Work or Derivative Works in any
|
||||
way such that the Original Work or Derivative Works may be used by anyone
|
||||
other than You, whether those works are distributed or communicated to those
|
||||
persons or made available as an application intended for use over a network.
|
||||
As an express condition for the grants of license hereunder, You must treat
|
||||
any External Deployment by You of the Original Work or a Derivative Work as a
|
||||
distribution under section 1(c).
|
||||
|
||||
6. Attribution Rights. You must retain, in the Source Code of any Derivative
|
||||
Works that You create, all copyright, patent, or trademark notices from the
|
||||
Source Code of the Original Work, as well as any notices of licensing and any
|
||||
descriptive text identified therein as an "Attribution Notice." You must cause
|
||||
the Source Code for any Derivative Works that You create to carry a prominent
|
||||
Attribution Notice reasonably calculated to inform recipients that You have
|
||||
modified the Original Work.
|
||||
|
||||
7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
|
||||
the copyright in and to the Original Work and the patent rights granted herein
|
||||
by Licensor are owned by the Licensor or are sublicensed to You under the
|
||||
terms of this License with the permission of the contributor(s) of those
|
||||
copyrights and patent rights. Except as expressly stated in the immediately
|
||||
preceding sentence, the Original Work is provided under this License on an "AS
|
||||
IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without
|
||||
limitation, the warranties of non-infringement, merchantability or fitness for
|
||||
a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK
|
||||
IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this
|
||||
License. No license to the Original Work is granted by this License except
|
||||
under this disclaimer.
|
||||
|
||||
8. Limitation of Liability. Under no circumstances and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise, shall the
|
||||
Licensor be liable to anyone for any indirect, special, incidental, or
|
||||
consequential damages of any character arising as a result of this License or
|
||||
the use of the Original Work including, without limitation, damages for loss
|
||||
of goodwill, work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses. This limitation of liability shall not
|
||||
apply to the extent applicable law prohibits such limitation.
|
||||
|
||||
9. Acceptance and Termination. If, at any time, You expressly assented to this
|
||||
License, that assent indicates your clear and irrevocable acceptance of this
|
||||
License and all of its terms and conditions. If You distribute or communicate
|
||||
copies of the Original Work or a Derivative Work, You must make a reasonable
|
||||
effort under the circumstances to obtain the express assent of recipients to
|
||||
the terms of this License. This License conditions your rights to undertake
|
||||
the activities listed in Section 1, including your right to create Derivative
|
||||
Works based upon the Original Work, and doing so without honoring these terms
|
||||
and conditions is prohibited by copyright law and international treaty.
|
||||
Nothing in this License is intended to affect copyright exceptions and
|
||||
limitations (including "fair use" or "fair dealing"). This License shall
|
||||
terminate immediately and You may no longer exercise any of the rights granted
|
||||
to You by this License upon your failure to honor the conditions in Section
|
||||
1(c).
|
||||
|
||||
10. Termination for Patent Action. This License shall terminate automatically
|
||||
and You may no longer exercise any of the rights granted to You by this
|
||||
License as of the date You commence an action, including a cross-claim or
|
||||
counterclaim, against Licensor or any licensee alleging that the Original Work
|
||||
infringes a patent. This termination provision shall not apply for an action
|
||||
alleging patent infringement by combinations of the Original Work with other
|
||||
software or hardware.
|
||||
|
||||
11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this
|
||||
License may be brought only in the courts of a jurisdiction wherein the
|
||||
Licensor resides or in which Licensor conducts its primary business, and under
|
||||
the laws of that jurisdiction excluding its conflict-of-law provisions. The
|
||||
application of the United Nations Convention on Contracts for the
|
||||
International Sale of Goods is expressly excluded. Any use of the Original
|
||||
Work outside the scope of this License or after its termination shall be
|
||||
subject to the requirements and penalties of copyright or patent law in the
|
||||
appropriate jurisdiction. This section shall survive the termination of this
|
||||
License.
|
||||
|
||||
12. Attorneys' Fees. In any action to enforce the terms of this License or
|
||||
seeking damages relating thereto, the prevailing party shall be entitled to
|
||||
recover its costs and expenses, including, without limitation, reasonable
|
||||
attorneys' fees and costs incurred in connection with such action, including
|
||||
any appeal of such action. This section shall survive the termination of this
|
||||
License.
|
||||
|
||||
13. Miscellaneous. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent necessary
|
||||
to make it enforceable.
|
||||
|
||||
14. Definition of "You" in This License. "You" throughout this License,
|
||||
whether in upper or lower case, means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this License.
|
||||
For legal entities, "You" includes any entity that controls, is controlled by,
|
||||
or is under common control with you. For purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the direction or
|
||||
management of such entity, whether by contract or otherwise, or (ii) ownership
|
||||
of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
|
||||
ownership of such entity.
|
||||
|
||||
15. Right to Use. You may use the Original Work in all ways not otherwise
|
||||
restricted or conditioned by this License or by law, and Licensor promises not
|
||||
to interfere with or be responsible for such uses by You.
|
||||
|
||||
16. Modification of This License. This License is Copyright © 2005 Lawrence
|
||||
Rosen. Permission is granted to copy, distribute, or communicate this License
|
||||
without modification. Nothing in this License permits You to modify this
|
||||
License as applied to the Original Work or to Derivative Works. However, You
|
||||
may modify the text of this License and copy, distribute or communicate your
|
||||
modified version (the "Modified License") and apply it to other original works
|
||||
of authorship subject to the following conditions: (i) You may not indicate in
|
||||
any way that your Modified License is the "Open Software License" or "OSL" and
|
||||
you may not use those names in the name of your Modified License; (ii) You
|
||||
must replace the notice specified in the first paragraph above with the notice
|
||||
"Licensed under <insert your license name here>" or with a notice of your own
|
||||
that is not confusingly similar to the notice in this License; and (iii) You
|
||||
may not claim that your original works are open source software unless your
|
||||
Modified License has been approved by Open Source Initiative (OSI) and You
|
||||
comply with its license review and certification process.
|
||||
|
|
146
README.md
146
README.md
|
@ -1,74 +1,74 @@
|
|||
# tamakoð
|
||||
|
||||
[![status-badge](https://ci.codeberg.org/api/badges/12523/status.svg)](https://ci.codeberg.org/repos/12523)
|
||||
[![crates.io](https://img.shields.io/crates/v/tamako.svg)](https://crates.io/crates/tamako)
|
||||
[![dependency status](https://deps.rs/repo/codeberg/fawn/tamako/status.svg)](https://deps.rs/repo/codeberg/fawn/tamako)
|
||||
|
||||
tamako is a cozy, minimalistic, single-user, _anonymous_ whispers service
|
||||
|
||||
![scrot](meta/scrot.png)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- [sqlx-cli](https://crates.io/crates/sqlx-cli)
|
||||
- a postgresql database
|
||||
|
||||
## Environment variables
|
||||
|
||||
| Name | Type | Default | Notes |
|
||||
| ------------------------- | ------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||
| `TAMAKO_HOST` | String | 127.0.0.1 | the host to run the server on |
|
||||
| `TAMAKO_PORT` | u16 | 8715 | the port to serve the server on |
|
||||
| `DATABASE_URL` | String | _none_ | the database url. this should be a valid postgresql connection url |
|
||||
| `WEBHOOK_URL` | String | _none_ | _(optional)_ the discord webhook url. this will be used to send _private and public_ whispers to a discord channel |
|
||||
| `TAMAKO_SECRET` | String | _none_ | the secret key used for authentication. think of it like a master password |
|
||||
| `TAMAKO_USER_NAME` | String | tamako | _(optional)_ used in the fronted header |
|
||||
| `TAMAKO_USER_DESCRIPTION` | String | Cozy anonymous whispers ð | _(optional)_ used in the fronted header |
|
||||
|
||||
## Installation
|
||||
|
||||
### Docker Compose (Recommended)
|
||||
|
||||
This will also create a postgres service container.
|
||||
|
||||
1. Clone the repo
|
||||
2. Configure `docker-compose.yml` to match your setup, most importantly change the environment variables
|
||||
3. `docker compose up -d`
|
||||
|
||||
### Locally
|
||||
|
||||
1. Clone the repo
|
||||
2. Rename `.env.example` to `.env` and change env variables inside it
|
||||
3. Build tamako: `cargo build --release`
|
||||
4. Run tamako: `./target/release/tamako`
|
||||
|
||||
### Docker
|
||||
|
||||
Using docker directly is possible, but you have to configure the container yourself.
|
||||
|
||||
```sh
|
||||
docker run -d --name tamako --restart unless-stopped -p 8715:8715 fawni/tamako:latest
|
||||
```
|
||||
|
||||
## TUI
|
||||
|
||||
tamako comes with a pretty little tui frontend for it called mochi
|
||||
|
||||
![mochi](meta/mochi.png)
|
||||
|
||||
### Installation
|
||||
|
||||
```sh
|
||||
go install codeberg.org/fawn/tamako/cmd/mochi@latest
|
||||
```
|
||||
### Usage
|
||||
|
||||
```sh
|
||||
mochi --url https://tamako.fawn.moe
|
||||
```
|
||||
|
||||
`mochi -h` for more info.
|
||||
|
||||
## License
|
||||
|
||||
# tamakoð
|
||||
|
||||
[![status-badge](https://ci.codeberg.org/api/badges/12523/status.svg)](https://ci.codeberg.org/repos/12523)
|
||||
[![crates.io](https://img.shields.io/crates/v/tamako.svg)](https://crates.io/crates/tamako)
|
||||
[![dependency status](https://deps.rs/repo/codeberg/fawn/tamako/status.svg)](https://deps.rs/repo/codeberg/fawn/tamako)
|
||||
|
||||
tamako is a cozy, minimalistic, single-user, _anonymous_ whispers service
|
||||
|
||||
![scrot](meta/scrot.png)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- [sqlx-cli](https://crates.io/crates/sqlx-cli)
|
||||
- a postgresql database
|
||||
|
||||
## Environment variables
|
||||
|
||||
| Name | Type | Default | Notes |
|
||||
| ------------------------- | ------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||
| `TAMAKO_HOST` | String | 127.0.0.1 | the host to run the server on |
|
||||
| `TAMAKO_PORT` | u16 | 8715 | the port to serve the server on |
|
||||
| `DATABASE_URL` | String | _none_ | the database url. this should be a valid postgresql connection url |
|
||||
| `WEBHOOK_URL` | String | _none_ | _(optional)_ the discord webhook url. this will be used to send _private and public_ whispers to a discord channel |
|
||||
| `TAMAKO_SECRET` | String | _none_ | the secret key used for authentication. think of it like a master password |
|
||||
| `TAMAKO_USER_NAME` | String | tamako | _(optional)_ used in the fronted header |
|
||||
| `TAMAKO_USER_DESCRIPTION` | String | Cozy anonymous whispers ð | _(optional)_ used in the fronted header |
|
||||
|
||||
## Installation
|
||||
|
||||
### Docker Compose (Recommended)
|
||||
|
||||
This will also create a postgres service container.
|
||||
|
||||
1. Clone the repo
|
||||
2. Configure `docker-compose.yml` to match your setup, most importantly change the environment variables
|
||||
3. `docker compose up -d`
|
||||
|
||||
### Locally
|
||||
|
||||
1. Clone the repo
|
||||
2. Rename `.env.example` to `.env` and change env variables inside it
|
||||
3. Build tamako: `cargo build --release`
|
||||
4. Run tamako: `./target/release/tamako`
|
||||
|
||||
### Docker
|
||||
|
||||
Using docker directly is possible, but you have to configure the container yourself.
|
||||
|
||||
```sh
|
||||
docker run -d --name tamako --restart unless-stopped -p 8715:8715 fawni/tamako:latest
|
||||
```
|
||||
|
||||
## TUI
|
||||
|
||||
tamako comes with a pretty little tui frontend for it called mochi
|
||||
|
||||
![mochi](meta/mochi.png)
|
||||
|
||||
### Installation
|
||||
|
||||
```sh
|
||||
go install codeberg.org/fawn/tamako/cmd/mochi@latest
|
||||
```
|
||||
### Usage
|
||||
|
||||
```sh
|
||||
mochi --url https://tamako.fawn.moe
|
||||
```
|
||||
|
||||
`mochi -h` for more info.
|
||||
|
||||
## License
|
||||
|
||||
[OSL-3.0](LICENSE)
|
|
@ -1,27 +1,27 @@
|
|||
package keys
|
||||
|
||||
import "github.com/charmbracelet/bubbles/key"
|
||||
|
||||
type Keymap struct {
|
||||
Copy key.Binding
|
||||
Refresh key.Binding
|
||||
Delete key.Binding
|
||||
}
|
||||
|
||||
func NewKeymap() *Keymap {
|
||||
return &Keymap{
|
||||
Copy: key.NewBinding(
|
||||
key.WithKeys("enter"),
|
||||
key.WithHelp("enter", "copy"),
|
||||
),
|
||||
Refresh: key.NewBinding(
|
||||
key.WithKeys("r"),
|
||||
key.WithHelp("r", "refresh"),
|
||||
),
|
||||
Delete: key.NewBinding(
|
||||
key.WithKeys("delete"),
|
||||
key.WithHelp("delete", "delete"),
|
||||
key.WithDisabled(), // TODO: implement auth
|
||||
),
|
||||
}
|
||||
}
|
||||
package keys
|
||||
|
||||
import "github.com/charmbracelet/bubbles/key"
|
||||
|
||||
type Keymap struct {
|
||||
Copy key.Binding
|
||||
Refresh key.Binding
|
||||
Delete key.Binding
|
||||
}
|
||||
|
||||
func NewKeymap() *Keymap {
|
||||
return &Keymap{
|
||||
Copy: key.NewBinding(
|
||||
key.WithKeys("enter"),
|
||||
key.WithHelp("enter", "copy"),
|
||||
),
|
||||
Refresh: key.NewBinding(
|
||||
key.WithKeys("r"),
|
||||
key.WithHelp("r", "refresh"),
|
||||
),
|
||||
Delete: key.NewBinding(
|
||||
key.WithKeys("delete"),
|
||||
key.WithHelp("delete", "delete"),
|
||||
key.WithDisabled(), // TODO: implement auth
|
||||
),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +1,29 @@
|
|||
package minimal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tamako"
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tui/styles"
|
||||
)
|
||||
|
||||
func Render(w tamako.Whisper) {
|
||||
res := titleMargin(styles.TitleStyle.Render("tamako") + fmt.Sprintf(" - %s", snowflakeStyle(fmt.Sprintf("%d", w.Snowflake))))
|
||||
res += line("\nName", name(w.Name))
|
||||
res += line("Message", w.Message)
|
||||
res += line("Private", fmt.Sprintf("%t", w.Private))
|
||||
res += line("Timestamp", w.Timestamp)
|
||||
|
||||
fmt.Println(res)
|
||||
}
|
||||
|
||||
func name(n string) string {
|
||||
if n == "anon" {
|
||||
return mutedStyle(n)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func line(key string, value string) string {
|
||||
return textStyle(fmt.Sprintf("%s: %s", keyStyle(key), value)) + "\n"
|
||||
}
|
||||
package minimal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tamako"
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tui/styles"
|
||||
)
|
||||
|
||||
func Render(w tamako.Whisper) {
|
||||
res := titleMargin(styles.TitleStyle.Render("tamako") + fmt.Sprintf(" - %s", snowflakeStyle(fmt.Sprintf("%d", w.Snowflake))))
|
||||
res += line("\nName", name(w.Name))
|
||||
res += line("Message", w.Message)
|
||||
res += line("Private", fmt.Sprintf("%t", w.Private))
|
||||
res += line("Timestamp", w.Timestamp)
|
||||
|
||||
fmt.Println(res)
|
||||
}
|
||||
|
||||
func name(n string) string {
|
||||
if n == "anon" {
|
||||
return mutedStyle(n)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func line(key string, value string) string {
|
||||
return textStyle(fmt.Sprintf("%s: %s", keyStyle(key), value)) + "\n"
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
package minimal
|
||||
|
||||
import (
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tui/styles"
|
||||
lg "github.com/charmbracelet/lipgloss"
|
||||
)
|
||||
|
||||
var (
|
||||
titleMargin = lg.NewStyle().Margin(1, 0, 1, 2).Render
|
||||
textStyle = lg.NewStyle().MarginLeft(2).Render
|
||||
keyStyle = lg.NewStyle().Foreground(styles.Colors.Primary).Bold(true).Render
|
||||
mutedStyle = lg.NewStyle().Foreground(styles.Colors.Muted).Italic(true).Render
|
||||
snowflakeStyle = lg.NewStyle().Italic(true).Render
|
||||
)
|
||||
package minimal
|
||||
|
||||
import (
|
||||
"codeberg.org/fawn/tamako/cmd/mochi/tui/styles"
|
||||
lg "github.com/charmbracelet/lipgloss"
|
||||
)
|
||||
|
||||
var (
|
||||
titleMargin = lg.NewStyle().Margin(1, 0, 1, 2).Render
|
||||
textStyle = lg.NewStyle().MarginLeft(2).Render
|
||||
keyStyle = lg.NewStyle().Foreground(styles.Colors.Primary).Bold(true).Render
|
||||
mutedStyle = lg.NewStyle().Foreground(styles.Colors.Muted).Italic(true).Render
|
||||
snowflakeStyle = lg.NewStyle().Italic(true).Render
|
||||
)
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
package styles
|
||||
|
||||
import (
|
||||
"github.com/charmbracelet/bubbles/list"
|
||||
)
|
||||
|
||||
func NewListDelegate() list.DefaultDelegate {
|
||||
d := list.NewDefaultDelegate()
|
||||
d.Styles.SelectedTitle = d.Styles.SelectedTitle.Foreground(Colors.Primary).BorderLeftForeground(Colors.Primary)
|
||||
d.Styles.SelectedDesc = d.Styles.SelectedDesc.Foreground(Colors.Secondary).BorderLeftForeground(Colors.Primary)
|
||||
d.Styles.NormalTitle = d.Styles.NormalTitle.Foreground(Colors.Text)
|
||||
d.Styles.NormalDesc = d.Styles.NormalDesc.Foreground(Colors.Muted)
|
||||
|
||||
return d
|
||||
}
|
||||
package styles
|
||||
|
||||
import (
|
||||
"github.com/charmbracelet/bubbles/list"
|
||||
)
|
||||
|
||||
func NewListDelegate() list.DefaultDelegate {
|
||||
d := list.NewDefaultDelegate()
|
||||
d.Styles.SelectedTitle = d.Styles.SelectedTitle.Foreground(Colors.Primary).BorderLeftForeground(Colors.Primary)
|
||||
d.Styles.SelectedDesc = d.Styles.SelectedDesc.Foreground(Colors.Secondary).BorderLeftForeground(Colors.Primary)
|
||||
d.Styles.NormalTitle = d.Styles.NormalTitle.Foreground(Colors.Text)
|
||||
d.Styles.NormalDesc = d.Styles.NormalDesc.Foreground(Colors.Muted)
|
||||
|
||||
return d
|
||||
}
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
package styles
|
||||
|
||||
import lg "github.com/charmbracelet/lipgloss"
|
||||
|
||||
var (
|
||||
AppStyle = lg.NewStyle().
|
||||
Margin(1, 2)
|
||||
TitleStyle = lg.NewStyle().
|
||||
Foreground(Colors.White).
|
||||
Background(Colors.Primary).
|
||||
Bold(true).
|
||||
Padding(0, 1)
|
||||
|
||||
Primary = lg.NewStyle().
|
||||
Foreground(Colors.Primary).
|
||||
Render
|
||||
Error = lg.NewStyle().
|
||||
Foreground(Colors.Red).
|
||||
Render
|
||||
Success = lg.NewStyle().
|
||||
Foreground(Colors.Green).
|
||||
Render
|
||||
)
|
||||
package styles
|
||||
|
||||
import lg "github.com/charmbracelet/lipgloss"
|
||||
|
||||
var (
|
||||
AppStyle = lg.NewStyle().
|
||||
Margin(1, 2)
|
||||
TitleStyle = lg.NewStyle().
|
||||
Foreground(Colors.White).
|
||||
Background(Colors.Primary).
|
||||
Bold(true).
|
||||
Padding(0, 1)
|
||||
|
||||
Primary = lg.NewStyle().
|
||||
Foreground(Colors.Primary).
|
||||
Render
|
||||
Error = lg.NewStyle().
|
||||
Foreground(Colors.Red).
|
||||
Render
|
||||
Success = lg.NewStyle().
|
||||
Foreground(Colors.Green).
|
||||
Render
|
||||
)
|
||||
|
|
|
@ -1,41 +1,36 @@
|
|||
version: "3.9"
|
||||
services:
|
||||
db:
|
||||
image: postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: user # change me
|
||||
POSTGRES_PASSWORD: password # change me
|
||||
POSTGRES_DB: tamako
|
||||
ports:
|
||||
- "5432"
|
||||
volumes:
|
||||
- tamakodb:/var/lib/postgresql/data
|
||||
networks:
|
||||
- tamako
|
||||
|
||||
web:
|
||||
image: fawni/tamako # or ghcr.io/fawni/tamako or codeberg.org/fawn/tamako
|
||||
# build: . # uncomment to build the image locally instead of pulling from a registery
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
TAMAKO_HOST: "0.0.0.0" # the host to run the server on.
|
||||
TAMAKO_PORT: "8715" # the port to run the server on. make sure it's not already in use.
|
||||
TAMAKO_SECRET: "" # IMPORTANT: the secret key used for authentication. think of it like a master password.
|
||||
DATABASE_URL: "postgresql://user:password@db:5432/tamako" # the database url. for docker compose, change `user` and `password` to the variables set in `services.db.environment` above.
|
||||
WEBHOOK_URL: "" # (optional) the discord webhook url. this will be used to send whispers (private and public) to a discord channel.
|
||||
# TAMAKO_USER_NAME = "sofia" # (optional) defaults to "tamako". used in the web fronted header.
|
||||
# TAMAKO_USER_DESCRIPTION = "stupidest kibty" # (optional) defaults to "Cozy anonymous whispers ð". used in the web fronted header.
|
||||
ports:
|
||||
- "8715:8715"
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- tamako
|
||||
|
||||
volumes:
|
||||
tamakodb:
|
||||
|
||||
|
||||
networks:
|
||||
tamako:
|
||||
services:
|
||||
db:
|
||||
image: postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: user # change me
|
||||
POSTGRES_PASSWORD: password # change me
|
||||
POSTGRES_DB: tamako
|
||||
ports:
|
||||
- "5432"
|
||||
volumes:
|
||||
- tamakodb:/var/lib/postgresql/data
|
||||
networks:
|
||||
- tamako
|
||||
web:
|
||||
# image: fawni/tamako # or ghcr.io/fawni/tamako or codeberg.org/fawn/tamako
|
||||
build: . # uncomment to build the image locally instead of pulling from a registery
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
TAMAKO_HOST: 0.0.0.0 # the host to run the server on.
|
||||
TAMAKO_PORT: "8715" # the port to run the server on. make sure it's not already in use.
|
||||
TAMAKO_SECRET: "" # IMPORTANT: the secret key used for authentication. think of it like a master password.
|
||||
DATABASE_URL: postgresql://user:password@db:5432/tamako # the database url. for docker compose, change `user` and `password` to the variables set in `services.db.environment` above.
|
||||
WEBHOOK_URL: "" # (optional) the discord webhook url. this will be used to send whispers (private and public) to a discord channel.
|
||||
# TAMAKO_USER_NAME = "sofia" # (optional) defaults to "tamako". used in the web fronted header.
|
||||
# TAMAKO_USER_DESCRIPTION = "stupidest kibty" # (optional) defaults to "Cozy anonymous whispers ð". used in the web fronted header.
|
||||
ports:
|
||||
- 8715:8715
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- tamako
|
||||
volumes:
|
||||
tamakodb:
|
||||
networks:
|
||||
tamako:
|
||||
|
|
30
justfile
30
justfile
|
@ -1,16 +1,16 @@
|
|||
set windows-shell := ["pwsh.exe", "-NoLogo", "-Command"]
|
||||
|
||||
_default:
|
||||
@just --list
|
||||
|
||||
# Setup the database
|
||||
setup:
|
||||
sqlx db setup
|
||||
|
||||
# Exessive clippy lints
|
||||
lint:
|
||||
cargo clippy --locked -- -W clippy::pedantic -W clippy::nursery
|
||||
|
||||
push:
|
||||
git push
|
||||
set windows-shell := ["pwsh.exe", "-NoLogo", "-Command"]
|
||||
|
||||
_default:
|
||||
@just --list
|
||||
|
||||
# Setup the database
|
||||
setup:
|
||||
sqlx db setup
|
||||
|
||||
# Exessive clippy lints
|
||||
lint:
|
||||
cargo clippy --locked -- -W clippy::pedantic -W clippy::nursery
|
||||
|
||||
push:
|
||||
git push
|
||||
git push gh
|
|
@ -1,28 +1,28 @@
|
|||
{% extends "layout/base.html" %}
|
||||
|
||||
{% block title %} tamako::not_found {% endblock %}
|
||||
|
||||
{% block head %}
|
||||
<style>
|
||||
.error {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1.error {
|
||||
font-size: 10rem;
|
||||
}
|
||||
|
||||
.cute {
|
||||
max-height: 350px;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<h1 class="error">404</h1>
|
||||
<p class="error">I AM ERROR. <a href="/">Go back</a></p>
|
||||
<img src="/assets/cinnamoroll.png" class="cute" alt="cinnamoroll"></img>
|
||||
{% extends "layout/base.html" %}
|
||||
|
||||
{% block title %} tamako::not_found {% endblock %}
|
||||
|
||||
{% block head %}
|
||||
<style>
|
||||
.error {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1.error {
|
||||
font-size: 10rem;
|
||||
}
|
||||
|
||||
.cute {
|
||||
max-height: 350px;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<h1 class="error">404</h1>
|
||||
<p class="error">I AM ERROR. <a href="/">Go back</a></p>
|
||||
<img src="/assets/cinnamoroll.png" class="cute" alt="cinnamoroll"></img>
|
||||
{% endblock %}
|
Loadingâ¦
Reference in a new issue