Compare commits
16 Commits
c169848418
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ac1d00b5c | |||
| da581713b6 | |||
| 2d0601a59e | |||
| 7de5d8fdea | |||
| b8e01ef426 | |||
| 5d62bd065c | |||
| 1f2b49ba3f | |||
| 4294ca098c | |||
| 14f18c03c8 | |||
| 719501edaf | |||
|
26b3856adb
|
|||
| 927a3c386e | |||
|
|
33326bca92 | ||
|
|
5ac0ba3d5d | ||
|
|
c26fe18255 | ||
|
|
cf1ce6cf60 |
8
.gitignore
vendored
@@ -1,8 +1,8 @@
|
||||
# NixOS
|
||||
result
|
||||
.envrc
|
||||
.direnv/
|
||||
|
||||
.jekyll-cache/
|
||||
_site/
|
||||
|
||||
assets/css/index.css
|
||||
# Build artifacts
|
||||
static/css/index.css
|
||||
public/
|
||||
16
.woodpecker.yml
Normal file
@@ -0,0 +1,16 @@
|
||||
steps:
|
||||
build:
|
||||
image: alpine:3.19
|
||||
commands:
|
||||
- apk add --no-cache zola npm
|
||||
- npm install -D tailwindcss @tailwindcss/typography
|
||||
- npx tailwindcss -i input.css -o static/css/index.css --minify
|
||||
- zola build
|
||||
deploy:
|
||||
image: git.polynom.me/papatutuwawa/woodpecker-ssg-deploy@sha256:9cfec13eb8ab1b8920c2f1f00f0258a7bfd159fe4e14e0985328086392c0da34
|
||||
secrets: [ ssh_key ]
|
||||
settings:
|
||||
email: "ci@polynom.me"
|
||||
name: "polynom.me CI system"
|
||||
token_env: "SSH_KEY"
|
||||
output: "public"
|
||||
31
README.md
@@ -4,15 +4,7 @@ See the live website at [moxxy.org](https://moxxy.org).
|
||||
|
||||
## Development
|
||||
|
||||
Developing the site requires [jekyll](https://jekyllrb.com/) and [tailwindcss](https://tailwindcss.com/).
|
||||
|
||||
### Jekyll
|
||||
|
||||
This website is statically generated using jekyll. Besides jekyll, the two
|
||||
jekyll plugins [jekyll-seo-tag](https://github.com/jekyll/jekyll-seo-tag) and [jekyll-feed](https://github.com/jekyll/jekyll-feed) must be installed.
|
||||
|
||||
See [here](https://jekyllrb.com/docs/plugins/installation/) for instructions
|
||||
on installing plugins.
|
||||
Developing the site requires [zola](https://www.getzola.org/) and [tailwindcss](https://tailwindcss.com/).
|
||||
|
||||
### Tailwind
|
||||
|
||||
@@ -25,20 +17,25 @@ required for building the website.
|
||||
|
||||
In order to test changes, assuming jekyll and tailwindcss are set up, ...
|
||||
|
||||
1. Run `tailwindcss -c tailwind.config.js -i input.css --watch --output ./_site/assets/css/index.css` from the root of the repository.
|
||||
2. Run `jekyll serve` from the root of the repository.
|
||||
1. Run `tailwindcss -c tailwind.config.js -i input.css --watch --output ./static/css/index.css` from the root of the repository.
|
||||
2. Run `zola serve` from the root of the repository.
|
||||
|
||||
This gives you an environment where tailwindcss and jekyll regenerate their
|
||||
This gives you an environment where tailwindcss and zola regenerate their
|
||||
previews when modifying their files.
|
||||
|
||||
### Building
|
||||
|
||||
In order to build the website, you can either use the NixOS flake at the root
|
||||
of the repository (`nix build .#website`) or build the website and CSS separately:
|
||||
1. `tailwindcss --input ./input.css --output ./static/css/index.css`
|
||||
2. `zola build`
|
||||
|
||||
1. `jekyll build --future`
|
||||
2. `cp -r ./assets _site/assets`
|
||||
3. `tailwindcss --input ./input.css --output ./_site/assets/css/index.css`
|
||||
### Adding a Blog Post
|
||||
|
||||
If you want to add a blog post, considert the following:
|
||||
|
||||
- If the post should contain media, create a directory in `./content/blog/` with the following naming scheme `YYYY-MM-DD-<Title>`. Inside that directory, create an `index.md` file where you can write the post in Markdown. The media files can then be placed inside that directory and included using ``.
|
||||
- If the post does not contain media, create a file in `./content/blog/` with the following naming scheme `YYYY-MM-DD-<Title>`. Inside that file you can write the post in Markdown.
|
||||
|
||||
Note that the existing posts specify an alias as this site has been migrated from jekyll to zola. It is not required for new posts.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
<div class="relative h-16 inset-x-0 inset-y-0 px-4 shadow-md grid place-items-center">
|
||||
<div class="flex flex-row items-center w-full">
|
||||
<!-- The Moxxy logo -->
|
||||
<a href="/index.html">
|
||||
<img src="/assets/img/logo.png" class="w-12 h-12 p-2" />
|
||||
</a>
|
||||
|
||||
<a href="/index.html">
|
||||
<span class="font-bold">Moxxy</span>
|
||||
</a>
|
||||
|
||||
<!-- Spacer -->
|
||||
<div class="grow"></div>
|
||||
|
||||
<a href="/posts.html" class="px-2 text-sky-400">Blog</a>
|
||||
<a href="/developers.html" class="px-2 text-sky-400">Developers</a>
|
||||
<a href="{{ site.sourceUrl }}" class="px-2 text-sky-400">Source</a>
|
||||
</div>
|
||||
</div>
|
||||
82
config.toml
Normal file
@@ -0,0 +1,82 @@
|
||||
base_url = "https://moxxy.org"
|
||||
title = "Moxxy | A modern XMPP client"
|
||||
description = "A modern XMPP client"
|
||||
|
||||
compile_sass = false
|
||||
build_search_index = false
|
||||
generate_feed = true
|
||||
feed_filename = "feed.xml"
|
||||
|
||||
[extra]
|
||||
heroText = "An experimental and modern XMPP client"
|
||||
mainScreenshot = "img/screenshots/1.png"
|
||||
|
||||
features = [
|
||||
"End-to-End encryption using OMEMO (0.8.3)",
|
||||
"Stickers",
|
||||
"Reactions",
|
||||
"Retract messages",
|
||||
"Voice messages",
|
||||
"Swipe-to-quote",
|
||||
"Chat background images",
|
||||
"Optional privacy-preserving integration with phone contacts",
|
||||
"Open-Source"
|
||||
]
|
||||
|
||||
screenshots = [
|
||||
"img/screenshots/1.png",
|
||||
"img/screenshots/2.png",
|
||||
]
|
||||
|
||||
sourceUrl = "https://codeberg.org/moxxy/moxxy"
|
||||
githubMirrorUrl = "https://github.com/PapaTutuWawa/moxxy"
|
||||
generalMuc = "xmpp:moxxy@muc.moxxy.org?join"
|
||||
developmentMuc = "xmpp:dev@muc.moxxy.org?join"
|
||||
|
||||
[[extra.libraries]]
|
||||
url = "https://codeberg.org/moxxy/moxxmpp"
|
||||
name = "moxxmpp"
|
||||
desc = "XMPP library written in Dart"
|
||||
specific = false
|
||||
|
||||
[[extra.libraries]]
|
||||
url = "https://codeberg.org/moxxy/moxdns"
|
||||
name = "moxdns"
|
||||
desc = "DNS SRV resolver for Flutter"
|
||||
specific = true
|
||||
|
||||
[[extra.libraries]]
|
||||
url = "https://codeberg.org/moxxy/moxlib"
|
||||
name = "moxlib"
|
||||
desc = "Shared functions for Moxxy-specific projects"
|
||||
specific = true
|
||||
|
||||
[[extra.libraries]]
|
||||
url = "https://codeberg.org/moxxy/moxxy_native"
|
||||
name = "moxxy_native"
|
||||
desc = "Platform-specific code"
|
||||
specific = true
|
||||
|
||||
[[extra.libraries]]
|
||||
url = "https://codeberg.org/PapaTutuWawa/omemo_dart"
|
||||
name = "omemo_dart"
|
||||
desc = "Implementation of the cryptography for OMEMO 0.8.3 with a high-level interface"
|
||||
specific = false
|
||||
|
||||
[[extra.customXeps]]
|
||||
name = "Extensible File Thumbnails"
|
||||
desc = "Provide an extensible way of specifying thumbnails that are neccessarily binary data"
|
||||
url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-extensible-file-thumbnails.md"
|
||||
|
||||
[[extra.customXeps]]
|
||||
name = "File Upload Notification"
|
||||
desc = "Allow communicating that an OOB file upload is currently running to improve the consistency of the conversation"
|
||||
url = "https://codeberg.org/moxxy/custom-xeps/src/branch/master/xep-xxxx-file-upload-notification.md"
|
||||
|
||||
[[extra.badges]]
|
||||
url = "https://apt.izzysoft.de/fdroid/index/apk/org.moxxy.moxxyv2"
|
||||
image = "img/badges/IzzyOnDroid.png"
|
||||
|
||||
[[extra.badges]]
|
||||
url = "https://codeberg.org/moxxy/moxxy/releases/latest"
|
||||
image = "img/badges/codeberg.png"
|
||||
3
content/_index.md
Normal file
@@ -0,0 +1,3 @@
|
||||
+++
|
||||
template = "index.html"
|
||||
+++
|
||||
@@ -1,11 +1,18 @@
|
||||
---
|
||||
layout: post
|
||||
title: Moxxy's New Website
|
||||
author: PapaTutuWawa
|
||||
---
|
||||
+++
|
||||
title = "Moxxy's New Website"
|
||||
date = "2023-01-24"
|
||||
template = "post.html"
|
||||
|
||||
aliases = [ "posts/2023-01-24-Moxxys-New-Website.html" ]
|
||||
|
||||
[extra]
|
||||
author = "PapaTutuWawa"
|
||||
+++
|
||||
|
||||
Hello everyone! Welcome on Moxxy's new website. It currently does not contain
|
||||
much but that may change in the future.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
The page is built using [Jekyll](https://jekyllrb.com/) and [TailwindCSS](https://tailwindcss.com/). You can find the page's
|
||||
source [here](https://codeberg.org/moxxy/website).
|
||||
@@ -1,13 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: Moxxy's First GSoC Project!
|
||||
author: Ikjot Singh Dhody
|
||||
---
|
||||
+++
|
||||
title = "Moxxy's First GSoC Project!"
|
||||
date = "2023-05-06"
|
||||
template = "post.html"
|
||||
|
||||
aliases = [ "posts/2023-05-06-Groupchat-GSoC-Project.html" ]
|
||||
|
||||
[extra]
|
||||
author = "Ikjot Singh Dhody"
|
||||
+++
|
||||
|
||||
Hello readers!
|
||||
|
||||
As we know, Moxxy is an experimental IM for XMPP built using Flutter. While it does have a great set of features as described [here](https://moxxy.org/), it currently lacks support for group chats (or Multi-User-Chats). A great piece of news is that Google has accepted my proposal to add support for multi user chats in Moxxy.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
To implement multi user chats in Moxxy, the [XEP-0045](https://xmpp.org/extensions/xep-0045.html) standard will be followed and implemented. The project will run in two phases, since the major changes required will be in the [moxxmpp](https://codeberg.org/moxxy/moxxmpp) and [Moxxy](https://codeberg.org/moxxy/moxxy) codebases. First, XEP-0045 support will be added to moxxmpp with all the handlers, events and routines required to cleanly integrate the same with Moxxy. The second phase will be the UI changes in the Moxxy Flutter application, that builds upon the existing, reusable infrastructure.
|
||||
|
||||
The usecases planned to be implemented are listed below (subject to changes before the coding period begins):
|
||||
@@ -1,13 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: XEP-0045 implementation in Moxxmpp
|
||||
author: Ikjot Singh Dhody
|
||||
---
|
||||
+++
|
||||
title = "XEP-0045 implementation in Moxxmpp"
|
||||
date = "2023-06-17"
|
||||
template = "post.html"
|
||||
|
||||
aliases = [ "posts/2023-06-17-XEP-0045-In-Moxxmpp.html" ]
|
||||
|
||||
[extra]
|
||||
author = "Ikjot Singh Dhody"
|
||||
+++
|
||||
|
||||
Hello readers!
|
||||
|
||||
Welcome back to the GSoC series of blogs. This one is about my implementation of the MUC XEP (XEP-0045) in Moxxmpp.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## Introduction
|
||||
|
||||
Well, as you probably know, Moxxy is the frontend app that is being developed as a modern new XMPP client.
|
||||
@@ -1,13 +1,20 @@
|
||||
---
|
||||
layout: post
|
||||
title: Joining an MUC with Moxxy!
|
||||
author: Ikjot Singh Dhody
|
||||
---
|
||||
+++
|
||||
title = "Joining an MUC with Moxxy!"
|
||||
date = "2023-07-24"
|
||||
template = "post.html"
|
||||
|
||||
aliases = [ "posts/2023-07-24-Join-MUC-With-Moxxy.html" ]
|
||||
|
||||
[extra]
|
||||
author = "Ikjot Singh Dhody"
|
||||
+++
|
||||
|
||||
Greetings, readers!
|
||||
|
||||
Welcome back to our series of blogs on the Google Summer of Code (GSoC) project. In this blog post, I'll be sharing the progress made in implementing Multi-User Chat (MUC) support in Moxxy, the frontend counterpart to my GSoC project.
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## Introduction
|
||||
|
||||
As you may recall, Moxxy is a frontend application developed as an innovative XMPP client. To enhance its functionality, my GSoC project focuses on adding MUC support. Before diving into the Moxxy implementation, it was crucial to establish the necessary MUC support in Moxxmpp, which is highlighted in [this](https://moxxy.org/posts/2023-06-17-XEP-0045-In-Moxxmpp.html) blog.
|
||||
213
content/blog/2023-08-20-Moxxy-MUC-GSoC-Final-Report/index.md
Normal file
@@ -0,0 +1,213 @@
|
||||
+++
|
||||
title = "GSoC report - Moxxy MUC implementation"
|
||||
date = "2023-08-20"
|
||||
template = "post.html"
|
||||
|
||||
aliases = [ "posts/2023-08-20-Moxxy-MUC-GSoC-Final-Report.html" ]
|
||||
|
||||
[extra]
|
||||
author = "Ikjot Singh Dhody"
|
||||
+++
|
||||
|
||||
# GSoC Final Report: XMPP Standards Foundation - Moxxy: Implement Group Chats
|
||||
|
||||
**Project:** Moxxy - Implement Group Chats
|
||||
**Organization:** XMPP Standards Foundation
|
||||
**Duration:** March 2023 - August 2023
|
||||
**Student:** Ikjot Singh Dhody
|
||||
**Mentor:** Alexander
|
||||
|
||||
## Introduction
|
||||
|
||||
This report presents the culmination of my work on the GSoC project "Moxxy: Implement Group Chats" under the mentorship of Alexander at the XMPP Standards Foundation. Over the course of this project, I have been engaged in implementing a group chat feature for the Moxxy application, aiming to enhance its functionality and user experience.
|
||||
|
||||
## About Me
|
||||
|
||||
### Personal and Social/Contact Details
|
||||
|
||||
- **Name:** Ikjot Singh Dhody
|
||||
- **Jabber ID:** ikjot-2605[at]jabber.fr
|
||||
- **Email:** ikjotsd[at]gmail.com
|
||||
- **GitHub:** [ikjot-2605](https://github.com/ikjot-2605)
|
||||
- **LinkedIn:** [LinkedIn Profile](https://www.linkedin.com/in/ikjotsd/)
|
||||
|
||||
### Educational Background
|
||||
|
||||
- **University:** National Institute of Technology Karnataka, Surathkal
|
||||
- **Major:** Computer Science and Engineering
|
||||
- **Year:** Senior Year
|
||||
- **Degree:** Bachelor of Technology (B. Tech)
|
||||
|
||||
## The Project
|
||||
Before getting into the details of the actual project - here is a demo screencast for the implementation:
|
||||
|
||||

|
||||
|
||||
I have outlined the features I implemented through the GSoC period below.
|
||||
### PRs merged
|
||||
- moxxmpp
|
||||
1. [Add support for XEP-0421](https://codeberg.org/moxxy/moxxmpp/pulls/45)
|
||||
2. [Implement XEP-0045 support in moxxmpp](https://codeberg.org/moxxy/moxxmpp/pulls/46)
|
||||
- Moxxy
|
||||
1. [Add groupchat support for Moxxy](https://codeberg.org/moxxy/moxxy/pulls/300)
|
||||
- website (blog)
|
||||
1. [Add blog for GSoC MUC project introduction.](https://codeberg.org/moxxy/website/pulls/2)
|
||||
2. [Blog for XEP 0045 support in Moxxmpp](https://codeberg.org/moxxy/website/pulls/3)
|
||||
3. [ New blog - Join an MUC with Moxxy!](https://codeberg.org/moxxy/website/pulls/4)
|
||||
4. [Final GSoC Report Blog](https://codeberg.org/moxxy/website/pulls/5)
|
||||
### Feature Use-Cases
|
||||
|
||||
The group chat feature required changes to the Moxxy codebase, as well as the moxxmpp codebase. Moxxmpp is the data worker that sends and maintains all the request requirements of the Moxxy frontend. These are the list of contributions across both projects:
|
||||
|
||||
- Joining rooms and getting disco info for the room.
|
||||
- Sending messages to a group chat and receiving messages from the group chat.
|
||||
- Leaving the group chat.
|
||||
- Displaying a UI for joining a group chat and providing a nickname.
|
||||
- Handling group chat details and database support.
|
||||
- Handling group chat errors and basic error handling.
|
||||
- Adding a GroupchatDetails model.
|
||||
- Adding UI elements for group chat, such as title and nickname fields.
|
||||
- Adding documentation to group chat service methods.
|
||||
- Minor code refactoring and naming enhancements.
|
||||
- Enhancing enums for conversation types.
|
||||
- Removing unnecessary translation strings.
|
||||
- Improving UI and formatting.
|
||||
|
||||
Outlined below are commits made across both codebases throughout the GSoC period.
|
||||
|
||||
#### Moxxmpp
|
||||
|
||||
There were 2 PRs merged for this codebase.
|
||||
|
||||
- XEP-0421 support for occupant ID support.
|
||||
|
||||
| Serial Number | Commit Hash | Description |
|
||||
|---------------|----------------|--------------------------------------------------|
|
||||
| 1 | 255d0f88e0 | feat(xep): Use cascading operation to return state |
|
||||
| 2 | fa11a3a384 | feat(xep): Checked for the occupant-id directly. |
|
||||
| 3 | ac5bb9e461 | feat(xep): Implement XEP 0421 in Moxxmpp. |
|
||||
|
||||
|
||||
- XEP-0045 support for MUC support.
|
||||
|
||||
| Serial Number | Commit Hash | Description |
|
||||
|---------------|----------------|--------------------------------------------------|
|
||||
| 1 | b2724aba0c | Merge branch 'master' into xep_0045 |
|
||||
| 2 | d3742ea156 | feat(xep): Small fixes - MUC Example. |
|
||||
| 3 | 8b00e85167 | feat(xep): Add example for XEP 0045 Moxxmpp. |
|
||||
| 4 | 04dfc6d2ac | feat(xep): Replace DiscoError with StanzaError. |
|
||||
| 5 | 9e70e802ef | Merge branch 'master' into xep_0045 |
|
||||
| 6 | 3ebd9b86ec | feat(xep): Fix lint issues and use moxlib for result. |
|
||||
| 7 | a873edb9ec | feat(xep): Check for null nick before leaveRoom. |
|
||||
| 8 | e6bd6d05cd | feat(xep): Remove NOOP cache access. |
|
||||
| 9 | b7d53b8f47 | feat(xep): Add docstings for the XEP-0045 routines |
|
||||
| 10 | 217c3ac236 | feat(xep): Fix cache issue with join/leaveRoom. |
|
||||
| 11 | 51bca6c25d | feat(xep): XEP-0045 cache fixes. |
|
||||
| 12 | 8728166a4d | feat(xep): Add cache and roomstate to MUC implementation. |
|
||||
| 13 | 1f1321b269 | feat(xep): Small fixes - review cycle 1. |
|
||||
| 14 | 66195f66fa | Merge branch 'master' into xep_0045 |
|
||||
| 15 | 70fdfaf16d | feat(xep): Fix imports for xep_0045 files. |
|
||||
| 16 | cd73f89e63 | feat(xep): Remove duplicate manager string |
|
||||
| 17 | 05c41d3185 | feat(xep): Refactor sendMessage to allow groupchat |
|
||||
| 18 | 64a8de6caa | feat(xep): Set base for XEP 0045 implementation |
|
||||
| 19 | 68809469f6 | feat(xep): Add joinRoom, leaveRoom routines. |
|
||||
| 20 | 762cf1c77a | feat(xep): Set base for XEP 0045 implementation |
|
||||
|
||||
|
||||
#### Moxxy
|
||||
|
||||
- Implement MUCs in Moxxy
|
||||
|
||||
| Serial Number | Commit Hash | Description |
|
||||
|---------------|----------------|--------------------------------------------------|
|
||||
| 1 | 549e61a168 | feat(all): Fix linter issues. |
|
||||
| 2 | 26bcaccd81 | Merge branch 'master' into feat/groupchat |
|
||||
| 3 | df5810a347 | feat(all): Formatting change, lock file update |
|
||||
| 4 | ef931c566f | feat(all): Send messages/chat state from Moxxy to MUC. |
|
||||
| 5 | a3d4883406 | feat(all): Remove unnecessary buttons/options for MUC. |
|
||||
| 6 | 532f0b1bb2 | feat(all): Formatting fix, and navigation fix. |
|
||||
| 7 | a98fe0d9f3 | feat(all): Minor fixes - strings, formatting. |
|
||||
| 8 | a7c3bd507f | Merge branch 'master' of https://codeberg.org/moxxy/moxxy into feat/groupchat |
|
||||
| 9 | fba2cf86ae | feat(all): Minor formatting changes. |
|
||||
| 10 | af481bf465 | feat(all): remove unnecessary comparator override. |
|
||||
| 11 | e6ae8182c2 | feat(all): Organize import in main.dart. |
|
||||
| 12 | de7b9adfa6 | feat(all): Fix user flow for joining MUC. |
|
||||
| 13 | e4f98bb82f | feat(all): Add label to nick text field. |
|
||||
| 14 | 56d6f97168 | feat(all): Minor changes, fixes. |
|
||||
| 15 | b0067f055f | feat(all): Move away from exception type design. |
|
||||
| 16 | bd094dfc9a | feat(all): Remove unnecessary function. |
|
||||
| 17 | 7e9d7d6281 | feat(all): Check if Groupchat exists before method. |
|
||||
| 18 | 2cf781459d | feat(all): Debug mode and translatable string |
|
||||
| 19 | 4ff9e3c81e | feat(all): Remove title from GroupchatDetails. |
|
||||
| 20 | e337f1c579 | feat(all): Minor refactors - naming. |
|
||||
| 21 | 7c840334e1 | feat(all): Add docs to groupchat service methods. |
|
||||
| 22 | 06eab1d6f5 | feat(all): Make ConversationType an enhanced enum. |
|
||||
| 23 | 008e816d70 | feat(all): Rename JoinGroupchatResultEvent. |
|
||||
| 24 | 2bbbc164b5 | feat(all): Remove incorrect translations. |
|
||||
| 25 | 11f4fd9932 | feat(all): Add title to GroupchatDetails. |
|
||||
| 26 | a1451c6fbf | feat(all): Refactor groupchat to new object in db. |
|
||||
| 27 | 993da40297 | feat(all): Complete join groupchat flow. |
|
||||
| 28 | 09684b1268 | feat(all): Fix fromDatabaseJson for MUC details. |
|
||||
| 29 | 0abb89cf38 | feat(all): Fix database issues with nick. |
|
||||
| 30 | 7880f51b76 | feat(all): Add db support for GroupchatDetails. |
|
||||
| 31 | f0a79ca0e0 | feat(all): Add GroupchatDetails model. |
|
||||
| 32 | 06dcd5491b | feat(all): Basic groupchat error handling set up. |
|
||||
| 33 | 3641be4f56 | feat(all): Join room functionality complete. |
|
||||
| 34 | 18e28c3bbf | feat(all): Groupchat service/bloc updated. |
|
||||
| 35 | 62e39bf066 | feat(all): Set base for groupchat implementation. |
|
||||
|
||||
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- Was able to produce a working model of groupchats in Moxxy.
|
||||
|
||||
- Started the design approach from scratch and pretty much stuck to it till the end gave me confidence in my design capability.
|
||||
|
||||
- Fruitful discussions and review cycles were conducted that allowed for a smooth GSoC experience.
|
||||
|
||||
## Challenges Faced
|
||||
|
||||
- Needed to understand 2 different codebases, and the architecture of the project. This was a pretty interesting, albeit challenging task that took me a while to master.
|
||||
|
||||
- Managing the busy schedule with GSoC work, family, college among other things was difficult. Also, managing a job in the latter parts was also challenging but a rewarding experience.
|
||||
|
||||
- The complete virtual approach was slightly difficult, and although not practical - it might have been slightly better with inter-GSoC meetings.
|
||||
|
||||
|
||||
## Learnings/Takeaways
|
||||
|
||||
- Implemented group chat (Multi-User Chat or MUC) support in the Moxxy project.
|
||||
- Successfully added features for joining a group chat room, sending messages to the room, and receiving messages from the room.
|
||||
- Learned to handle various aspects of XMPP communication, including sending and receiving messages, and interacting with group chat services.
|
||||
- Gained insights into implementing complex functionality in a Flutter application, involving UI components, service classes, and database interactions.
|
||||
- Collaborated with experienced developers through code reviews to improve code quality and ensure adherence to best practices.
|
||||
- Acquired knowledge of working with the XMPP protocol, understanding its intricacies and how it relates to group chat interactions.
|
||||
- Learned to manage and address feedback from code reviewers, making necessary adjustments to improve code readability and functionality.
|
||||
- Discovered the importance of proper error handling in real-time communication scenarios, such as handling different types of group chat errors.
|
||||
- Gained experience in integrating new features while maintaining the overall architecture and user experience of the application.
|
||||
- Understood the complexities of XMPP server behavior, including handling discussion history and preventing message loops.
|
||||
- Explored techniques for optimizing communication performance, such as preventing redundant message processing.
|
||||
- Improved skills in project management, including version control practices, managing branches, and resolving merge conflicts.
|
||||
- Gained familiarity with the process of creating, testing, and merging pull requests in a collaborative development environment.
|
||||
- Developed a better understanding of Flutter's state management, navigation, and widget composition for creating feature-rich user interfaces.
|
||||
- Learned to balance feature development with code quality, addressing both functional and non-functional aspects of the implementation.
|
||||
- Explored advanced Flutter topics, such as handling asynchronous operations, managing state, and integrating with external libraries.
|
||||
- Gained a deeper understanding of how group chat and real-time communication play a significant role in modern applications.
|
||||
- Developed the ability to diagnose and troubleshoot issues related to communication and user interface interactions.
|
||||
- Strengthened communication skills by participating in technical discussions and effectively conveying ideas and solutions.
|
||||
|
||||
|
||||
## Future Work
|
||||
|
||||
The future remaining work has been enlisted in this issue by my mentor [here](https://codeberg.org/moxxy/moxxy/issues/315).
|
||||
|
||||
This includes a list of improvements, bug fixes and general future requirements that will be needed to make the groupchat experience pleasurable for the users of Moxxy.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Participating in GSoC has been an enriching experience. I've learned valuable skills, collaborated with mentors and the open-source community, and contributed to the Moxxy project. I'm grateful to XMPP Standards Foundation for this opportunity and look forward to continuing my journey in the world of open-source software development.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
I would like to express my gratitude to my mentor Alexander for their guidance and support throughout this project. His guidance and understanding is what allowed me to pull through and complete the GSoC with a happy mind. I also want to thank the XMPP Standards Foundation community for their encouragement and feedback.
|
||||
|
After Width: | Height: | Size: 1.2 MiB |
8
content/blog/_index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
+++
|
||||
title = "Blog Posts"
|
||||
template = "blog.html"
|
||||
|
||||
sort_by = "date"
|
||||
|
||||
aliases = [ "posts.html" ]
|
||||
+++
|
||||
6
content/developers.md
Normal file
@@ -0,0 +1,6 @@
|
||||
+++
|
||||
title = "Developer Information"
|
||||
template = "developers.html"
|
||||
|
||||
aliases = [ "developers.html" ]
|
||||
+++
|
||||
@@ -1,75 +0,0 @@
|
||||
---
|
||||
layout: default
|
||||
title: Developer Information
|
||||
---
|
||||
|
||||
<div class="w-full flex flex-row justify-center">
|
||||
<div class="w-full lg:w-1/2">
|
||||
|
||||
<div class="w-full p-8 flex flex-col">
|
||||
<div class="w-full pt-4">
|
||||
<p>
|
||||
Moxxy is fully open source. You can find the source code <a class="text-sky-400" href="{{ site.sourceUrl }}">on Codeberg</a>. Additionally, the code is
|
||||
mirrored <a class="text-sky-400" href="{{ site.githubMirrorUrl }}">on GitHub</a>.
|
||||
</p>
|
||||
|
||||
<p class="pt-1 pb-4">
|
||||
Feel free to join the <a class="text-sky-400" href="{{ site.generalMuc }}">general chat</a> or the <a class="text-sky-400" href="{{ site.developmentMuc }}">developer chat</a> with your favourite XMPP client.
|
||||
</p>
|
||||
</div>
|
||||
<h1 class="text-3xl font-bold">Libraries</h1>
|
||||
|
||||
<p class="pb-4">
|
||||
Moxxy is built from various smaller libraries that are custom-made for this purpose. Some of them are for general usage, some are specific to the use case of building Moxxy.
|
||||
</p>
|
||||
|
||||
<table class="table-fixed">
|
||||
<thead class="bg-gray-100">
|
||||
<tr>
|
||||
<th class="text-left px-1">Library</th>
|
||||
<th class="text-left px-1">Description</th>
|
||||
<th class="text-left px-1">Moxxy specific</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-blue-200">
|
||||
{% for library in site.developers.libraries %}
|
||||
<tr>
|
||||
<td class="pr-4">
|
||||
<a class="text-sky-400" href="{{ library.url}}">{{ library.name }}</a>
|
||||
</td>
|
||||
<td class="pr-4">{{ library.desc }}</td>
|
||||
<td class="pr-4">{% if library.specific %}Yes{% else %}No{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8 flex flex-col">
|
||||
<h1 class="text-3xl font-bold">Custom XEPs</h1>
|
||||
|
||||
<p class="pb-4">
|
||||
Moxxy currently implements some custom XMPP protocols to provide additional functionality. These are experimental and are intended to be upstreamed at some point.
|
||||
</p>
|
||||
|
||||
<table class="table-fixed">
|
||||
<thead class="bg-gray-100">
|
||||
<tr>
|
||||
<th class="text-left px-1">Name</th>
|
||||
<th class="text-left px-1">Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-blue-200">
|
||||
{% for xep in site.developers.customXeps %}
|
||||
<tr>
|
||||
<td class="pr-4">
|
||||
<a class="text-sky-400" href="{{ xep.url }}">{{ xep.name }}</a>
|
||||
</td>
|
||||
<td class="pr-4">{{ xep.desc }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
6
flake.lock
generated
@@ -17,11 +17,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1674236650,
|
||||
"narHash": "sha256-B4GKL1YdJnII6DQNNJ4wDW1ySJVx2suB1h/v4Ql8J0Q=",
|
||||
"lastModified": 1704842529,
|
||||
"narHash": "sha256-OTeQA+F8d/Evad33JMfuXC89VMetQbsU4qcaePchGr4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "cfb43ad7b941d9c3606fb35d91228da7ebddbfc5",
|
||||
"rev": "eabe8d3eface69f5bb16c18f8662a702f50c20d5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
13
flake.nix
@@ -10,9 +10,6 @@
|
||||
inherit system;
|
||||
};
|
||||
|
||||
jekyllPackages = with pkgs; [
|
||||
rubyPackages.jekyll-feed rubyPackages.jekyll-seo-tag
|
||||
];
|
||||
tailwindWithTypography = (pkgs.nodePackages.tailwindcss.overrideAttrs (old: {
|
||||
plugins = [
|
||||
pkgs.nodePackages."@tailwindcss/typography"
|
||||
@@ -23,15 +20,9 @@
|
||||
devShell = pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
tailwindWithTypography
|
||||
jekyll
|
||||
zola
|
||||
imagemagick
|
||||
] ++ jekyllPackages;
|
||||
};
|
||||
|
||||
packages = {
|
||||
website = pkgs.callPackage ./pkgs/website.nix {
|
||||
inherit tailwindWithTypography jekyllPackages;
|
||||
};
|
||||
];
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
57
index.html
@@ -1,57 +0,0 @@
|
||||
---
|
||||
layout: default
|
||||
title: A modern XMPP client
|
||||
---
|
||||
|
||||
<div class="w-full bg-moxxy-purple p-8 flex flex-row justify-center h-fit">
|
||||
<div class="lg:w-1/2 grid grid-cols-2 gap-4">
|
||||
<div class="grid grid-cols-1 place-items-center">
|
||||
<span class="text-neutral-100 text-2xl text-center">{{ site.index.heroText }}</span>
|
||||
</div>
|
||||
<div class="grid grid-rows-1 place-items-center">
|
||||
<img class="rounded-md h-64 lg:h-96" src="{{ site.index.mainScreenshotUrl }}" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div class="flex flex-wrap gap-4">
|
||||
<a href="{{ site.index.badges.izzy.url }}">
|
||||
<img class="h-24 md:h-16" src="/assets/img/badges/IzzyOnDroid.png" />
|
||||
</a>
|
||||
|
||||
<a href="{{ site.index.badges.codeberg.url }}">
|
||||
<img class="h-24 md:h-16" src="/assets/img/badges/codeberg.png" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold pb-4 place-self-start">Features</h1>
|
||||
|
||||
<ul class="list-disc px-4">
|
||||
{% for feature in site.index.features %}
|
||||
<li>{{ feature }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold pb-4 place-self-start">Screenshots</h1>
|
||||
|
||||
<div class="flex flex-nowrap gap-8 overflow-scroll">
|
||||
{% for screenshot in site.index.screenshots %}
|
||||
<img class="h-96 rounded-md" src="{{ screenshot }}" />
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,25 +0,0 @@
|
||||
{
|
||||
jekyll, jekyllPackages, tailwindWithTypography
|
||||
, stdenv
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation {
|
||||
pname = "moxxyv2-website";
|
||||
version = "20230725";
|
||||
src = ./../.;
|
||||
|
||||
buildInputs = [
|
||||
jekyll jekyllPackages tailwindWithTypography
|
||||
];
|
||||
|
||||
buildPhase = ''
|
||||
${jekyll}/bin/jekyll build --future
|
||||
cp -r ./assets _site/assets
|
||||
${tailwindWithTypography}/bin/tailwindcss --input ./input.css --output ./_site/assets/css/index.css
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/srv/www/
|
||||
mv _site/ $out/srv/www/website
|
||||
'';
|
||||
}
|
||||
34
posts.html
@@ -1,34 +0,0 @@
|
||||
---
|
||||
layout: default
|
||||
title: Blog Posts
|
||||
---
|
||||
|
||||
<div class="w-full flex flex-row justify-center mt-2">
|
||||
<div class="w-full lg:w-1/2 px-8 flex flex-col items-start">
|
||||
<div class="flex flex-row items-center gap-x-3">
|
||||
<h1 class="text-3xl">Blog posts</h1>
|
||||
|
||||
<a href="/feed.xml">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12.75 19.5v-.75a7.5 7.5 0 00-7.5-7.5H4.5m0-6.75h.75c7.87 0 14.25 6.38 14.25 14.25v.75M6 18.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="divide-y divide-blue-200">
|
||||
{% for post in site.posts %}
|
||||
<div class="mb-2">
|
||||
<a href="{{ post.url }}" class="text-2xl text-sky-400">{{ post.title }}</a>
|
||||
|
||||
<div class="flex flex-row pl-2">
|
||||
<span>By <span>{{ post.author }}</span></span>
|
||||
</div>
|
||||
|
||||
<p class="mt-2 pl-2 text-slate-600">
|
||||
{{ post.excerpt | markdownify | strip_html | truncatewords: 100 }}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
1
static/CNAME
Normal file
@@ -0,0 +1 @@
|
||||
moxxy.org
|
||||
1725
static/css/index.css
Normal file
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 528 KiB After Width: | Height: | Size: 528 KiB |
8
static/rio.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"CNAME": "moxxy.org",
|
||||
"headers": {
|
||||
"Content-Security-Policy": "default-src 'self'; script-src 'self'; script-src-elem 'self'; script-src-attr 'none'; style-src * 'self'; img-src 'self' data:; font-src 'self'; connect-src 'none'; media-src 'self'; object-src 'none'; prefetch-src 'none'; child-src 'none'; frame-src 'none'; worker-src 'none'; frame-ancestors 'none'; form-action 'none'; upgrade-insecure-requests; block-all-mixed-content; disown-opener; sandbox; base-uri https://moxxy.org; manifest-src 'none'",
|
||||
"X-Frame-Options": "DENY",
|
||||
"Referrer-Policy": "no-referrer, strict-origin-when-cross-origin"
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,13 @@
|
||||
module.exports = {
|
||||
content: [
|
||||
"./_layouts/*.html",
|
||||
"./_includes/*.html",
|
||||
"./index.html",
|
||||
"./developers.html",
|
||||
"./posts.html",
|
||||
"./templates/*.html"
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'moxxy-purple': '#cf4aff',
|
||||
},
|
||||
},
|
||||
extend: {
|
||||
colors: {
|
||||
'moxxy-purple': '#cf4aff',
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
require('@tailwindcss/typography'),
|
||||
|
||||
@@ -3,17 +3,25 @@
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<link href="/assets/css/index.css" rel="stylesheet" />
|
||||
<link rel="shortcut icon" href="/assets/img/favicon.ico" sizes="32x32" />
|
||||
<link href="/feed.xml" type="application/atom+xml" rel="alternate" title="Moxxy Blog" />
|
||||
<link href="{{ get_url(path="css/index.css") }}" rel="stylesheet" />
|
||||
<link rel="shortcut icon" href="{{ get_url(path="img/favicon.ico") }}" sizes="32x32" />
|
||||
<link href="{{ get_url(path="feed.xml", trailing_slash=false) }}" type="application/atom+xml" rel="alternate" title="Moxxy Blog" />
|
||||
|
||||
{% seo %}
|
||||
{% if page %}
|
||||
<meta property="og:description" content="{{ page.description }}" />
|
||||
<meta property="og:title" content="{{ page.title }}" />
|
||||
<title>{{ page.title }}</title>
|
||||
{% else %}
|
||||
<meta property="og:description" content="{{ config.description }}" />
|
||||
<meta property="og:title" content="{{ config.title }}" />
|
||||
<title>{{ config.title }}</title>
|
||||
{% endif %}
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex flex-col">
|
||||
{% include header.html %}
|
||||
{% include "header.html" %}
|
||||
|
||||
{{ content }}
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
|
||||
<footer class="h-8 w-full flex flex-row justify-center">
|
||||
34
templates/blog.html
Normal file
@@ -0,0 +1,34 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="w-full flex flex-row justify-center mt-2">
|
||||
<div class="w-full lg:w-1/2 px-8 flex flex-col items-start">
|
||||
<div class="flex flex-row items-center gap-x-3">
|
||||
<h1 class="text-3xl">Blog posts</h1>
|
||||
|
||||
<a href="{{ get_url(path="feed.xml", trailing_slash=false) }}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12.75 19.5v-.75a7.5 7.5 0 00-7.5-7.5H4.5m0-6.75h.75c7.87 0 14.25 6.38 14.25 14.25v.75M6 18.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="divide-y divide-blue-200">
|
||||
{% for post in section.pages %}
|
||||
<!-- Post item -->
|
||||
<div class="flex flex-col pt-4">
|
||||
<a href="{{ post.permalink | safe }}">
|
||||
<h1 class="text-indigo-400 prose prose-lg text-xl">{{ post.title }}</h1>
|
||||
</a>
|
||||
<span class="text-md mt-2">Posted by <i>{{ post.extra.author }}</i> on {{ post.date }}</span>
|
||||
|
||||
<!-- Blurp -->
|
||||
<span class="prose mt-4">
|
||||
{{ post.summary | safe }}
|
||||
</span>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
74
templates/developers.html
Normal file
@@ -0,0 +1,74 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="w-full flex flex-row justify-center">
|
||||
<div class="w-full lg:w-1/2">
|
||||
|
||||
<div class="w-full p-8 flex flex-col">
|
||||
<div class="w-full pt-4">
|
||||
<p>
|
||||
Moxxy is fully open source. You can find the source code <a class="text-sky-400" href="{{ config.extra.sourceUrl }}">on Codeberg</a>. Additionally, the code is
|
||||
mirrored <a class="text-sky-400" href="{{ config.extra.githubMirrorUrl }}">on GitHub</a>.
|
||||
</p>
|
||||
|
||||
<p class="pt-1 pb-4">
|
||||
Feel free to join the <a class="text-sky-400" href="{{ config.extra.generalMuc }}">general chat</a> or the <a class="text-sky-400" href="{{ config.extra.developmentMuc }}">developer chat</a> with your favourite XMPP client.
|
||||
</p>
|
||||
</div>
|
||||
<h1 class="text-3xl font-bold">Libraries</h1>
|
||||
|
||||
<p class="pb-4">
|
||||
Moxxy is built from various smaller libraries that are custom-made for this purpose. Some of them are for general usage, some are specific to the use case of building Moxxy.
|
||||
</p>
|
||||
|
||||
<table class="table-fixed">
|
||||
<thead class="bg-gray-100">
|
||||
<tr>
|
||||
<th class="text-left px-1">Library</th>
|
||||
<th class="text-left px-1">Description</th>
|
||||
<th class="text-left px-1">Moxxy specific</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-blue-200">
|
||||
{% for library in config.extra.libraries %}
|
||||
<tr>
|
||||
<td class="pr-4">
|
||||
<a class="text-sky-400" href="{{ library.url}}">{{ library.name }}</a>
|
||||
</td>
|
||||
<td class="pr-4">{{ library.desc }}</td>
|
||||
<td class="pr-4">{% if library.specific %}Yes{% else %}No{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8 flex flex-col">
|
||||
<h1 class="text-3xl font-bold">Custom XEPs</h1>
|
||||
|
||||
<p class="pb-4">
|
||||
Moxxy currently implements some custom XMPP protocols to provide additional functionality. These are experimental and are intended to be upstreamed at some point.
|
||||
</p>
|
||||
|
||||
<table class="table-fixed">
|
||||
<thead class="bg-gray-100">
|
||||
<tr>
|
||||
<th class="text-left px-1">Name</th>
|
||||
<th class="text-left px-1">Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-blue-200">
|
||||
{% for xep in config.extra.customXeps %}
|
||||
<tr>
|
||||
<td class="pr-4">
|
||||
<a class="text-sky-400" href="{{ xep.url }}">{{ xep.name }}</a>
|
||||
</td>
|
||||
<td class="pr-4">{{ xep.desc }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
40
templates/feed.xml
Normal file
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
|
||||
<channel>
|
||||
<title>{{ config.title }}
|
||||
{%- if term %} - {{ term.name }}
|
||||
{%- elif section.title %} - {{ section.title }}
|
||||
{%- endif -%}
|
||||
</title>
|
||||
<link>
|
||||
{%- if section -%}
|
||||
{{ section.permalink | escape_xml | safe }}
|
||||
{%- else -%}
|
||||
{{ config.base_url | escape_xml | safe }}
|
||||
{%- endif -%}
|
||||
</link>
|
||||
<description>{{ config.description }}</description>
|
||||
<generator>Zola</generator>
|
||||
<language>{{ lang }}</language>
|
||||
<atom:link href="{{ feed_url | safe }}" rel="self" type="application/rss+xml"/>
|
||||
<lastBuildDate>{{ last_updated | date(format="%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate>
|
||||
{%- for page in pages %}
|
||||
<item>
|
||||
<title>{{ page.title }}</title>
|
||||
<pubDate>{{ page.date | date(format="%a, %d %b %Y %H:%M:%S %z") }}</pubDate>
|
||||
<author>
|
||||
{%- if page.authors -%}
|
||||
{{ page.authors[0] }}
|
||||
{%- elif config.author -%}
|
||||
{{ config.author }}
|
||||
{%- else -%}
|
||||
Unknown
|
||||
{%- endif -%}
|
||||
</author>
|
||||
<link>{{ page.permalink | escape_xml | safe }}</link>
|
||||
<guid>{{ page.permalink | escape_xml | safe }}</guid>
|
||||
<description xml:base="{{ page.permalink | escape_xml | safe }}">{{ page.content }}</description>
|
||||
</item>
|
||||
{%- endfor %}
|
||||
</channel>
|
||||
</rss>
|
||||
19
templates/header.html
Normal file
@@ -0,0 +1,19 @@
|
||||
<div class="relative h-16 inset-x-0 inset-y-0 px-4 shadow-md grid place-items-center">
|
||||
<div class="flex flex-row items-center w-full">
|
||||
<!-- The Moxxy logo -->
|
||||
<a href="{{ get_url(path="@/_index.md") }}">
|
||||
<img src="{{ get_url(path="img/logo.png") }}" class="w-12 h-12 p-2" />
|
||||
</a>
|
||||
|
||||
<a href="{{ get_url(path="@/_index.md") }}">
|
||||
<span class="font-bold">Moxxy</span>
|
||||
</a>
|
||||
|
||||
<!-- Spacer -->
|
||||
<div class="grow"></div>
|
||||
|
||||
<a href="/blog/" class="px-2 text-sky-400">Blog</a>
|
||||
<a href="{{ get_url(path="@/developers.md") }}" class="px-2 text-sky-400">Developers</a>
|
||||
<a href="{{ config.extra.sourceUrl }}" class="px-2 text-sky-400">Source</a>
|
||||
</div>
|
||||
</div>
|
||||
54
templates/index.html
Normal file
@@ -0,0 +1,54 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="w-full bg-moxxy-purple p-8 flex flex-row justify-center h-fit">
|
||||
<div class="lg:w-1/2 grid grid-cols-2 gap-4">
|
||||
<div class="grid grid-cols-1 place-items-center">
|
||||
<span class="text-neutral-100 text-2xl text-center">{{ config.extra.heroText }}</span>
|
||||
</div>
|
||||
<div class="grid grid-rows-1 place-items-center">
|
||||
<img class="rounded-md h-64 lg:h-96" src="{{ get_url(path=config.extra.mainScreenshot) }}" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div class="flex flex-wrap gap-4">
|
||||
{% for badge in config.extra.badges %}
|
||||
<a href="{{ badge.url }}">
|
||||
<img class="h-24 md:h-16" src="{{ get_url(path=badge.image)}}" />
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold pb-4 place-self-start">Features</h1>
|
||||
|
||||
<ul class="list-disc px-4">
|
||||
{% for feature in config.extra.features %}
|
||||
<li>{{ feature }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full p-8">
|
||||
<div class="flex flex-col items-center">
|
||||
<div>
|
||||
<h1 class="text-3xl font-bold pb-4 place-self-start">Screenshots</h1>
|
||||
|
||||
<div class="flex flex-nowrap gap-8 overflow-scroll">
|
||||
{% for screenshot in config.extra.screenshots %}
|
||||
<img class="h-96 rounded-md" src="{{ get_url(path=screenshot) }}" />
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -1,15 +1,13 @@
|
||||
---
|
||||
layout: default
|
||||
---
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="w-full md:max-w-prose mt-2 mx-auto">
|
||||
<div class="px-8">
|
||||
<h1 class="text-3xl">{{ page.title }}</h1>
|
||||
|
||||
<span>Posted by <span class="italic">{{ page.author }}</span> on {{ page.date | date: "%d.%m.%Y" }}</span>
|
||||
|
||||
<span>Posted by <span class="italic">{{ page.extra.author }}</span> on {{ page.date }}</span>
|
||||
<article class="mt-5 prose lg:prose-lg">
|
||||
{{ page.content }}
|
||||
{{ page.content | safe }}
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||