Giter VIP home page Giter VIP logo

ajour-catalog's Introduction

Ajour is no longer maintained. Please read #746.

Thank you all for the support, the feedback and for being an awesome community.

Ajour

Continuous integration Security audit Discord Server Ajour on Patreon

ajour banner

Table of Contents

Introduction

Ajour is a World of Warcraft addon manager written in Rust with a strong focus on performance and simplicity. The project is completely advertisement free, privacy respecting and open source. Ajour currently supports Windows, macOS and Linux.

Download Button

Screenshots

Ajour showing addons Ajour showing catalog

Features

  • Addons will be parsed automatically and resolved from multiple repositories:
  • Install new addons from the catalog or directly from a GitHub/GitLab URL
  • Support for release channels, so it's possible to select either alpha, beta or stable for each addon
  • View changelogs for each addon
  • Bulk addon update without any limitations
  • Remove addons and their dependencies
  • Ignore addons you don't want to update
  • Supports both Retail, Classic Era, Classic Tbc, Ptr and Beta versions of World of Warcraft
  • 10+ handcrafted themes to choose between
  • Ability to backup your whole UI, including all settings from WTF
  • Ability to run as a command line application for advanced users
  • WeakAuras and Plater import strings from Wago.io will automatically be parsed
  • Localized in multiple languages

Install

Prebuilt binaries for macOS and Windows can be downloaded from the GitHub releases page.

For everyone else, a detailed instruction can be found here.

Themes

Use the theme builder (source) website to quickly generate custom themes. Once you are done press copy and paste the value into Import Theme inside Settings in Ajour.

Custom themes will be saved in this location:

macOS / Linux:

  • $HOME/.config/ajour/themes

Windows:

  • %APPDATA%\ajour\themes

Keybindings

key action
a Go to MyAddons
w Go to Wago
c Go to Catalog
i Go to Install from URL
s Go to Settings
r Refresh
u Update

Command Line

Find instructions for using the command line interface here

Contribute

PRs Welcome

Ajour wouldn't be here without your help. I welcome contributions of any kind, because together we can make Ajour even better.

FAQ

macOS won't let me open the app, what should I do?

Instead of double clicking it, right click and choose "Open". That should successfully open Ajour.

What requirements does Ajour have?

Windows: DX12 or Vulkan Linux: Vulkan macOS: Metal

If you are having problems with these requirements, then try the OpenGL build.

Where does Ajour store its configuration?

Ajour will generate a folder in the following directory:

macOS / Linux:

  • $HOME/.config/ajour

Windows:

  • %APPDATA%\ajour

Inside this folder Ajour will keep a configuration file for storing different user settings, a log file with events from the last session, a fingerprint file with hashed fingerprints for each addon and a theme folder with custom themes.

Why Rust?

We wanted to create an application which natively compiles to both Windows, Linux and macOS while at the same time is as performant and reliable as possible.

Acknowledgement

License

Ajour is released under the GPL-3.0 License.

ajour-catalog's People

Contributors

casperstorm avatar leoguy77 avatar mlablah avatar petergam avatar petergp-wd avatar tarkah avatar

Watchers

 avatar  avatar

Forkers

leoguy77 tgondii

ajour-catalog's Issues

tukui - add two single addons.

So it seems like the two MAIN addons (Tuk and Elv) is actually not in API call. There are four version of them:

  1. Tukui Retail
  2. Tukui Classic
  3. Elvui Retail
  4. Elvui Classic

Both classic versions is in the call we use. So we are missing Tukui Retail and Elvui Retail. These are actually the two "main" addons where all the others are addons to these.

We can get them from these two sites:

Elvui Retail: https://www.tukui.org/api.php?ui=elvui
Tukui Retail: https://www.tukui.org/api.php?ui=tukui

I've added a jq for Tukui I think will work:

{id: .id, dateReleased: .lastupdate, websiteUrl: .web_url, name: .name, summary: "", numberOfDownloads: .downloads, categories: [.category], flavors: ["wow_retail"], gameVersions: [{game_version: .patch, flavor: "wow_retail"}], source: "tukui"}

We should add these to tukui.json if possible.

wowinterface source

We would like to have the last (big) source into the catalog. Wowinterface.
I think we have to make it a two step rocket, and call two different APIs. Heres the details:

Endpoint for all addons: https://api.mmoui.com/v4/game/WOW/filelist.json
Example data:

[
    {
        "id": 3989,
        "categoryId": 40,
        "version": "3.3.2 BETA 2",
        "lastUpdate": 1268587698000,
        "title": "Recipe Book",
        "author": "ayradyss",
        "fileInfoUri": "https://www.wowinterface.com/downloads/info3989-RecipeBook.html",
        "downloads": 119502,
        "downloadsMonthly": 34,
        "favorites": 744,
        "gameVersions": null,
        "checksum": "eb076e4ad97ba73300120e18ddcb7f53",
        "addons": null
    }
]

From this we can build the initial object:

{
	"id": 3989,
	"websiteUrl": "https://www.wowinterface.com/downloads/info3989-RecipeBook.html",
	"dateReleased": "1268587698000",
	"name": "Recipe Book",
	"summary": NULL,
	"numberOfDownloads": 119502,
	"categories":[40],
	"flavors": ["wow_retail"],  // if categoryId == 160 ? "wow_classic" : "wow_retail"
	"gameVersions": [{ "flavor": "wow_retail", "gameVersion": "0" }], // gameVersions was null. But we know flavor because of above.
	"source": "wowi"
}

The only missing field is summary which we can get from this call here.
https://api.mmoui.com/v4/game/WOW/filedetails/3989.json
Note: This can be called with multiple ids, separated by comma.
Note: The description you get from that call is kinda useless, so i think we should skip it initially.

[{
	"id": 3989,
	"categoryId": 40,
	"version": "3.3.2 BETA 2",
	"lastUpdate": 1268587698000,
	"checksum": "eb076e4ad97ba73300120e18ddcb7f53",
	"fileName": "RecipeBook_3.3.2-b2.zip",
	"downloadUri": "https:\/\/cdn.wowinterface.com\/downloads\/getfile.php?id=3989&d=1268587698&minion",
	"pendingUpdate": 0,
	"title": "Recipe Book",
	"author": "ayradyss",
	"description": "RecipeBook is a mod that allows you to browse tradeskill recipes with one alt and see whether your other alts know it.   \r\n\r\n\r\n[CENTER][B][COLOR=Red] ************ PLEASE NOTE ******************[\/COLOR][\/B]\r\n[B][COLOR=Red] \r\nI apologize to everyone who's been with me for the last three and a half years (wow!) but I'm putting the addon on Inactive status.   We are expecting our second baby Any Day Now and the lifestyle and financial changes that brings have forced me out - I don't have the time to maintain it and I'm barely logging into WoW as it is, so it doesn't make sense for me to try and spend what interest I can muster in the game into coding.\r\n\r\nIf someone wants to pick things up I will be happy to cede the addon over to someone else but I just can't do it.\r\n[\/COLOR][\/B]\r\n\r\n[B][COLOR=Red] Also: Your data WILL NOT carry over from old (prior to 3.0.2) versions.[\/COLOR][\/B]\r\n[B][COLOR=Red] ****************************************[\/COLOR][\/B] \r\n[\/CENTER]\r\n \r\n\r\n[I] For example:[\/I]\r\nI have character BetsyRoss, who is a tailor by nature.  She knows Pattern: American Flag, but for some reason, I can never remember this when UncleScrooge goes to the aucthouse to buy patterns.  \r\n    * Previously, I would have to keep a written or mental list of BetsyRoss's known patterns so that UncleScrooge didn't buy her a second copy of Pattern: American Flag on accident.  \r\n    * Now, with RecipeBook, UncleScrooge can mouse over Pattern: American Flag and see \"Already known by: BetsyRoss\" right there on the tooltip - or, if he chooses, in a special chat tab just for RecipeBook information.\r\n    \r\nIt's fun! It's helpful! It's easy to use!  It's also still in development, so there are a few known issues and some miscellaneous housework to be done.\r\n\r\nRecipeBook is most easlily managed using the minimap button and integrated menus.  However, there are some slash commands for those who prefer them:\r\n\r\nUsage: \/recipebook or \/rbk or \/rbook <options>\r\n    * General:\r\n    - [B]\/rbk help[\/B] : Displays a help message\r\n    - [B]\/rbk on|off [\/B]: Turns RecipeBook's data display on or off.  It will continue to update alts' tradeskills when the tradeskill frames are opened, so you have the best list possible.\r\n    - [B]\/rbk config[\/B] : Opens the graphical config window.\r\n    - [B]\/rbk skill:[\/B] Open the skill browse window, which allows you to browse known recipes by character and tradeskill.  \r\n    \r\n    * Sharing:     \r\n    - [B]\/rbk send <alt> to <player>[\/B] : Sends your RecipeBook data for a given alt to another player.  Use 'all' as your alt to send all alts you know.  Use 'me' to send just your character.\r\n\t- [B]\/rbk update from <player>[\/B] : Requests an update of RecipeBook data from another player. \r\n\r\n\t\r\n    * Banking: \r\n    -[B]\/rbk bank[\/B] : Displays your banked items and banking options\r\n    \r\n    * Finding Recipes:\r\n\t- [B]\/rbk search <item>[\/B] : Searches for items containing the given string.\r\n    - [B]\/rbk searchmats <item>[\/B] : Searches for items using materials which match the given string.\r\n   \r\n\t* Auction House Options (only available via  [B]\/rbk config[\/B]):\r\n\t- Color Recipes based on status: This will shade the icons for recipes you see in the Auction House based on whether other alts can learn them.\r\n\t- Default color scheme is as follows (in order of precedence): \r\n\t\t- Normal : Current alt can learn the recipe\r\n\t\t- Green : Another alt can currently learn the recipe\r\n\t\t- Orange : Current alt is the only character who will be able to learn the recipe (requires \/rbk self on)\r\n\t\t- Cyan : Some alt or alts will be able to learn the recipe (may include current character)\r\n\t\t- Red : No alt\/alts will be able to learn the recipe, based on current data\r\n\t\t- Dark Red : All available alts already know the recipe\r\n\t- Blackout Banked Recipes: This will shade the icons for recipes that you have banked black in the Auction House so that you can tell you already have a copy.\r\n\t\r\n\t* Debugging functions\r\n\t- [B]\/rbk debug[\/B] : Turns on debug mode\r\n\t- [B]\/rbk verbose[\/B] : Turns on verbose send mode.\r\n\r\nKnown issues:\r\n    * RecipeBook only updates its recipe list when your tradeskill window is open.  So, if BetsyRoss just learned Pattern: Giant American Flag, she'll have to open her Tailoring window before RecipeBook (or UncleScrooge) knows about it. \r\n\r\nHousekeeping: \r\n    * Hopes for next phase: Updating your recipe list when you learn items (in progress).  \r\n   \r\nCompatibilities:\r\n    The easiest way to add RecipeBook compatibility to *your* mod is to call the following in your tooltip output:\r\n        RecipeBook_DoHookedFunction(tooltip, link);\r\n        Where tooltip is the tooltip (or tooltip name) you're using and link is the item link itself.  That will add RecipeBook's data lines.\r\n\r\nSpecial thanks to:\r\n    Curse Gaming's Pentarion and Ghandi, for some hard work helping me debug the German client version.  Particularly to Pentarion for ongoing translation work.\r\n    \r\n\r\nPLEASE NOTE: If you learn a new recipe, you will have to open your appropriate tradeskill window to update RecipeBook's database. Hopefully this will change soon.",
	"changeLog": "3.3.2: \r\n\t\t- THIS VERSION WILL WIPE YOUR DATA.  RecipeBook will clear its database on first loading - this means that EVERYTHING will need to be reloaded: character skills, cached items, everything.  I'm having trouble with old (uncached) data again.\r\n\t\t- THIS VERSION WILL RESET MOST OPTIONS.  I made some changes for the color-coding customization.\r\n\t\tFIXED: \r\n\t\t- Guild Bank items should now tooltip correctly once again.\r\n\t\t- Several small changes in the code should now clarify whether the \"RecipeBook data not yet loaded\" error stems from a blank DB or a lag concern, and help eliminate it recurring.\r\n\t\t!NEW!\r\n\t\t+ Color customization added: Check the \"colors\" tab in the RecipeBook UI for an option to change the colors of items and text.\r\n\t\t+ If RecipeBook cannot quickly load all of your recipe\/reagent data, it will now give you a popup message to that effect.  Clicking \"Accept\" will attempt to force-load all of the tradeskill data.  \r\n\t\t\t- This replaces the \"Some items were not scanned for this tradeskill\" and \"Some reagents for this tradeskill's items were not yet in local cache\" messages that were previously in your chat frame.\r\n\t\t\t- This scan may lag the UI intermittently; do not do it when you are doing things that are control-intensive.\r\n\t\t\t- You have the option of clicking \"Cancel\" which will wait for the next time RecipeBook updates to check again.\r\n\t\t\t- Doing this scan in Dalaran or other high-lag areas may require a little time.  You will be updated periodically on the status of the deep scan.\r\n\tBETA 2:\r\n\t\t- THIS VERSION WILL RESET DEFAULT OPTIONS.  Whoops, I didn't check my set defaults closely enough.\r\n\t\t- TRANSLATIONS NEEDED: I have hacked a few lines and changed some others so that the non-English clients should stop erroring on popup.\r\n\t\t- Tidied up the help messages to stop suggesting \/rb when it doesn't work any longer :)\r\n\t\t- When someone new shares data with you it should now show up without requiring a reload of the UI.\r\n\t\t- Using the minimap icon to select a RecipeBook tab while the RecipeBook window is open now correctly loads that tab.",
	"downloads": 119502,
	"downloadsMonthly": 34,
	"favorites": 744,
	"images": [{
		"thumbUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/tiny\/pvw2746.jpg",
		"imageUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/pvw2746.jpg",
		"description": "Output to the tooltip!"
	}, {
		"thumbUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/tiny\/pvw560.jpg",
		"imageUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/pvw560.jpg",
		"description": "Alternative output to chatframe"
	}, {
		"thumbUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/tiny\/pvw2879.jpg",
		"imageUrl": "https:\/\/cdn-wow.mmoui.com\/preview\/pvw2879.jpg",
		"description": "Auction House Color Coding"
	}]
}]

Curse addons without gameversion cannot be found via Catalog

Certain addon releases do not present a "gameversion" in the api response. I do not know if this is a bug in curseforge, by design or an oversight on the part of the addon authors when uploading to curseforge.

Either way, it results in an addon that cannot be found via Ajour's Catalog tab. Looking in the curse.json there are records for the addons, but they are listed as having no flavors (and no gameVersions) and therefore it's not possible to perform a search in Ajour that would return it.

I think this is because curse.sh does a grouping per gameversion to get unique flavors and gameversions: https://github.com/casperstorm/ajour-catalog/blob/master/curse.sh#L32-L39

Examples include:
Angrier World Quests: https://addons-ecs.forgesvc.net/api/v2/addon/426990
Stay Collapsed: https://addons-ecs.forgesvc.net/api/v2/addon/430968

API response:
image
Notice gameVersion is [] but gameVersionFlavor has a value: wow_retail.

townlong-yak source

We should add townlong yak as a source to the catalog. The source is the following: https://hub.wowup.io/addons/author/foxlit.

Each addon from the json looks like:

{
  "id": 35,
  "repository": "https://www.townlong-yak.com/addons/venture-plan",
  "repository_name": "Venture Plan",
  "source": "TownlongYak",
  "description": "<p>Interface improvements for Adventure Campaign missions.</p>",
  "homepage": "https://www.townlong-yak.com",
  "image_url": "https://www.townlong-yak.com/addons/static/icon.png",
  "owner_image_url": "https://www.townlong-yak.com/addons/static/icon.png",
  "owner_name": "foxlit",
  "total_download_count": 0,
  "funding_links": [],
  "releases": [{
    "body": "<p>Adventurer selection UI changes and hotfixed ability data.</p>",
    "download_count": 0,
    "download_url": "https://www.townlong-yak.com/addons/ul/384693caa4df85b04535152df04e616b2da971d2a/install.zip",
    "external_id": "18e7e5f7a855399ee93c0671291fff2b",
    "game_version": "90002",
    "id": 1397,
    "name": "venture-plan-4.08",
    "prerelease": false,
    "published_at": "2021-02-01T00:05:40.187Z",
    "tag_name": "venture-plan-4.08",
    "url": "https://www.townlong-yak.com/addons/ul/d86ed82501fbb3c4b748c44f5a38aa9f5032d134f/install.zip",
    "game_type": "retail"
  }]
}

We should transform it to the following:

{
  "id":35,
  "websiteUrl":"https://www.townlong-yak.com/addons/venture-plan",
  "dateReleased":"2021-02-01T00:05:40.187Z",
  "name":"Venture Plan",
  "summary":"<p>Interface improvements for Adventure Campaign missions.</p>",
  "numberOfDownloads":0,
  "categories":[],
  "flavors":["wow_retail"],
  "gameVersions":[{"flavor":"wow_retail","gameVersion":"90002"}],
  "source":"townlong-yak"
}

@tarkah do we need the download_url here from the release actually?
@petergp would you be up for helping the initial mapping here?

Combine tukui's two responses to a single .json

In Ajour we have a concept of flavors. There are currently two flavors: classic and retail. A specific addon is created for one of the two flavors, but the bigger addons has a version to each flavor.

In the Catalog view of Ajour we will have two install buttons on each addon: [ classic ] [ retail ]. Then when we press either of the buttons we know which addon to request from the API.

So, in order to show those two buttons we need to know what flavor a addon has. For the curse I have done the mapping:

https://github.com/casperstorm/ajour-catalog/blob/6324ff49390ae36ba69fdae87206878e9159b9b0/curse.sh#L18

Each addon will now have:

    "flavors": [
      "wow_classic",
      "wow_retail"
    ]

So in the above case this specific addon exists in two version, one for each flavor. For the curse api it was simple because it was nested together with some other info, but for tukui api its a bit different. They have two endpoints, one for each flavor:

retail: https://www.tukui.org/api.php?addons=all
classic: https://www.tukui.org/api.php?classic-addons=all

retail_response[0]:

{
	"id": "3",
	"name": "AddOnSkins",
	"small_desc": "Skins for AddOns",
	"author": "Azilroka",
	"version": "4.44",
	"screenshot_url": "https://www.tukui.org/addons/Azilroka/1503198132/screenshot.png",
	"url": "https://www.tukui.org/addons.php?download=3",
	"category": "Skins",
	"downloads": "1370208",
	"lastupdate": "2020-07-13 01:36:31",
	"patch": "8.3",
	"web_url": "https://www.tukui.org/addons.php?id=3",
	"last_download": "2020-10-03 18:41:31",
	"changelog": "https://www.tukui.org/addons.php?id=3&changelog",
	"donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE"
}

classic_response[0].

{
	"id": "3",
	"name": "AddOnSkins",
	"small_desc": "Skins for Blizzard UI & AddOns",
	"author": "Azilroka",
	"version": "4.44",
	"screenshot_url": "https://www.tukui.org/addons/Azilroka/1565734166/screenshot.png",
	"url": "https://www.tukui.org/classic-addons.php?download=3",
	"category": "Skins",
	"downloads": "149659",
	"lastupdate": "2020-07-13 01:38:12",
	"patch": "1.13.5",
	"web_url": "https://www.tukui.org/classic-addons.php?id=3",
	"last_download": "2020-10-03 18:25:03",
	"donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE"
}

So in above example we found a addon which is avaiable for both flavors, so in that case we should map that to:

{
	"id": 3,
	"name": "AddOnSkins",
	"summary": "Skins for AddOns",
	"numberOfDownloads": 1370201,
	"categories": ["Skins"],
	"source": "tukui",
        "flavors": ["wow_retail", "wow_classic"],
}

Map gameVersion to our copy.

I would like to show gameVersion in the Catalog in Ajour. The gameVersion indicate which version of Wow the addon supports. So it's a little more fine grained than flavor which just says "this addon is made for retail" - gameVersion is then saying which PATCH for a given flavor it supports.

This is how it looks in My Addons:

Screenshot 2020-10-20 at 21 55 13

How do you get it?
So for Tukui it's easy. In their dataset its called patch.

{
	"id": "3",
	"name": "AddOnSkins",
	"small_desc": "Skins for AddOns",
	"author": "Azilroka",
	"version": "4.46",
	"screenshot_url": "https://www.tukui.org/addons/Azilroka/1503198132/screenshot.png",
	"url": "https://www.tukui.org/addons.php?download=3",
	"category": "Skins",
	"downloads": "1446305",
	"lastupdate": "2020-10-19 02:30:26",
	"patch": "9.0.1",
	"web_url": "https://www.tukui.org/addons.php?id=3",
	"last_download": "2020-10-20 19:50:03",
	"changelog": "https://www.tukui.org/addons.php?id=3&changelog",
	"donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE"
}

For Curse its a little more advanced. Heres a single addon: https://paste.rs/FfS.json
This is also the array we use to get flavors from:

https://github.com/casperstorm/ajour-catalog/blob/09643f0696890e3ac2a5864717a000c6dde1cf70/curse.sh#L32

Here's the logic:
We want to select the gameVersion from the object with fileType = 1 (means stable) and the highest projectFileId.
So from the above posted it would be:

{
    "gameVersion": "9.0.1",
    "projectFileId": 3079473,
    "fileType": 1,
    "gameVersionFlavor": "wow_retail"
},
{
    "gameVersion": "1.13.5",
    "projectFileId": 3077317,
    "fileType": 1,
    "gameVersionFlavor": "wow_classic"
}

How do we want it in our json file? Well good question because we (I..) should properly have foreseen this future where we want a "flavor" object with information rather than just an array with the flavors. I don't really wanna break compatibility and on the other hand, I don't really wanna make a v2 of the file. Any good ideas? I think my suggestion would be to create a object with { flavor, gameVersion } and keep what we have and then eventually deprecate and remove the old flavor array... but im open for suggestions.

feat: burning crusade

We should add TBC support, which is a new flavor.
Flavor should be called: wow_burning_crusade (we have wow_retail, and wow_classic now)

  1. Tukui
    1. There's a new API endpoint: https://www.tukui.org/api.php?classic-tbc-addons=all
  2. Wowinterface
    1. New catagori should be added ({id: 161, name: "The Burning Crusade"})
  3. Curse
    1. We should allow wow_burning_crusade flavored addons.
  4. Bump catalog.

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.