pieartsy df80eca0ec refactor: Removing then/catch from async/await calls (#22)
* refactored async/await for import helper to not also use then/catch

* added enum

* refactor webhookHelper and tests to not use then/catch

* changed docstring

* refactoring bot and tests to not use then/catch

* refactoring commands.js and tests to not use then/catch

* refactoring memberHelper.js and tests to not use then/catch

* removing then/catch from messageHelper.test.js

* fixed set up for commands tests

* edited bot to have top level main function

* one more test in commands.js, and removed console.error

* fixed typo in webhookHelper

* forgot to switch over some tests in bot.test and commands.test

* removed console.log from import helper

* put console.error in commands

* converted utils.js to not use then/catch

* tested utils checkImageFormatValidity

* removed jest-fetch-mock since it turns out I was just manually mocking it anyway

* refactored database to not use then/catch

* added dash to commands.js and test to pass

* added the remaining webhook tests

* changed utils to check for 10MB size not 1MB

* removed unnecessary try/catch from utils

* Simplify getWebhook to use .find() instead of foreach logic

* make memberCommand exit when error occurs with parseMemberCommand

* changed commands.js to not have user interaction within the catch

* updated console.error message in database.js

* made importHelper mock throw error instead of "resolve" error

* replaced "pk;" with "pf;" in test

* Got rid of unnecessary check for empty message from user (Fluxer doesn't allow this to happen)

Removed export of token

* getAllMembersInfo checks for fields.length

* added default case to memberCommandHandler to throw error if command is not recognized

* reversed check for valid proxy (was returning valid if the proxy existed and invalid if it didn't)

* pushes e.message instead of full error object to errors array in importHelper

* adjusted tests to properly use mockRejectedValue for async rejections

* changed getAllMembersInfo map to say `index` not `name` as it actually gets the index of a member and then the member object

* adjusted importHelper to properly test throwing of aggregate error

* revamped setting of expiration warning (moved to utils and changed logic, wrote tests)

---------

Co-authored-by: Aster Fialla <asterfialla@gmail.com>
2026-02-25 19:30:39 -05:00
2026-02-24 12:42:23 -05:00
2026-02-24 12:42:23 -05:00
2026-02-24 09:16:55 -05:00
2026-02-22 11:57:12 -05:00
2026-02-24 12:42:23 -05:00

PluralFlux

PluralFlux is a proxybot akin to PluralKit and Tupperbox, but for Fluxer. It is written with the Fluxer.js library.

Invite it to your server.

Join the support server

Sponsor the project

If it's not running at the moment, it's because my computer crashed or something. I'm looking to move running it to a somewhat more permanent solution.

Commands

All commands are prefixed by pf;. Currently only a few are implemented.

  • pf;help - Sends the current list of commands.

  • pf;import - Imports from PluralKit using the JSON file provided by their export command. Importing from other proxy bots is TBD. pf;import and attach your JSON file to the message. This will only save the fields that are present in the bot currently, not anything else like birthdays or system handles (yet?). Only one proxy can be set per member currently."

  • pf;member - Accesses the sub-commands related to editing proxy members. The available subcommands are:

    • new - Creates a new member to proxy with, for example: pf;member new jane. The member name should ideally be short so you can write other commands with it easily. The order of values is pf;member new [name] [displayname] [proxy] [propic], without brackets. The name is required, but the rest are optional. Usage notes:

      • If anything has spaces, put it in quotes: "Jane Doe"
      • If anything is unset, and you want to set something after it (for ex: you haven't set a display name, but you want to add a proxy), put the unset value in empty quotes in the same position: "" If you leave it out, the bot will set things wrong.
      • The maximum length of a display name is 32 characters.
      • You can't use the same proxy for two different members.
      • You can also upload an image directly instead of using a url. Examples:
      • Full example: pf;member new jane "Jane Doe" J:text https://cdn.pixabay.com/photo/2023/10/20/19/07/aster-8330078_1280.jpg
      • Example with gaps: `pf;member new bob "Bob he/him" "" https://cdn.pixabay.com/photo/2016/05/09/11/09/tennis-1381230_1280.jpg
    • remove - Removes a member based on their name, for example: pf;member remove jane.

    • name - Updates the name for a specific member based on their current name, for ex: pf;member john name jane. The member name should ideally be short so you can write other commands with it easily.

    • list - Lists all members in the system.

    • displayname - Updates the display name for a specific member based on their name, for example: pf;member jane "Jane Doe | ze/hir".This can be up to 32 characters long. If it has spaces, put it in double quotes.

    • propic - Updates the profile picture for the member. Must be in JPG, PNG, or WEBP format and less than 10MB. The two options are:

      1. Pass in a direct remote image URL, for example: pf;member jane propic <https://cdn.pixabay.com/photo/2020/05/02/02/54/animal-5119676_1280.jpg>. You can upload images on sites like https://imgbb.com/.
      2. Upload an attachment directly. NOTE: Fluxer does not save your attachments forever, so option #1 is recommended.
    • proxy Updates the proxy tag for a specific member based on their name. The proxy must be formatted with the tags surrounding the word 'text', for example: pf;member jane proxy Jane:text or pf;member amal proxy A{text} This is so the bot can detect what the proxy tags are. Only one proxy can be set per member currently.

Upcoming

Check for, and add, feature requests in the Issues tracker.

LLM note

I do not use LLMs or other GenAI to generate code, nor do I ever plan to. Very rarely, I ask questions of LLMs to troubleshoot bugs after search engines/StackOverflow/friends' knowledge has failed me, but that should lessen even more over time. As well, I used the Docker "Gordon" LLM to fix the many errors in my initial docker compose, but now that I have a devops person helping me, that should never happen again.

Description
No description provided
Readme 828 KiB
Languages
JavaScript 96.9%
TypeScript 2.9%
Dockerfile 0.2%