Log in

View Full Version : EQ Alert - Log Parser


Indefinite
05-21-2022, 08:16 PM
EQ Alert - A Configurable and Context Driven Project 1999 Log Parser with NCurses Interface (for Linux)

I've been periodically chipping away at a parser over the last 5 years with the goal of putting something together that can eventually understand every type of line in this games log file, and sometimes doing something about that.

https://i.imgur.com/TtUwq12.png

Features as of 3.1.3 (https://github.com/mgeitz/eqalert/releases):
- All python
- TUI
- google TTS
- config.json to customize alerts
- character state
- encounter parsing
- /say commands
- default zone timers
- metronome

Installation:

$ pip3 install eqalert

or

$ git clone git@github.com:mgeitz/eqalert.git
$ cd eqalert
$ python3 setup.py install --user

More Information:

Source code & Readme: https://github.com/mgeitz/eqalert

Road Map: https://github.com/mgeitz/eqalert/projects

Contributing:

If you're interested in contributing in any way to this project, please do! As of version 3.1.3 there are ~598 elif statements!

Issues & Requests: https://github.com/mgeitz/eqalert/issues

Contributing: https://github.com/mgeitz/eqalert/blob/master/CONTRIBUTING.md

loramin
05-21-2022, 09:01 PM
https://i.imgur.com/dX8DJRG.gif

Graahle
05-22-2022, 12:29 PM
This looks immense!

Jibartik
05-22-2022, 12:42 PM
Lets hook it up to a learning computer!

https://i.imgur.com/oq3ZHba.png

Indefinite
06-21-2022, 05:32 PM
Just about all spell text should be matched by the parser now as of version 3.2.5!

Loiterius
06-21-2022, 06:19 PM
Impressive!

sharkukri
09-22-2022, 11:45 PM
Looks promising! Will try it out

Indefinite
09-25-2022, 04:02 PM
Version 3.3.5 (https://github.com/mgeitz/eqalert/releases/tag/3.3.5) added features:

Auto-set character
Consider Evaluation
Default config alerts when a spell drops or refreshes from your spell bar
Timer persistance between restarts


If you have any thoughts, feature requests, or issues please let me know - I'll get anything not yet on the road map added!

sharkukri
10-03-2022, 05:36 AM
Version 3.3.5 (https://github.com/mgeitz/eqalert/releases/tag/3.3.5) added features:

Auto-set character
Consider Evaluation
Default config alerts when a spell drops or refreshes from your spell bar
Timer persistance between restarts


If you have any thoughts, feature requests, or issues please let me know - I'll get anything not yet on the road map added!

Is there a specific version of Python this only works under? Attempting to run things on Gentoo with kernel 5.19.11 and Python version 3.10.7 throws the following errors


write config line alert: Error on line13130: not enough arguments for format string
config read: Error on line 70: Expecting value: line 1 column 1 (char 0)
Unfortunately, the startup step failed with: 73: 'NoneType' object has no attribute 'settings'# Sometimes this is solved by forcing config regeneration


Installing via pip3 directly and from cloning the git repo and manually installing both threw the errors above. I attempted to copy and past a config into the file but every time I attempt to run it the file is overwritten and made empty.

Edit: missed a "s"

Indefinite
10-03-2022, 03:21 PM
I'm using python version 3.7.3 when running locally. Looking at the error it seems like the following might not be working as expected:

```
import pkg_resources
version = str(pkg_resources.get_distribution("eqalert").version)
print(version)
```

I'll get an issue added to the repo to track this down; there's probably a better way to report the package version than the first thing I found through google and the python requires in setup.py should be narrowed to a tested range rather than >3.

Just in case it's helpful, here is a gist to each generated config file. Everything should be set to directly copy down sans the settings.json file, you'll want to spot check the paths set in there. If it is an issue with pkg_resources, I'd expect starting things up with the configs will get it far enough to initialize logging and might provide better debug output in ~/.eqa/log/eqalert.log

EQ Alert 3.3.5 Config Files (Settings has placeholder values):
~/.eqa/config/settings.json (https://gist.github.com/mgeitz/1bb8a8c68205212d1302d610957e1322)
~/.eqa/config/zones.json (https://gist.github.com/mgeitz/7571b5bbba2037837a7aaaa00021f892)
~/.eqa/config/line-alerts/chat-received.json (https://gist.github.com/mgeitz/62f3b3811cfb83699d41fe8f2061b156)
~/.eqa/config/line-alerts/chat-received-npc.json (https://gist.github.com/mgeitz/9dfa1d14ca9c844d9f8d824c1737d2cf)
~/.eqa/config/line-alerts/chat-sent.json (https://gist.github.com/mgeitz/a51bcb0b4bb6f8c3297f0b45f2a2c04c)
~/.eqa/config/line-alerts/combat.json (https://gist.github.com/mgeitz/571d8031880266324347b5a94d012a71)
~/.eqa/config/line-alerts/command-output.json (https://gist.github.com/mgeitz/63c3ce8d82bee791dfbaac6f2bb76b6b)
~/.eqa/config/line-alerts/emotes.json (https://gist.github.com/mgeitz/3c684f626d716130e5dc89a3c8d174b3)
~/.eqa/config/line-alerts/group-system-messages.json (https://gist.github.com/mgeitz/e8f42d5511d025475396a8974e48e338)
~/.eqa/config/line-alerts/loot-trade.json (https://gist.github.com/mgeitz/abc6441dcca17c92ac01aa8fe20e884c)
~/.eqa/config/line-alerts/other.json (https://gist.github.com/mgeitz/a2e5605845ee6b1558dd6d14263fded1)
~/.eqa/config/line-alerts/pets.json (https://gist.github.com/mgeitz/6726538c84df223de8367dc5b995429b)
~/.eqa/config/line-alerts/spell-general.json (https://gist.github.com/mgeitz/96647a54fa470ec85d5c61beb6462d61)
~/.eqa/config/line-alerts/spell-specific.json (https://gist.github.com/mgeitz/cca6e0586bfe024e2fdbaeb051b9f022)
~/.eqa/config/line-alerts/system-messages.json (https://gist.github.com/mgeitz/f2e36fc903fa354422144327a4fd24b6)
~/.eqa/config/line-alerts/who.json (https://gist.github.com/mgeitz/ca4b9d05bccddebc8f4f5bcd32e8422b)

I think that should be each of the config files which keep the version string in them for regeneration following new versions.

sharkukri
10-06-2022, 05:02 PM
I got it working, thanks! However one issue, after about ~5 minutes EQAlert stops parsing the logs and doesn't alert or do anything anymore. My logs are still being written to, so I'm not sure what the issue is.

sharkukri
10-06-2022, 05:06 PM
I looked into it a bit more, it appears EQAlert stops reading the log when tailing .eqa/log/debug/matched-lines.txt

sharkukri
10-06-2022, 05:14 PM
I tailed eqalert.log and killing a mob triggered the following


INFO:root:[2022-10-06_16:12:30]: action_q depth: 1
INFO:root:[2022-10-06_16:12:30]: action_q depth: 1
INFO:root:[2022-10-06_16:12:30]: process action: Error on line 184: 'unavailable'


Here is the debug from EQAlert


mob_slain_you │ You have slain a geonid! │
│ faction_line │ Your faction standing with GeonidCollective got worse. │
│ experience_solo │ You gain experience!!

sharkukri
10-06-2022, 05:28 PM
Okay I've isolated it to when killing a mob EQAlert breaks and stops tailing logs, so the previous message is the reason why it breaks

sharkukri
10-06-2022, 06:08 PM
I managed to get EQAlert working finally. Installing python3.8 and changing the environment using venv and running eqalert through it works and no longer crashes when killing a mob. Maybe the readme should list compatible versions of python? It would be nice if 3.10 works as 3.11 is right around the corner.

Thanks!

Indefinite
10-07-2022, 08:52 PM
I managed to get EQAlert working finally. Installing python3.8 and changing the environment using venv and running eqalert through it works and no longer crashes when killing a mob. Maybe the readme should list compatible versions of python? It would be nice if 3.10 works as 3.11 is right around the corner.

Thanks!

Tracking both of these issues under #175 (https://github.com/mgeitz/eqalert/issues/175) and #176 (https://github.com/mgeitz/eqalert/issues/176)

arksz
11-08-2022, 03:32 PM
Okay I've isolated it to when killing a mob EQAlert breaks and stops tailing logs, so the previous message is the reason why it breaks
Thanks!

I am also running into the same issue where it stops reading the logs after killing a mob. Any Ideas on how to fix?

arksz
11-08-2022, 03:35 PM
tail -n 20 matched-lines.txt
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spell_fungal_regrowth_you_on : You are covered by a sticky substance.
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spell_fungal_regrowth_you_on : You are covered by a sticky substance.
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spell_fungal_regrowth_you_on : You are covered by a sticky substance.
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spell_fungal_regrowth_you_on : You are covered by a sticky substance.
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spell_fungal_regrowth_you_on : You are covered by a sticky substance.
spells_cast_you : You begin casting Cannibalize IV.
undetermined : Your body aches as your mind clears. You have taken 148 points of damage.
spells_worn_off : Your Envenomed Bolt spell has worn off.
mob_slain_you : You have slain a Ratfink!
experience_solo : You gain experience!!
INFO:root:[2022-11-08_14:25:43]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Paralyzing Earth.
INFO:root:[2022-11-08_14:25:45]: action_q depth: 3
INFO:root:[2022-11-08_14:25:45]: action_q depth: 2
INFO:root:[2022-11-08_14:25:45]: action_q depth: 1
INFO:root:[2022-11-08_14:25:47]: action_q depth: 1
INFO:root:[2022-11-08_14:25:47]: system_q depth: 1
INFO:root:[2022-11-08_14:25:49]: encounter spell [spells_fizzle_you] not added to encounter stack: Your spell fizzles!
INFO:root:[2022-11-08_14:25:51]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:25:52]: action_q depth: 3
INFO:root:[2022-11-08_14:25:52]: action_q depth: 2
INFO:root:[2022-11-08_14:25:52]: action_q depth: 1
INFO:root:[2022-11-08_14:25:55]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:00]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:03]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:07]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:11]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:14]: encounter spell [spells_cast_you] not added to encounter stack: You begin casting Cannibalize IV.
INFO:root:[2022-11-08_14:26:29]: encounter spell [spells_worn_off] not added to encounter stack: Your Envenomed Bolt spell has worn off.
INFO:root:[2022-11-08_14:26:41]: action_q depth: 1
INFO:root:[2022-11-08_14:26:41]: process action: Error on line 184: 'unavailable'


Here is a tail of my logs up to the kill when it stopped working

Indefinite
02-05-2023, 05:18 PM
I am also running into the same issue where it stops reading the logs after killing a mob. Any Ideas on how to fix?

This may be caused by either a python version greater than 3.7.3 running EQ Alert or an issue with encounter parsing, which has a pretty messy implementation right now. Otherwise, disabling the encounter parse should resolve the issue.

This should hopefully be resolved in the next version (https://github.com/mgeitz/eqalert/pull/173) by splitting up the analysis of the encounter stack and the reporting from it.

I've been developing on Debian stable so the python3 version I'm using is a bit older, planning to address that (https://github.com/mgeitz/eqalert/issues/175) once encounter parsing is cleaned up.

steve
02-12-2023, 05:07 PM
Is this abandoned? No updates on github recently.

Indefinite
02-13-2023, 08:54 AM
Is this abandoned? No updates on github recently.

This is a bit of a marathon project with bursty development, hoping to get motivated and back into fixes and new features again soon. Burned out a little writing all those regex matches for spell text in July.

https://i.imgur.com/Iv7vlke.png

Indefinite
02-17-2023, 08:06 PM
Version 3.4.1 is up with hopefully less broken encounter parsing, please let me know if you run into an error when using python 3.7.x!

Indefinite
03-26-2023, 06:47 PM
Version 3.4.5 (https://github.com/mgeitz/eqalert/releases/tag/3.4.5) update is out:
- More parser matching
- Bug fixes and tweaks
- Configurable default zone pop alert delay
- Docker support

Indefinite
03-26-2023, 07:37 PM
Special thanks to Bivouac598 for their contributions in this release - Thank you!

Indefinite
03-28-2023, 07:48 PM
Version 3.4.7 (https://github.com/mgeitz/eqalert/releases/tag/3.4.7) update is out:
- Parse more
- Bug fixes

~~Running in to an issue matching the necromancer lifetap spell line flavor text "Name beams a smile at Name" using the regex "^[a-zA-Z`\s]+ beams a smile at [a-zA-Z`\s]+$". Testing in isolation with just that line works just fine, but for some reason the parser still returns it as an undetermined line. Any thoughts or ideas are appreciated!~~ Oops nevermind, found the fix for that line type! Will be in next update.

Next up, focusing on finishing timers!

Tann
05-17-2023, 12:15 PM
got this installed as 90% of the time I'm playing p99 on my lil chromebook running Lubuntu, program loads up but anytime I do or press any of the hotkeys it says "terminal too small" and stops responding pretty much.

Indefinite
05-18-2023, 09:12 AM
got this installed as 90% of the time I'm playing p99 on my lil chromebook running Lubuntu, program loads up but anytime I do or press any of the hotkeys it says "terminal too small" and stops responding pretty much.

This is a pretty interesting bug!

`Terminal too small` should only render if the terminal window is smaller than 80x40 characters (see here (https://github.com/mgeitz/eqalert/blob/master/eqa/lib/curses.py#L224)). It sounds like, for some reason, your terminal emulator thinks it is that size following a key press event.

What terminal emulator are you using with Lubuntu? I haven't tried too many, but eqalert works as expected when using the `terminator` terminal emulator.

Does this issue persist if you run the parser in docker or does ~/.eqa/log/eqalert.log show any errors?

If this is a persistent compatibility issue between ncurses and a prominent terminal emulator, I will probably re-prioritize writing a GUI (which is 99% of the windows compatibility issue as windows really doesn't work well with ncurses either).

Tann
05-18-2023, 06:02 PM
I mainly just use the laptop to play p99 so not 100% sure on the details of Lubuntu, trying to look it up in the documentation but whatever the default terminal emu that shows up when you ctrl+alt+t.

the eqalert.log only shows a sound errors like:

INFO:root:[2023-05-17_08:59:22]: sound_play_sound: Error on line 133: Command '['/usr/bin/python3', '/home/user/.local/lib/python3.10/site-packages/playsound.py', '/tmp/eqa/sound/3f72bec93a111ae895a49b94e9420216.wav']' returned non-zero exit status 1.

Indefinite
05-18-2023, 07:36 PM
I mainly just use the laptop to play p99 so not 100% sure on the details of Lubuntu, trying to look it up in the documentation but whatever the default terminal emu that shows up when you ctrl+alt+t.

the eqalert.log only shows a sound errors like:

INFO:root:[2023-05-17_08:59:22]: sound_play_sound: Error on line 133: Command '['/usr/bin/python3', '/home/user/.local/lib/python3.10/site-packages/playsound.py', '/tmp/eqa/sound/3f72bec93a111ae895a49b94e9420216.wav']' returned non-zero exit status 1.


A non-zero exit code from playsound may be a missing dependency for it. I chose playsound optimistically for an eventual cross-platform solution but it can be a little wonky with its linux dependency requirements in it's lack of explicitly reporting them when missing. Since lubuntu is a light weight variant, it may be worth spot checking the dependencies in the Dockerfile (https://github.com/mgeitz/eqalert/blob/master/Dockerfile) and/or installing PyObjC (https://pyobjc.readthedocs.io/en/latest/install.html).

Indefinite
05-26-2023, 10:29 PM
Version 3.5.0 (https://github.com/mgeitz/eqalert/releases/tag/3.5.0) is out:

gTTS Updates
* Lingo expansion
* Set TLD in config
* Set Language in config

Player Data
* Collect player data from /who
* `/say who [player]` - speak player info
* Config value to persist
* Used for determining spell duration from other players

Spell Timers
* Reshape spell-timers.json to work, requires legacy check
* Many spell timer config settings
* Spell formulas
* Spell lines file, match vague spell lines to possible spells
* Spell casters file, match class/level requirements to spell
* Spell timers are determined by looking at the spell landing message and looking back cast time ago for each spell it could be associated to.
* When multiple spells are possible, the highest level spell the caster could use is selected.
* Caster data is pulled from `/who` output to determine spell duration when level is used.
* By default only spells you cast will alert about 24 seconds before the spell drops, adjusting for zoning drift if you are also the target.
* Timers for others will drift with zoning or logging out and not track updates to their buffs that occur outside of the log message radius.
* Optional toggles in settings can also be set to filter guild only spell targets/casters, or just track any spell that lands on anyone you have /who player data for by disabling all filters.
* Due to how casters are inferred through cast time, item click spell casts are not tracked yet. With guessing enabled, non-instant clicky items for spells that can't normally be cast (i.e. Black Flower of Functionality) should be tracked.
* Save timers by character / server when stopping the parser or switching characters
* When loading old timers adjust timers targeting yourself to having been logged out

Please let me know if you run in to any bugs or strange behavior by submitting an issue here (https://github.com/mgeitz/eqalert/issues) or in this thread!

Indefinite
05-30-2023, 12:14 PM
Version 3.5.1 (https://github.com/mgeitz/eqalert/releases/tag/3.5.1) is out with misc performance improvements and bug fixes

Indefinite
06-10-2023, 10:53 AM
Version 3.5.3 (https://github.com/mgeitz/eqalert/releases/tag/3.5.3) is out with more spell timer stuff. Please let me know if you run into any bugs!

Indefinite
06-11-2023, 03:23 PM
Fixed some bugs in 3.5.4 and added a config setting (default true) to combine like expiring spell timers by including the spell is dropping on others as well to the spoken spell timer alert. Expiring spell timers from group buffs were pretty intense before.

Indefinite
06-16-2023, 08:59 PM
Version 3.5.6 (https://github.com/mgeitz/eqalert/releases/tag/3.5.6) is out with some old bugs fixed and some new bugs created. Getting closer to considering spell timers done enough for now. Nearly at 50,000 lines of code and config - please let me know if you run in to any bugs, they are definitely out there!

As an aside, apologies for anyone that endured hearing `that was nice` every time they received a light healing spell using the previous default config - I thought that was a suitable notice for a non-torpor heal over time spell expiring but turns out it's a more common output line than I thought and should now be disabled by default.

Indefinite
06-21-2023, 08:17 PM
Version 3.6.0 (https://github.com/mgeitz/eqalert/releases/tag/3.6.0) is out with a handful of bug fixes:

- Fix consider evaluation lying to you at lower levels
- Fix `/say parser who [player]` output
- Fix metronome breaking curses timer list
- Update mob respawn timer to use encounter parse target
- Use player_list info to help inform encounter parse target
- Fix spell timers targeting the active player not saving correctly after saving more than once
- Fix `spell_line_feel_better_you_off` config values
- Add missing Solusek's Eye zone data
- Remove sound alerts for every single option selection change (except unmute)

Tann
08-18-2023, 05:54 PM
trying to install on my latest chromebook round, this time using Debian instead of Lubuntu, tried:

git clone git@github.com:mgeitz/eqalert.git

got:
Cloning into 'eqalert'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Indefinite
08-18-2023, 06:26 PM
trying to install on my latest chromebook round, this time using Debian instead of Lubuntu, tried:

git clone git@github.com:mgeitz/eqalert.git

got:
Cloning into 'eqalert'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.


I think that may require having ssh set up and your public key associated to your github account, I'll update future documentation to use the https clone to simplify the readme steps a bit.

Try using:
git clone https://github.com/mgeitz/eqalert.git

Tann
08-18-2023, 08:56 PM
Try using:
git clone https://github.com/mgeitz/eqalert.git

this worked, but when i tried to run python3 setup.py install --user I got a full page of error messages.

/usr/lib/python3/dist-packages/setuptools/dist.py:775: UserWarning: Usage of dash-separated 'author-email' will not be supported in future versions. Please use the underscore name 'author_email' instead
warnings.warn(
/usr/lib/python3/dist-packages/setuptools/dist.py:775: UserWarning: Usage of dash-separated 'home-page' will not be supported in future versions. Please use the underscore name 'home_page' instead
warnings.warn(
/usr/lib/python3/dist-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
/usr/lib/python3/dist-packages/setuptools/command/easy_install.py:146: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
zip_safe flag not set; analyzing archive contents...
/usr/lib/python3/dist-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 156, in save_modules
yield saved
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 198, in setup_context
yield
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 259, in run_setup
_execfile(setup_script, ns)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 46, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-kty8ndxx/playsound-1.3.0/setup.py", line 11, in <module>
version="3.6.0",
^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 108, in setup
return distutils.core.setup(**attrs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 185, in setup
return run_commands(dist)
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 201, in run_commands
dist.run_commands()
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 969, in run_commands
self.run_command(cmd)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 1213, in run_command
super().run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 988, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 165, in run
cmd = self.call_command('install_lib', warn_dir=0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 151, in call_command
self.run_command(cmdname)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 318, in run_command
self.distribution.run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 1213, in run_command
super().run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 987, in run_command
cmd_obj.ensure_finalized()
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 111, in ensure_finalized
self.finalize_options()
File "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", line 17, in finalize_options
self.set_undefined_options('install',('install_lay out','install_layout'))
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 296, in set_undefined_options
setattr(self, dst_option, getattr(src_cmd_obj, src_option))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 107, in __getattr__
raise AttributeError(attr)
AttributeError: install_layout. Did you mean: 'install_platlib'?

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/bear/eqalert/setup.py", line 9, in <module>
setup(
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 185, in setup
return run_commands(dist)
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 201, in run_commands
dist.run_commands()
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 969, in run_commands
self.run_command(cmd)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 1213, in run_command
super().run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 988, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/install.py", line 74, in run
self.do_egg_install()
File "/usr/lib/python3/dist-packages/setuptools/command/install.py", line 131, in do_egg_install
cmd.run(show_deprecation=False)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 444, in run
self.easy_install(spec, not self.no_deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 686, in easy_install
return self.install_item(None, spec, tmpdir, deps, True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 733, in install_item
self.process_distribution(spec, dist, deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 778, in process_distribution
distros = WorkingSet([]).resolve(
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 815, in resolve
dist = self._resolve_dist(
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 851, in _resolve_dist
dist = best[req.key] = env.best_match(
^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1123, in best_match
return self.obtain(req, installer)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1135, in obtain
return installer(requirement)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 705, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 731, in install_item
dists = self.install_eggs(spec, download, tmpdir)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 924, in install_eggs
return self.build_and_install(setup_script, setup_base)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1198, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1182, in run_setup
run_setup(setup_script, args)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 249, in run_setup
with setup_context(setup_dir):
File "/usr/lib/python3.11/contextlib.py", line 155, in __exit__
self.gen.throw(typ, value, traceback)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 190, in setup_context
with save_modules():
File "/usr/lib/python3.11/contextlib.py", line 155, in __exit__
self.gen.throw(typ, value, traceback)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 169, in save_modules
saved_exc.resume()
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 143, in resume
raise exc.with_traceback(self._tb)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 156, in save_modules
yield saved
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 198, in setup_context
yield
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 259, in run_setup
_execfile(setup_script, ns)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 46, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-kty8ndxx/playsound-1.3.0/setup.py", line 11, in <module>
version="3.6.0",
^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 108, in setup
return distutils.core.setup(**attrs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 185, in setup
return run_commands(dist)
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 201, in run_commands
dist.run_commands()
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 969, in run_commands
self.run_command(cmd)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 1213, in run_command
super().run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 988, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 165, in run
cmd = self.call_command('install_lib', warn_dir=0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 151, in call_command
self.run_command(cmdname)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 318, in run_command
self.distribution.run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 1213, in run_command
super().run_command(command)
File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 987, in run_command
cmd_obj.ensure_finalized()
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 111, in ensure_finalized
self.finalize_options()
File "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", line 17, in finalize_options
self.set_undefined_options('install',('install_lay out','install_layout'))
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 296, in set_undefined_options
setattr(self, dst_option, getattr(src_cmd_obj, src_option))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 107, in __getattr__
raise AttributeError(attr)
AttributeError: install_layout


ugh oh well =P

Indefinite
08-18-2023, 09:30 PM
It looks like setup.py installation may be deprecated:
setup.py install is deprecated. Use build and pip and other standards-based tools.

If you're using Debian 12 try using:
python3 -m venv .venv;. .venv/bin/activate; python3 -m pip install -e .

If all else fails you should be able to grab it from PyPi using
pipx install eqalert

Tann
08-18-2023, 10:02 PM
If you're using Debian 12 try using:
python3 -m venv .venv;. .venv/bin/activate; python3 -m pip install -e .


This worked, up to generating new spell-timers part at least.. Thank you

Indefinite
08-18-2023, 10:09 PM
If you install using a venv, you may need to activate it to start eqalert each time using
source .venv/bin/activate

Alternatively, if you plan to install docker you can build with compose
docker compose build
docker compose run eqalert

Indefinite
08-18-2023, 10:12 PM
This worked, up to generating new spell-timers part at least.. Thank you

For some reason the spell timer generation takes a little while, usually about a minute for me. Did you get any errors?

Tann
08-18-2023, 10:26 PM
For some reason the spell timer generation takes a little while, usually about a minute for me. Did you get any errors?

no errors but didn't see any spell timers running either, perhaps I'm used to gina and nparse, the dps tracking stuff works, zone info doesn't, maybe i need to zone first and not use /who

Indefinite
08-18-2023, 10:32 PM
no errors but didn't see any spell timers running either, perhaps I'm used to gina and nparse, the dps tracking stuff works, zone info doesn't, maybe i need to zone first and not use /who

With the default settings any detected spells from known players should create a timer so `/who` is still helpful there for other players spells, otherwise you can enable spell guessing and it get will guess most spells text it sees.

Pressing `t` will bring up the timers pop-up, otherwise timers are just an audio alert. Zone info is only pulled from zoning so the first time on a character it won't know

Tann
08-18-2023, 10:38 PM
With the default settings any detected spells from known players should create a timer so `/who` is still helpful there for other players spells, otherwise you can enable spell guessing and it get will guess most spells text it sees.

Pressing `t` will bring up the timers pop-up, otherwise timers are just an audio alert. Zone info is only pulled from zoning so the first time on a character it won't know

oh wow thats sweet, i need to read more of the documentation, who would've thought.. reading the instructions

Sarekrn
08-20-2023, 02:33 PM
Anytime a sound needs to be played Im getting an error:

File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 261, in <module> │
│ playsound(argv[1]) │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 162, in _playsoundNix │
│ import gi │
│ File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module> │
│ from . import _gi │
│ ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py) │
│ Exception in thread Thread-11: │
│ Traceback (most recent call last): │
│ File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner │
│ self.run() │
│ File "/usr/lib/python3.9/threading.py", line 892, in run │
│ self._target(*self._args, **self._kwargs) │
│ File "/home/ecor1/.local/lib/python3.9/site-packages/playsound.py", line 254, in <lambda> │
│ playsound = lambda sound, block = True: _playsoundAnotherPython('/usr/bin/python3', sound, block, macOS = False) │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 229, in _playsoundAnotherPython │
│ t.join() │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 218, in join │
│ say_you │ You say, 'parser timer 60' raise self.excmbered_off │ You are no longer encumbered. │
│ targ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 211, in run │
│ self.ret = self._target(*self._args, **self._kwargs) │
└───────────────────────────────────────────────── ────────────────────────────────────────────────── ───────────────────────────────────────────── ──── File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 226, in <lambda>
t = PropogatingThread(target = lambda: check_call([otherPython, playsoundPath, _handlePathOSX(sound) if macOS else sound]))
File "/usr/lib/python3.9/subprocess.py", line 373, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/ecor1/.local/lib/python3.9/site-packages/playsound.py', '/tmp/eqa/sound/b4d2431a1ceabf47a18fe36ed9606f6e.wav']' returned non-zero exit status 1.

Any ideas?

Indefinite
08-20-2023, 05:35 PM
Anytime a sound needs to be played Im getting an error:

File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 261, in <module> │
│ playsound(argv[1]) │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 162, in _playsoundNix │
│ import gi │
│ File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module> │
│ from . import _gi │
│ ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py) │
│ Exception in thread Thread-11: │
│ Traceback (most recent call last): │
│ File "/usr/lib/python3.9/threading.py", line 954, in _bootstrap_inner │
│ self.run() │
│ File "/usr/lib/python3.9/threading.py", line 892, in run │
│ self._target(*self._args, **self._kwargs) │
│ File "/home/ecor1/.local/lib/python3.9/site-packages/playsound.py", line 254, in <lambda> │
│ playsound = lambda sound, block = True: _playsoundAnotherPython('/usr/bin/python3', sound, block, macOS = False) │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 229, in _playsoundAnotherPython │
│ t.join() │
│ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 218, in join │
│ say_you │ You say, 'parser timer 60' raise self.excmbered_off │ You are no longer encumbered. │
│ targ File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 211, in run │
│ self.ret = self._target(*self._args, **self._kwargs) │
└───────────────────────────────────────────────── ────────────────────────────────────────────────── ───────────────────────────────────────────── ──── File "/home/d00d/.local/lib/python3.9/site-packages/playsound.py", line 226, in <lambda>
t = PropogatingThread(target = lambda: check_call([otherPython, playsoundPath, _handlePathOSX(sound) if macOS else sound]))
File "/usr/lib/python3.9/subprocess.py", line 373, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/ecor1/.local/lib/python3.9/site-packages/playsound.py', '/tmp/eqa/sound/b4d2431a1ceabf47a18fe36ed9606f6e.wav']' returned non-zero exit status 1.

Any ideas?

`playsound` seemingly has a handful of Linux system package dependencies. Check if you're missing anything in the below list:
https://github.com/mgeitz/eqalert/blob/master/Dockerfile#L17-L40

You may also need to install pygobject (https://pygobject.readthedocs.io/en/latest/).

If you're running eqalert on a mac I'm not too sure though I know playsound should support mac as well.

If all else fails, as a last ditch effort if you've got docker installed I'd suggest trying out the docker image instead. The compose file assumes pulse audio running on the host, so I'd be interested to know if it could run on a mac.

I'm definitely planning to replace playsound with another cross platform solution down the road, the errors are vague and it hasn't seen active development in two years. If you've built locally and have another preferred way to play sound files this is only called in one place:
https://github.com/mgeitz/eqalert/blob/master/eqa/lib/sound.py#L294

Sarekrn
08-23-2023, 09:52 AM
Ended upgrading my mint to 21, tried reinstalling eqalert and now Im getting the following:

Traceback (most recent call last):
File "/home/d00d/.local/bin/eqalert", line 33, in <module>
sys.exit(load_entry_point('eqalert', 'console_scripts', 'eqalert')())
File "/home/d00d/.local/bin/eqalert", line 25, in importlib_load_entry_point
return next(matches).load()
StopIteration

Indefinite
08-23-2023, 06:47 PM
Ended upgrading my mint to 21, tried reinstalling eqalert and now Im getting the following:

Traceback (most recent call last):
File "/home/d00d/.local/bin/eqalert", line 33, in <module>
sys.exit(load_entry_point('eqalert', 'console_scripts', 'eqalert')())
File "/home/d00d/.local/bin/eqalert", line 25, in importlib_load_entry_point
return next(matches).load()
StopIteration

I'm not sure, how did you try installing it? It looks as though it tries to run it but can't find some files?

If you have `python3-pip` installed it may be worth trying the below command if that was a installation from source:

pip3 install eqalert

Sarekrn
08-23-2023, 07:24 PM
Yeah I installed thru pip3.. now it won’t even uninstall to try again unfortunately

Indefinite
08-23-2023, 07:53 PM
I'm stumped! I'll have to try out Linux mint 21 in a VM and see if I can recreate it.

I do see a similar error after having installed eqalert with a venv and not sourcing the venv after trying to run in a new terminal session.

Sarekrn
08-23-2023, 07:59 PM
hrmm maybe I installed in the venv first... Thats possible.. anything I can try to check it out?

Indefinite
08-24-2023, 09:37 PM
hrmm maybe I installed in the venv first... Thats possible.. anything I can try to check it out?

If you installed using the below command earlier in the thread using venv:

python3 -m venv .venv; . .venv/bin/activate; python3 -m pip install -e .

Then you would need to cd back into the eqalert directory, verify a .venv/ directory exists and source it before running eqalert using:

source .venv/bin/activate

Indefinite
10-14-2023, 11:27 PM
EQAlert version 3.6.1 (https://github.com/mgeitz/eqalert/releases/tag/3.6.1) is out:


* Ability Output Config
- Separate out abilities to dedicated config

* Add Group Leader to Status Bar
- Generally helpful to know who the group leader is in group or raid context

* Toggle Encounter Parse Known Player Target
- When disabled never generate encounter reports for known players

* Fix emote parser dupes

* Guild Status to Player List
- Use `/guildstatus` output to update the player list

* Bump gTTS to 2.3.2

* README Update
- Add installation steps for Linux distributions which adopted PEP 668
- Alphabetize more things
- Re-order some sections
- Readability tweaks

* Bump Dockerfile Base Image

* Resolve Regex Errors


Please submit any bug reports or problems to this thread or to github issues (https://github.com/mgeitz/eqalert/issues)

sessual
03-09-2024, 09:10 PM
Will this ever have kill spawn timers? just wondering as thats a feature I really like from GINA

Indefinite
03-09-2024, 11:01 PM
Will this ever have kill spawn timers? just wondering as thats a feature I really like from GINA

There are automatic timers (https://github.com/mgeitz/eqalert/blob/master/eqa/lib/encounter.py#L1445-L1469) set by the encounter parser for a given mobs death, but it is based on a zone wide duration in seconds. The duration per zone is sourced from the config/zones.json (https://github.com/mgeitz/eqalert/blob/master/eqa/lib/config.py#L14527-L15053) file and the options to enable it can be toggled on the settings pane or in the settings.json (https://github.com/mgeitz/eqalert/blob/master/eqa/lib/config.py#L14500-L14521). Pressing `y` while in the events pane will also toggle mob respawn timers.

Otherwise, you can use `/say parser timer [seconds]` to create a manual timer for mobs, or for misc use in hotkeys.

If it's neither of those, I'd be happy to add an issue to the repo and get what you have in mind added!

pyrochase
03-15-2024, 06:50 PM
installed it today, and i get this error when i try to run it: write config line alert: Error on line26644: [Errno 13] Permission denied: '/home/username/.eqa/config/settings.json' -> '/home/username/.eqa/config/archive/unknown//settings.json'
config read: Error on line 69: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)
Unfortunately, the startup step failed with: 76: 'NoneType' object has no attribute 'settings'# Sometimes this is solved by forcing config regeneration

Indefinite
03-16-2024, 09:06 AM
It looks as though this is a bug in config generation, where it is attempting to archive an old set of config files which do not exist. Here is the section of code not behaving as it should: https://github.com/mgeitz/eqalert/blob/master/eqa/lib/config.py#L26623-L26644

I'll create an issue to track resolution here, there should probably be some added checks to ensure `old_version` and `config_name` exist prior to attempting to archive any old configs rather than just checking if a file with that name exists.

For the interim, try deleting all of `~/.eqa/config/` to force a regeneration of fresh config files. If a file with the config filenames don't exist, the parser shouldn't try to archive them before generating new ones.

Resolution of this bug will be tracked here: https://github.com/mgeitz/eqalert/issues/232

Indefinite
03-16-2024, 07:07 PM
EQAlert version 3.6.2 (https://github.com/mgeitz/eqalert/releases/tag/3.6.2) is out - it is entirely bug fixes and project upkeep, no new features yet!


- Fixes encounter heal tracking
- Fixes archiving unknown versions of config files
- Adds Poetry for package management
- Adds Pytest for future tests

pyrochase
03-16-2024, 11:35 PM
Thank you. I deleted the folder you mentioned and it created a new problem, but deleted the install folder and installed the new version and it is working finally. Time to play around with it :)

Indefinite
03-17-2024, 07:58 PM
EQAlert version 3.7.0 (https://github.com/mgeitz/eqalert/releases/tag/3.7.0) is out:


* Local TTS
- Disabled by default, gTTS is still used unless enabled
- Can change default TTS model
* Update Readme for Local Dev
* Update .dockerignore
* Workflow Name Updates
* Verbose Build Output
* Fix Spell Timers Generation
- Fix duplicate run bug on first run
- Much faster


This update adds an optional local TTS disabled by default as an alternative to using the default Google TTS which uses the internet for each new line to translate to speech. The local TTS uses coqui (https://pypi.org/project/TTS/) and the model used can be changed through the eqalert settings.json (https://github.com/mgeitz/eqalert/blob/master/eqa/lib/config.py#L14513) file.

As a trade-off, adding local TTS functionality has made the `eqalert` package itself much larger so package download times may be a bit longer.

Please submit any issues or bugs here on github (https://github.com/mgeitz/eqalert/issues) or below in the thread

Indefinite
03-26-2024, 07:51 PM
Oops! It looks like the 3.7.0 release has a bug or two which breaks all spell and mob timers.

Revert your pipx installation using: pipx install eqalert==3.6.2 --force

Otherwise checking out this tag (https://github.com/mgeitz/eqalert/commit/5ea960cc7c3ffeb928ad081dc95b7fed5588a9f8) and re-building will revert your installation to the last fully working version (sans local TTS).

Issues 263 (https://github.com/mgeitz/eqalert/issues/263) and 264 (https://github.com/mgeitz/eqalert/issues/264) have been created to track these bugs and get them fixed for the 3.7.2 release. Apologies for any missed spell expirations!

Indefinite
03-29-2024, 06:26 PM
EQAlert version 3.7.2 (https://github.com/mgeitz/eqalert/releases/tag/3.7.2) is out:


- Fix logging to `./log/eqalert.log`
- Fix spell timers
- Config generation refactor
- Moved `./encounters` to `./data/encounters`


This release resolves the issues with writing to the log file and evaluating spell timers introduced in 3.7.0

Indefinite
09-22-2024, 02:17 PM
Github has changed where projects are tracked.

The current EQ Alert road map can be viewed here now: https://github.com/users/mgeitz/projects/1

Anyone out there using EQ Alert; what do you like or dislike in the program?

Should I prioritize migrating to a qt4 framework for Windows support and a GUI or should I keep iterating on the existing TUI and improving the existing functions?

Zennrik
12-25-2024, 06:12 AM
Want to give this a whirl once I get playsound installed (struggling at bit at the moment, as I know crap about python).

Looks good though! Thanks for all the hard work!

Indefinite
01-01-2025, 01:06 AM
Happy New Years!

EQAlert version 3.7.3 (https://github.com/mgeitz/eqalert/releases/tag/3.7.3) is out:
- Dependency Package Updates
- Improve Config Generation - thanks ischwarz3 (https://github.com/ischwarz3)
- ...
- Not much from minimal testing but perhaps more than I remember (https://github.com/mgeitz/eqalert/compare/3.7.2...3.7.3)