Giter Club home page Giter Club logo

moolite's Introduction

MooLite

MooLite is a free, open source Milky Way Idle client.

MooLite

Usage

IMPORTANT: MooLite is implemented as a TamperMonkey user script. TamperMonkey is a browser extension that can read and modify webpages you are browsing. Make sure you only install MooLite if you trust both TamperMonkey and MooLite not to steal your information.

Development

The following instructions are only relevant if you want to help develop MooLite. If you're looking to install the browser extension, see Usage

MooLite uses Vite, Vue 3, and TypeScript to deliver extensions right in thr browser.

Installation

Install the dependencies to work on this project

npm install

Running the client locally

Install a local userscript to inject the custom WebSocket.

This step only needs to be done the first time.

npm run build-dev

Locate the build script in dist/moolite-dev.user.js, and drag it into the TamperMonkey Dashboard. Installing the script

npm run dev

This will run Vite. Once it's booted, click the Vite link in your terminal to open and install the userscript.

IMPORTANT: Make sure to disable the installed MooLite version while using the dev version.

You can now open the game in your browser, and see the MooLite sidebar.

If you don't see the sidebar the first time, try refreshing once. If you ever don't get the sidebar after that, please open an issue.

Histoire

Inspect the component library with Histoire, run

npm run story:dev

Linting

Enforces the correct styles across all files

npm run lint

Acknowledgements

This client is heavily inspired by RuneLite a great open source OldSchool RuneScape client. Most of the design decisions were made to mimic RuneLite, as it has a truly amazing plugin system.

The build process is based on lisonge/vite-plugin-monkey, a vite plugin to create Tampermonkey scripts.

And of course this client would not exist if the very fun game Milky Way Idle was never made. If you enjoy this game, make sure to show the developers some support if you can afford it!

Privacy

MooLite does not collect user information or analytics of any kind. The only external request it makes is to load Vue from an external CDN.

moolite's People

Contributors

ishadijcks avatar calebanthony avatar seashairo avatar lagunaelectric avatar amvoidguy avatar kevinlee3627 avatar

Stargazers

 avatar DevZoe avatar  avatar baguette avatar  avatar Jaan Jahilo avatar  avatar Aidan Czyryca avatar  avatar  avatar  avatar

Watchers

 avatar baguette avatar

moolite's Issues

Implement Chat History

Currently only incoming messages are appended to the chat, but we could add the history as well.

[Feature]: Configurable Icon Size

As a user I may want to change the size of the icons in the icon gutter. It would be nice if there was a config option I could change on the fly to accomplish this.

export enum IconSize {
  Regular = "",
  Large = "text-lg",
  ExtraLarge = "text-xl"
}

[NewPlugin] Enhancement simulator

Depends on #33

Add a plugin with a tab where users can input what item they want to enhance with which settings. Calculate the xp and items gained

Bonus points if you autoload their max resources, skills and such from the client.

Bonus bonus points, loop over some common settings to calculate the max xp gain

Add Histoire for UI design

We should add Histoire to the project to allow fast development and iteration of UI components. This will help us build a nice design system for MooLite.

Shortcuts to open a up the menu

What part of the game does your Plugin relate to?
All parts of the game

What should your feature do?
Open up one of the features on the sidebar

What kind of input and output does your feature need?
Ctrl+shift+i to open up the item finder for example, and simple shortcuts for the rest

Add Vitest framework

Vitest will help us build more robust plugins and ensure they continue to work as we iterate on the platform.

[Feature]: Configurable Plugin Width

As a developer I would like to control the width of my plugins UI.

Currently, we set MooLite to a fixed width when there is an active plugin tab. Instead, the width should be decided within each plugin. The current width could be set as the default, but a developer should be able to override the value. This could be in the form of a developer defined class string or a MooLite defined enum.

Add `Enhancement` feature to game

ClientInfo.enhancementLevelSuccessRateTable and ClientInfo.enhancementLevelTotalBonusMultiplierTable.

Implement helper methods to calculate chance of success, xp gain and resource cost per level

feat(MooLite): Milky Design System

Milky Design System

Hey hey! It's time to fall in line my fellow plugin developers! We'll be using Histoire to build a brand-new design system to use in the project. This will help ensure that our UI is aligned with Milky Way Idle.

Initially we'll cover the components and atoms we already have in the project. Then, we'll take inventory of the components used in all of the plugins and rebuild those as well.

  • Create one issue per component.
  • Create one issue per plugin update.

Planned Components:

I'll update this list with issue links as they're created.

MooLite bar does not appear when MWI is opened in a new tab.

Describe the bug
When opening MWI in a new tab, the MooLite bar does not appear if you wait too long to switch to that tab. MooLite is likely still running because the empty white space can still appear and Tampermonkey says that it is active. It seems that the script does not correctly run if the game has already been loaded.

To Reproduce
Steps to reproduce the behavior:

  1. Open "https://www.milkywayidle.com/game" in a new tab.
  2. Switch to tab after it loads.
  3. See error.

Expected behavior
Expect to see MooLite bar appear.

Screenshots
chrome 2
firefox 2

Browser
Chrome Version 113.0.5672.64 (Official Build) (64-bit)
Firefox 112.0.2 (64-bit)

Additional context
Other browser extensions do not seem to affect this bug. No other Tampermonkey scripts are installed or active.

Inbuilt Enhancing Calculator

What part of the game does your Plugin relate to?
Enhancing

What should your feature do?
Display the chances of getting a +(whatever enhancement level I input), the amount of mats it takes and the xp I get.

What kind of input and output does your feature need?
I will be able to enter what tea I will be using, the level of enhancement I want, and the duration. The plugin should fetch all the bonuses like the global xp buff, enhancer success rate, action speed, etc

Add standardized author system to credit plugin developers

Each plugin can have the following attribute credits

export interface Credits {
  // The original creator of the plugin, this can never change.
  author: string;

  // The current developer of the plugin, changes when the author is no longer interested.
  maintainer: string;

  // Anyone who ever did anything to aid this plugin, add your own name if fix something here.
  contributors: string[]
}

Empty white space when browser dimensions are in high ratios.

Describe the bug
An empty white space appears next to the plugin utility bar when the browser dimensions are either very wide or very tall (for example, split screening two browser windows). It appears regardless of whether one of the plugin menus is open. It is not always the same size as the menu.

To Reproduce
Steps to reproduce the behavior:

  1. Be on 'https://www.milkywayidle.com/game'
  2. Snap browser window to half-screen or other weird dimensions.
  3. See error

Expected behavior
I didn't expect to see the plugin creating empty space.

Screenshots
chrome
chrome 3
firefox 3
firefox

Browser
Chrome Version 113.0.5672.64 (Official Build) (64-bit)
Firefox 112.0.2 (64-bit)

Additional context
Other browser extensions do not seem to affect this bug. No other Tampermonkey scripts are installed or active.

feat(MDS): Dialog component

Component: Dialog

Feature Request:
The Dialog component is needed to present information or requests to users in a modal-type overlay. It serves as a crucial element for displaying important messages, confirming user actions, or collecting user input.

Reasons for the Component:

  • Modal Interaction: Dialogs provide a focused and attention-grabbing interface for displaying critical information or requesting user input without losing context from the underlying content.
  • User Feedback and Confirmation: Dialogs allow us to present users with confirmation messages, such as success notifications or error alerts, ensuring that they are aware of important actions and their outcomes.
  • User Input Collection: Dialogs facilitate the collection of user input through forms or specific prompts, enabling interaction with complex or multi-step actions.

Variations and Special Options:
The Dialog component should support the following variations and special options:

  • Customizable Content: Allow the Dialog to render custom content, including text, images, buttons, forms, or any other desired elements.
  • Size Options: Provide options for different dialog sizes to accommodate varying content and design requirements.
  • Overlay and Background: Include options to control the visibility and styling of the overlay and background behind the dialog.
  • Modal Behavior: Implement the ability to control the modal behavior, such as closing on outside click or pressing the Escape key.

[Bug]: Default width isn't properly applied to PluginManager

Describe the bug
The PluginManager element is thinner than expected because it has a class of w-full in its component, but we define the default width in App.vue.

To Reproduce
Steps to reproduce the behavior:

  1. Run the MooLite dev env on the develop branch.
  2. Observe that the plugin manager has both classes.
  3. Observe that the w-full class takes priority.

Expected behavior
I expect the plugin manager to conform to the default width.

Screenshots
image

Browser
Arc

Add community buffs

I am assuming there are events when community buffs start and end, I haven't been able to capture them yet.

Add time left counter

What part of the game does your Plugin relate to?
Related to non-combat actions.

What should your feature do?
When crafting/gathering show the total time left based on amount of actions left.

What kind of input and output does your feature need?
Possibly just a time left counter in the xp tracker or a seperate menu or somewhere around the progress bar on top.

Implement chat icons

Store all relevant data in the Chat class.

It likely won't ever be used, but hey it gets us closer to completing init_client_info

[NewPlugin] Community Buff Notifier

What part of the game does your Plugin relate to?
Most/All skills

What should your feature do?
A Notification when a community buff is added/expires

What kind of input and output does your feature need?
configuration around which buffs trigger the notification

Add UI reflection

Currently there are no mechanics to update the game DOM with new information. This would be incredibly useful and take MooLite to another level of QOL.

We could add custom buttons to inspect people with the LeaderboardPlugin, display time left for actions. Lookup items with ItemFinderPlugin, or run simulations with LootSimulator.

I'm not sure what the best way is to reflect the UI?
Each "feature" could store and expose its own ui section with a mapping to the HTML elements? But that can break easily with updates

[Bug]: MooLite stops reading messages from the server if MWI has to reconnect.

Describe the bug
MooLite stops reading messages from the server if MWI has to reconnect. This happens on my MacBook if I close the lid and reopen it. MWI does a little Attempting to reconnect... animation and comes back, but, for example, the XP Tracker plugin doesn't update when actions are taken.

To be clear, it's still functioning. It's still keeping track of xp/hr, but it just ramps down the value as it's not reading the messages from the server.

To Reproduce
I only know how to force MWI to attempt to reconnect by closing and opening my laptop. If you know a better way, please leave a comment. These steps are based on my circumstance.
Steps to reproduce the behavior:

  1. Be on a laptop.
  2. Open MWI with MooLite loaded.
  3. Queue up some actions.
  4. Open the XP Tracker plugin.
  5. Observe that it updates each time an action completes.
  6. Close the laptop lid and open it again.
  7. Observer that MWI attempts to reconnect.
  8. Observe that the XP Tracker plugin is no longer reacting to actions.

Expected behavior
I expect MooSocket to also reconnect in this circumstance.

Browser
Brave

feat(MDS): Accordion component

Component: Accordion

Feature Request:
The Accordion component is needed to create collapsible sections that allow users to expand or collapse content sections, optimizing space and providing a structured and interactive user interface.

Reasons for the Component:

  • Content Organization: Accordion components facilitate the organization of content into collapsible sections, allowing users to focus on relevant information while reducing clutter and improving readability.
  • User Control and Interactivity: Accordion sections enable users to expand or collapse specific content areas based on their preferences or the information they need, enhancing overall user control and interaction.
  • Space Optimization: By using Accordions, we can optimize space utilization, particularly when dealing with content-heavy interfaces or when there is a need to present information in a hierarchical manner.

Variations and Special Options:
The Accordion component should support the following variations and special options:

  • Single or Multiple Panels: Provide options to configure the Accordion to allow the expansion of only one panel at a time or multiple panels simultaneously.
  • Customizable Panels: Allow for customization of each panel's content, such as text, images, icons, or any other desired elements.
  • Transition Effects: Include options for animation or transition effects when expanding or collapsing the Accordion panels to enhance the user experience.
  • Default State: Support the ability to set a default state for the Accordion, either with all panels expanded, all collapsed, or a specific panel expanded by default.
  • Keyboard Accessibility: Ensure the Accordion component is fully accessible using keyboard navigation, allowing users to navigate and control the panels using standard keyboard interactions.

[Bug]: Unable to disable scrolling at the plugin level

Describe the bug
I made a mistake in the UI update. Scrolling of the plugin window should be up to the plugin, not MooLite. It can be handled in the plugin view, and scroll should be disabled for the plugin tab.

To Reproduce
Steps to reproduce the behavior:

  1. Create a new plugin with a view.
  2. Add enough elements to overflow in the y direction.
  3. Observe that you are powerless to prevent this.

Expected behavior
The plugin tab should be a relatively fixed height. The plugin itself can enable overflow in it's own view.

Screenshots
This is causing my whisper manager to overflow when there are many messages in the conversation, for example.
image

Browser
Brave

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you can benefit from your bug fixes and new features again.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can fix this πŸ’ͺ.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here are some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


Missing package.json file.

A package.json file at the root of your project is required to release on npm.

Please follow the npm guideline to create a valid package.json file.


Good luck with your project ✨

Your semantic-release bot πŸ“¦πŸš€

[NewPlugin] LootBox Tracker

What should your feature do?
When opening a lootbox, it should keep track of the items gained.

What kind of input and output does your feature need?
No input, but it would be nice if we could export the data to csv so people can crowdsource droprates

feat(MDS): Checkbox component

Component: Checkbox

Feature Request:
The Checkbox component is needed to provide users with the ability to select or deselect an option from a set of choices. It serves as an important form input element for capturing boolean values or multiple selections.

Reasons for the Component:

  • Enhance user experience: Checkboxes provide a clear and familiar interface for users to make selections, improving the overall usability of the application.
  • Accessibility: Checkbox components play a crucial role in creating accessible forms, ensuring that users of all abilities can interact with and understand the selection options.
  • Consistency: By introducing a standardized Checkbox component, we establish a consistent design pattern across the application, promoting a cohesive and intuitive user interface.

Variations and Special Options:
The Checkbox component should support the following variations and special options:

  • Different sizes: Provide options for small, medium, and large Checkbox sizes to accommodate various design requirements.
  • Disabled state: Support a disabled state for checkboxes that should not be interactable or selectable.
  • Indeterminate state: Allow the Checkbox to be in an indeterminate state, indicating that it represents a partial selection.

feat(MDS): Button component

Component: Button

Feature Request:
The Button component is needed to provide users with interactive elements that trigger actions or perform specific functions within the application. It serves as a primary element for user interaction and engagement.

Reasons for the Component:

  • User Actions and Interactions: Buttons enable users to perform actions, submit forms, navigate through the application, or trigger specific functionality, making them a fundamental element for user interaction.
  • Visual Feedback and Call-to-Action: Buttons provide visual feedback when interacted with, giving users a clear indication that an action has been triggered or is in progress. They also serve as call-to-action elements, guiding users towards important actions or next steps.
  • Consistent Design Language: Incorporating a standardized Button component ensures a consistent design language and user experience throughout the application, promoting usability and familiarity.

Variations and Special Options:
The Button component should support the following variations and special options:

  • Button Types: Include variations such as primary, secondary, outline, text, icon-only, or any other desired styles to accommodate different design needs and emphasize specific actions.
  • Sizes: Provide options for different button sizes, allowing flexibility in visual hierarchy and accommodating various content or design requirements.
  • Disabled State: Support a disabled state for buttons that should not be interactable, indicating that the associated action is currently unavailable or not applicable.
  • Loading State: Include an option to display a loading indicator within the button to provide feedback when an action is in progress or requires additional time.
  • Customization: Allow for customization of button styles, such as color, border, typography, and hover/focus effects, to align with the overall design system or specific branding requirements.

Add Community buffs

Whenever community buffs are updated we get the following message. Reflect this game state so later we can factor in the boost into xp calculations and create a notifier plugin

    "type": "community_buffs_updated",
    "communityBuffs": [
        {
            "id": 17,
            "hrid": "/community_buff_types/combat_drop_quantity",
            "experience": 157235.5,
            "level": 20,
            "startTime": "2023-05-03T02:19:40.82Z",
            "expireTime": "2023-12-07T11:30:40.82Z",
            "isDone": false
        },
        {
            "id": 15,
            "hrid": "/community_buff_types/enhancing_speed",
            "experience": 156034.5,
            "level": 20,
            "startTime": "2023-04-17T14:57:41.53Z",
            "expireTime": "2023-11-20T08:06:41.53Z",
            "isDone": false
        },
        {
            "id": 12,
            "hrid": "/community_buff_types/experience",
            "experience": 470240,
            "level": 20,
            "startTime": "2023-04-17T07:03:55.087Z",
            "expireTime": "2025-01-29T09:43:55.087Z",
            "isDone": false
        },
        {
            "id": 16,
            "hrid": "/community_buff_types/gathering_quantity",
            "experience": 111564.5,
            "level": 20,
            "startTime": "2023-04-17T14:57:43.869Z",
            "expireTime": "2023-09-19T13:46:43.869Z",
            "isDone": false
        },
        {
            "id": 14,
            "hrid": "/community_buff_types/production_efficiency",
            "experience": 319242.5,
            "level": 20,
            "startTime": "2023-04-17T14:57:39.409Z",
            "expireTime": "2024-07-04T00:22:39.409Z",
            "isDone": false
        }
    ],
    "communityActionTypeBuffsMap": {
        "/action_types/brewing": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/production_community_buff",
                "typeHrid": "/buff_types/efficiency",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.197,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/cheesesmithing": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/production_community_buff",
                "typeHrid": "/buff_types/efficiency",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.197,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/combat": [
            {
                "uniqueHrid": "/buff_uniques/combat_community_buff",
                "typeHrid": "/buff_types/combat_drop_quantity",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/cooking": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/production_community_buff",
                "typeHrid": "/buff_types/efficiency",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.197,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/crafting": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/production_community_buff",
                "typeHrid": "/buff_types/efficiency",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.197,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/enhancing": [
            {
                "uniqueHrid": "/buff_uniques/enhancing_community_buff",
                "typeHrid": "/buff_types/action_speed",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/foraging": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/gathering_community_buff",
                "typeHrid": "/buff_types/gathering",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/milking": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/gathering_community_buff",
                "typeHrid": "/buff_types/gathering",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/tailoring": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/production_community_buff",
                "typeHrid": "/buff_types/efficiency",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.197,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ],
        "/action_types/woodcutting": [
            {
                "uniqueHrid": "/buff_uniques/experience_community_buff",
                "typeHrid": "/buff_types/wisdom",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            },
            {
                "uniqueHrid": "/buff_uniques/gathering_community_buff",
                "typeHrid": "/buff_types/gathering",
                "ratioBoost": 0,
                "ratioBoostLevelBonus": 0,
                "flatBoost": 0.29500000000000004,
                "flatBoostLevelBonus": 0,
                "startTime": "0001-01-01T00:00:00Z",
                "duration": 0
            }
        ]
    }
}

feat(MDS): Input component

Component: Input

Feature Request:
The Input component is needed to allow users to enter text or select options from various input fields. It serves as a fundamental element for capturing user input in forms and interactive components.

Reasons for the Component:

  • User Input Collection: The Input component provides a means for users to enter textual information, make selections, or interact with form fields, enabling data submission and interaction within the application.
  • Input Validation: By incorporating the Input component, we can implement validation and error handling to ensure that users provide valid and expected input.
  • Consistency and Reusability: Having a standardized Input component allows us to establish consistent design patterns and behavior across the application, making it easier to maintain and enhance.

Variations and Special Options:
Regarding handling different types of input, there are two possible approaches:

  1. Single Component with Options: Create a single Input component that supports various input types and provide options to customize its behavior. This approach allows flexibility and reuse, as the same component can handle different input types (text, number, email, etc.). The options can include:

    • Input type: Specify the type of input (text, number, email, etc.) using a prop or attribute.
    • Validation: Provide options for input validation rules, such as required fields, character limits, and format restrictions.
    • Icon and Label: Include options to display icons or labels based on the input type to enhance usability.
  2. Multiple Component Approach: Create separate components for different input types. This approach offers specialized components tailored to each input type, providing more focused functionality and potentially better user experience. For example, having distinct components like TextInput, NumberInput, EmailInput, etc., each with specific features and validation rules.

Consider the specific needs of the project and the trade-offs between flexibility and specialization to determine the preferred approach.

Handle `items_updated` message

In src/MooLite/core/server/messages/, create a new ItemsUpdated class, and create the -Message and -Parser. See ActionsUpdated.ts for an example

In the application of the parser, update the inventory accordingly

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.