Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | b3fe60a657 | ||
| ed5c5089b3 | 
							
								
								
									
										87
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | |||||||
|  | name: Release Workflow | ||||||
|  | on: [push] | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   release: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v3 | ||||||
|  |       with: | ||||||
|  |         fetch-depth: 0 | ||||||
|  |  | ||||||
|  |     - name: Install zip | ||||||
|  |       run: sudo apt-get install zip | ||||||
|  |  | ||||||
|  |     - name: Configure Git | ||||||
|  |       run: | | ||||||
|  |         git config --global user.name "Git Admin" | ||||||
|  |         git config --global user.email "gitadmin@quack-lab.dev" | ||||||
|  |  | ||||||
|  |     - name: Run deploy script | ||||||
|  |       run: bash deploy.sh | ||||||
|  |  | ||||||
|  |     - name: Check for Existing Release Commit | ||||||
|  |       id: check_release_commit | ||||||
|  |       run: | | ||||||
|  |         # Check if the latest commit is a release commit | ||||||
|  |         if git log -1 --pretty=%B | grep -q "Release"; then | ||||||
|  |           echo "Release commit found. Skipping version bump." | ||||||
|  |           echo "::set-output name=release_commit::true" | ||||||
|  |         else | ||||||
|  |           echo "No release commit found. Proceeding with version bump." | ||||||
|  |           echo "::set-output name=release_commit::false" | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |     - name: Run Release Script | ||||||
|  |       if: steps.check_release_commit.outputs.release_commit == 'false' | ||||||
|  |       run: bash release.sh | ||||||
|  |  | ||||||
|  |     - name: Push Changes | ||||||
|  |       if: steps.check_release_commit.outputs.release_commit == 'false' | ||||||
|  |       run: | | ||||||
|  |         git push origin HEAD:refs/heads/master --tags | ||||||
|  |  | ||||||
|  |     - name: Determine Tag | ||||||
|  |       id: determine_tag | ||||||
|  |       run: | | ||||||
|  |         # Check if the last commit has a tag | ||||||
|  |         TAG=$(git describe --tags --exact-match 2>/dev/null || echo "") | ||||||
|  |         if [ -z "$TAG" ]; then | ||||||
|  |           # Get the latest tag | ||||||
|  |           LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`) | ||||||
|  |           # Increment the minor version | ||||||
|  |           IFS='.' read -r -a VERSION_PARTS <<< "$LATEST_TAG" | ||||||
|  |           VERSION_PARTS[2]=$((VERSION_PARTS[2]+1)) | ||||||
|  |           TAG="${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.${VERSION_PARTS[2]}" | ||||||
|  |           # Create a new tag | ||||||
|  |           git tag $TAG | ||||||
|  |           git push origin $TAG | ||||||
|  |         fi | ||||||
|  |         echo "::set-output name=tag::$TAG" | ||||||
|  |  | ||||||
|  |     - name: Create Release | ||||||
|  |       id: create_release | ||||||
|  |       run: | | ||||||
|  |         curl -X POST \ | ||||||
|  |           -H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \ | ||||||
|  |           -H "Accept: application/json" \ | ||||||
|  |           -H "Content-Type: application/json" \ | ||||||
|  |           -d '{ | ||||||
|  |             "tag_name": "${{ steps.determine_tag.outputs.tag }}", | ||||||
|  |             "name": "${{ steps.determine_tag.outputs.tag }}", | ||||||
|  |             "draft": false, | ||||||
|  |             "prerelease": false | ||||||
|  |           }' \ | ||||||
|  |           http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases | ||||||
|  |  | ||||||
|  |     - name: Upload Release Asset | ||||||
|  |       run: | | ||||||
|  |         RELEASE_ID=$(curl -s \ | ||||||
|  |           -H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \ | ||||||
|  |           http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases/tags/${{ steps.determine_tag.outputs.tag }} | jq -r '.id') | ||||||
|  |         curl -X POST \ | ||||||
|  |           -H "Authorization: token ${{ secrets.JEBENI_TOKEN }}" \ | ||||||
|  |           -H "Content-Type: application/zip" \ | ||||||
|  |           --data-binary @Heimdall.zip \ | ||||||
|  |           http://srv-captain--git:3000/api/v1/repos/dave/wow-Heimdall/releases/${RELEASE_ID}/assets | ||||||
| @@ -1 +0,0 @@ | |||||||
| C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/Heimdall/Meta/.luacheckrc |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/Heimdall/Meta/.luarc.json |  | ||||||
							
								
								
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  | 	"Lua.diagnostics.globals": [ | ||||||
|  | 		"UIParent", | ||||||
|  | 		"BattlefieldMinimap" | ||||||
|  | 	] | ||||||
|  | } | ||||||
							
								
								
									
										1349
									
								
								Heimdall.lua
									
									
									
									
									
								
							
							
						
						
									
										1349
									
								
								Heimdall.lua
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| ## Interface: 70300 | ## Interface: 70300 | ||||||
| ## Title: Heimdall | ## Title: Heimdall | ||||||
| ## Version: 3.11.0 | ## Version: 3.10.1 | ||||||
| ## Notes: Watches over areas and alerts when hostiles spotted | ## Notes: Watches over areas and alerts when hostiles spotted | ||||||
| ## Author: Cyka | ## Author: Cyka | ||||||
| ## SavedVariables: Heimdall_Data, Heimdall_Achievements | ## SavedVariables: Heimdall_Data, Heimdall_Achievements | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								Meta
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								Meta
									
									
									
									
									
								
							 Submodule Meta updated: 6ab88bd8dc...c0337ef97f
									
								
							| @@ -1,9 +1,10 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "AchievementSniffer" | local ModuleName = "AchievementSniffer" | ||||||
|  |  | ||||||
| -- local HeimdallRoot = "Interface\\AddOns\\Heimdall\\" | local HeimdallRoot = "Interface\\AddOns\\Heimdall\\" | ||||||
| -- local TextureRoot = HeimdallRoot .. "Texture\\" | local TextureRoot = HeimdallRoot .. "Texture\\" | ||||||
|  |  | ||||||
| local Achievements = { | local Achievements = { | ||||||
| 	15, | 	15, | ||||||
| @@ -247,7 +248,9 @@ function shared.AchievementSniffer.Init() | |||||||
| 		if Heimdall_Data.config.achievementSniffer.debug then | 		if Heimdall_Data.config.achievementSniffer.debug then | ||||||
| 			print(string.format("[%s] Event triggered: %s for unit: %s", ModuleName, event, unit)) | 			print(string.format("[%s] Event triggered: %s for unit: %s", ModuleName, event, unit)) | ||||||
| 		end | 		end | ||||||
| 		if event == "NAME_PLATE_UNIT_ADDED" then TryInspect(unit) end | 		if event == "NAME_PLATE_UNIT_ADDED" then | ||||||
|  | 			TryInspect(unit) | ||||||
|  | 		end | ||||||
| 		--UpdateFrames() | 		--UpdateFrames() | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| @@ -268,6 +271,7 @@ function shared.AchievementSniffer.Init() | |||||||
| 		Scan(name) | 		Scan(name) | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
|  |  | ||||||
| 	local function Tick() | 	local function Tick() | ||||||
| 		C_Timer.NewTimer(Heimdall_Data.config.achievementSniffer.scanInterval, Tick) | 		C_Timer.NewTimer(Heimdall_Data.config.achievementSniffer.scanInterval, Tick) | ||||||
| 		if not Heimdall_Data.config.achievementSniffer.enabled then return end | 		if not Heimdall_Data.config.achievementSniffer.enabled then return end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "AgentTracker" | local ModuleName = "AgentTracker" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -36,20 +37,16 @@ function shared.AgentTracker.Init() | |||||||
|  |  | ||||||
| 		local newAgents = 0 | 		local newAgents = 0 | ||||||
| 		for i = 1, count do | 		for i = 1, count do | ||||||
| 			name = GetChannelRosterInfo(index, i) | 			local name = GetChannelRosterInfo(index, i) | ||||||
| 			if name then | 			if name then | ||||||
| 				local isNewAgent = not Heimdall_Data.config.agents[name] | 				local isNewAgent = not Heimdall_Data.config.agents[name] | ||||||
| 				Heimdall_Data.config.agents[name] = date("%Y-%m-%dT%H:%M:%S") | 				Heimdall_Data.config.agents[name] = date("%Y-%m-%dT%H:%M:%S") | ||||||
| 				if isNewAgent then newAgents = newAgents + 1 end | 				if isNewAgent then | ||||||
|  | 					newAgents = newAgents + 1 | ||||||
|  | 				end | ||||||
| 				if Heimdall_Data.config.agentTracker.debug then | 				if Heimdall_Data.config.agentTracker.debug then | ||||||
| 					print( | 					print(string.format("[%s] %s agent: %s", ModuleName, isNewAgent and "Added new" or "Updated existing", | ||||||
| 						string.format( | 						name)) | ||||||
| 							"[%s] %s agent: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							isNewAgent and "Added new" or "Updated existing", |  | ||||||
| 							name |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| @@ -92,27 +89,20 @@ function shared.AgentTracker.Init() | |||||||
| 			shared.dumpTable(Heimdall_Data.config.agentTracker) | 			shared.dumpTable(Heimdall_Data.config.agentTracker) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
|  |  | ||||||
| 		sender = string.match(sender, "^[^-]+") | 		sender = string.match(sender, "^[^-]+") | ||||||
| 		local isNewAgent = not Heimdall_Data.config.agents[sender] | 		local isNewAgent = not Heimdall_Data.config.agents[sender] | ||||||
| 		Heimdall_Data.config.agents[sender] = date("%Y-%m-%dT%H:%M:%S") | 		Heimdall_Data.config.agents[sender] = date("%Y-%m-%dT%H:%M:%S") | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.agentTracker.debug then | 		if Heimdall_Data.config.agentTracker.debug then | ||||||
| 			print( | 			print(string.format("[%s] %s agent from message: %s", ModuleName, | ||||||
| 				string.format( | 				isNewAgent and "Added new" or "Updated existing", sender)) | ||||||
| 					"[%s] %s agent from message: %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					isNewAgent and "Added new" or "Updated existing", |  | ||||||
| 					sender |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.agentTracker.debug then | 	if Heimdall_Data.config.agentTracker.debug then | ||||||
| 		local count = 0 | 		local count = 0 | ||||||
| 		for _ in pairs(Heimdall_Data.config.agents) do | 		for _ in pairs(Heimdall_Data.config.agents) do count = count + 1 end | ||||||
| 			count = count + 1 |  | ||||||
| 		end |  | ||||||
| 		print(string.format("[%s] Module initialized - Tracking %d agents", ModuleName, count)) | 		print(string.format("[%s] Module initialized - Tracking %d agents", ModuleName, count)) | ||||||
| 	end | 	end | ||||||
| 	print("[Heimdall] AgentTracker loaded") | 	print("[Heimdall] AgentTracker loaded") | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "BonkDetector" | local ModuleName = "BonkDetector" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -29,23 +30,14 @@ function shared.BonkDetector.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		---@type string|nil, string, string, string, string | 		local source, err = CLEUParser.GetSourceName(...) | ||||||
| 		local err, source, sourceGUID, destination, destinationGUID |  | ||||||
|  |  | ||||||
| 		source, err = CLEUParser.GetSourceName(...) |  | ||||||
| 		if err then | 		if err then | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then | 			if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 				print(string.format("[%s] Error getting source name: %s", ModuleName, err)) | 				print(string.format("[%s] Error getting source name: %s", ModuleName, err)) | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		sourceGUID, err = CLEUParser.GetSourceGUID(...) | 		local sourceGUID = CLEUParser.GetSourceGUID(...) | ||||||
| 		if err then |  | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then |  | ||||||
| 				print(string.format("[%s] Error getting source GUID: %s", ModuleName, err)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if not string.find(sourceGUID, "Player") then | 		if not string.find(sourceGUID, "Player") then | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then | 			if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 				print(string.format("[%s] Source %s is not a player, nothing to do", ModuleName, source)) | 				print(string.format("[%s] Source %s is not a player, nothing to do", ModuleName, source)) | ||||||
| @@ -53,20 +45,14 @@ function shared.BonkDetector.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		destination, err = CLEUParser.GetDestName(...) | 		local destination, err = CLEUParser.GetDestName(...) | ||||||
| 		if err then | 		if err then | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then | 			if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 				print(string.format("[%s] Error getting destination name: %s", ModuleName, err)) | 				print(string.format("[%s] Error getting destination name: %s", ModuleName, err)) | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		destinationGUID, err = CLEUParser.GetDestGUID(...) | 		local destinationGUID = CLEUParser.GetDestGUID(...) | ||||||
| 		if err then |  | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then |  | ||||||
| 				print(string.format("[%s] Error getting destination GUID: %s", ModuleName, err)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if not string.find(destinationGUID, "Player") then | 		if not string.find(destinationGUID, "Player") then | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then | 			if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 				print(string.format("[%s] Destination %s is not a player, nothing to do", ModuleName, destination)) | 				print(string.format("[%s] Destination %s is not a player, nothing to do", ModuleName, destination)) | ||||||
| @@ -87,14 +73,8 @@ function shared.BonkDetector.Init() | |||||||
| 		if lastReportTime[source] and (currentTime - lastReportTime[source]) < throttle then | 		if lastReportTime[source] and (currentTime - lastReportTime[source]) < throttle then | ||||||
| 			if Heimdall_Data.config.bonkDetector.debug then | 			if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 				local timeLeft = throttle - (currentTime - lastReportTime[source]) | 				local timeLeft = throttle - (currentTime - lastReportTime[source]) | ||||||
| 				print( | 				print(string.format("[%s] Damage report throttled for %s (%.1f seconds remaining)", | ||||||
| 					string.format( | 					ModuleName, source, timeLeft)) | ||||||
| 						"[%s] Damage report throttled for %s (%.1f seconds remaining)", |  | ||||||
| 						ModuleName, |  | ||||||
| 						source, |  | ||||||
| 						timeLeft |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -102,15 +82,8 @@ function shared.BonkDetector.Init() | |||||||
| 		lastReportTime[source] = currentTime | 		lastReportTime[source] = currentTime | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.bonkDetector.debug then | 		if Heimdall_Data.config.bonkDetector.debug then | ||||||
| 			print( | 			print(string.format("[%s] Processing damage event - Source: %s, Target: %s, Type: %s", | ||||||
| 				string.format( | 				ModuleName, source, destination, subevent)) | ||||||
| 					"[%s] Processing damage event - Source: %s, Target: %s, Type: %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					source, |  | ||||||
| 					destination, |  | ||||||
| 					subevent |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		for _, channel in pairs(Heimdall_Data.config.bonkDetector.channels) do | 		for _, channel in pairs(Heimdall_Data.config.bonkDetector.channels) do | ||||||
|   | |||||||
| @@ -1,10 +1,13 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Bully" | local ModuleName = "Bully" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Bully = {} | shared.Bully = {} | ||||||
| function shared.Bully.Init() | function shared.Bully.Init() | ||||||
| 	if Heimdall_Data.config.bully.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.bully.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] Bully loaded") | 	print("[Heimdall] Bully loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -12,12 +12,12 @@ local function Init() | |||||||
| 			["destGUID"] = 8, | 			["destGUID"] = 8, | ||||||
| 			["destName"] = 9, | 			["destName"] = 9, | ||||||
| 			["destFlags"] = 10, | 			["destFlags"] = 10, | ||||||
| 			["destRaidFlags"] = 11, | 			["destRaidFlags"] = 11 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_SPELL"] = { | 		["GENERIC_SPELL"] = { | ||||||
| 			["spellId"] = 12, | 			["spellId"] = 12, | ||||||
| 			["spellName"] = 13, | 			["spellName"] = 13, | ||||||
| 			["spellSchool"] = 14, | 			["spellSchool"] = 14 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_DAMAGE"] = { | 		["GENERIC_DAMAGE"] = { | ||||||
| 			["amount"] = 15, | 			["amount"] = 15, | ||||||
| @@ -29,19 +29,19 @@ local function Init() | |||||||
| 			["critical"] = 21, | 			["critical"] = 21, | ||||||
| 			["glancing"] = 22, | 			["glancing"] = 22, | ||||||
| 			["crushing"] = 23, | 			["crushing"] = 23, | ||||||
| 			["isOffHand"] = 24, | 			["isOffHand"] = 24 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_MISSED"] = { | 		["GENERIC_MISSED"] = { | ||||||
| 			["missType"] = 15, | 			["missType"] = 15, | ||||||
| 			["isOffHand"] = 16, | 			["isOffHand"] = 16, | ||||||
| 			["amountMissed"] = 17, | 			["amountMissed"] = 17, | ||||||
| 			["critical"] = 18, | 			["critical"] = 18 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_HEAL"] = { | 		["GENERIC_HEAL"] = { | ||||||
| 			["amount"] = 15, | 			["amount"] = 15, | ||||||
| 			["overhealing"] = 16, | 			["overhealing"] = 16, | ||||||
| 			["absorbed"] = 17, | 			["absorbed"] = 17, | ||||||
| 			["critical"] = 18, | 			["critical"] = 18 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_HEAL_ABSORBED"] = { | 		["GENERIC_HEAL_ABSORBED"] = { | ||||||
| 			["extraGUID"] = 15, | 			["extraGUID"] = 15, | ||||||
| @@ -52,44 +52,44 @@ local function Init() | |||||||
| 			["extraSpellName"] = 20, | 			["extraSpellName"] = 20, | ||||||
| 			["extraSchool"] = 21, | 			["extraSchool"] = 21, | ||||||
| 			["absorbedAmount"] = 22, | 			["absorbedAmount"] = 22, | ||||||
| 			["totalAmount"] = 23, | 			["totalAmount"] = 23 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_ENERGIZE"] = { | 		["GENERIC_ENERGIZE"] = { | ||||||
| 			["amount"] = 15, | 			["amount"] = 15, | ||||||
| 			["overEnergize"] = 16, | 			["overEnergize"] = 16, | ||||||
| 			["powerType"] = 17, | 			["powerType"] = 17 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_DRAIN"] = { | 		["GENERIC_DRAIN"] = { | ||||||
| 			["amount"] = 15, | 			["amount"] = 15, | ||||||
| 			["powerType"] = 16, | 			["powerType"] = 16, | ||||||
| 			["extraAmount"] = 17, | 			["extraAmount"] = 17 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_LEECH"] = { | 		["GENERIC_LEECH"] = { | ||||||
| 			["amount"] = 15, | 			["amount"] = 15, | ||||||
| 			["powerType"] = 16, | 			["powerType"] = 16, | ||||||
| 			["extraAmount"] = 17, | 			["extraAmount"] = 17 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_INTERRUPT"] = { | 		["GENERIC_INTERRUPT"] = { | ||||||
| 			["extraSpellId"] = 15, | 			["extraSpellId"] = 15, | ||||||
| 			["extraSpellName"] = 16, | 			["extraSpellName"] = 16, | ||||||
| 			["extraSchool"] = 17, | 			["extraSchool"] = 17 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_DISPEL"] = { | 		["GENERIC_DISPEL"] = { | ||||||
| 			["extraSpellId"] = 15, | 			["extraSpellId"] = 15, | ||||||
| 			["extraSpellName"] = 16, | 			["extraSpellName"] = 16, | ||||||
| 			["extraSchool"] = 17, | 			["extraSchool"] = 17, | ||||||
| 			["auraType"] = 18, | 			["auraType"] = 18 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_DISPEL_FAILED"] = { | 		["GENERIC_DISPEL_FAILED"] = { | ||||||
| 			["extraSpellId"] = 15, | 			["extraSpellId"] = 15, | ||||||
| 			["extraSpellName"] = 16, | 			["extraSpellName"] = 16, | ||||||
| 			["extraSchool"] = 17, | 			["extraSchool"] = 17 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_STOLEN"] = { | 		["GENERIC_STOLEN"] = { | ||||||
| 			["extraSpellId"] = 15, | 			["extraSpellId"] = 15, | ||||||
| 			["extraSpellName"] = 16, | 			["extraSpellName"] = 16, | ||||||
| 			["extraSchool"] = 17, | 			["extraSchool"] = 17, | ||||||
| 			["auraType"] = 18, | 			["auraType"] = 18 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_EXTRA_ATTACKS"] = { ["amount"] = 15 }, | 		["GENERIC_EXTRA_ATTACKS"] = { ["amount"] = 15 }, | ||||||
| 		["GENERIC_AURA_APPLIED"] = { ["auraType"] = 15, ["amount"] = 16 }, | 		["GENERIC_AURA_APPLIED"] = { ["auraType"] = 15, ["amount"] = 16 }, | ||||||
| @@ -102,32 +102,38 @@ local function Init() | |||||||
| 			["extraSpellId"] = 15, | 			["extraSpellId"] = 15, | ||||||
| 			["extraSpellName"] = 16, | 			["extraSpellName"] = 16, | ||||||
| 			["extraSchool"] = 17, | 			["extraSchool"] = 17, | ||||||
| 			["auraType"] = 18, | 			["auraType"] = 18 | ||||||
| 		}, | 		}, | ||||||
| 		["GENERIC_CAST_START"] = {}, | 		["GENERIC_CAST_START"] = {}, | ||||||
| 		["GENERIC_CAST_SUCCESS"] = {}, | 		["GENERIC_CAST_SUCCESS"] = {}, | ||||||
| 		["GENERIC_CAST_FAILED"] = {}, | 		["GENERIC_CAST_FAILED"] = {} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	CLEUEventInfo["SWING_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | 	CLEUEventInfo["SWING_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | ||||||
| 	CLEUEventInfo["SWING_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | 	CLEUEventInfo["SWING_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | ||||||
| 	CLEUEventInfo["SWING_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | 	CLEUEventInfo["SWING_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | ||||||
| 	CLEUEventInfo["SWING_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | 	CLEUEventInfo["SWING_HEAL_ABSORBED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | ||||||
| 	CLEUEventInfo["SWING_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | 	CLEUEventInfo["SWING_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | ||||||
| 	CLEUEventInfo["SWING_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | 	CLEUEventInfo["SWING_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | ||||||
| 	CLEUEventInfo["SWING_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | 	CLEUEventInfo["SWING_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | ||||||
| 	CLEUEventInfo["SWING_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | 	CLEUEventInfo["SWING_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | ||||||
| 	CLEUEventInfo["SWING_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | 	CLEUEventInfo["SWING_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | ||||||
| 	CLEUEventInfo["SWING_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] | 	CLEUEventInfo["SWING_DISPEL_FAILED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_DISPEL_FAILED"] | ||||||
| 	CLEUEventInfo["SWING_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | 	CLEUEventInfo["SWING_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | ||||||
| 	CLEUEventInfo["SWING_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | 	CLEUEventInfo["SWING_EXTRA_ATTACKS"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | ||||||
| 	CLEUEventInfo["SWING_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | 	CLEUEventInfo["SWING_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | ||||||
| 	CLEUEventInfo["SWING_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | 	CLEUEventInfo["SWING_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | ||||||
| 	CLEUEventInfo["SWING_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | 	CLEUEventInfo["SWING_AURA_APPLIED_DOSE"] = | ||||||
| 	CLEUEventInfo["SWING_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | 		CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | ||||||
|  | 	CLEUEventInfo["SWING_AURA_REMOVED_DOSE"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | ||||||
| 	CLEUEventInfo["SWING_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | 	CLEUEventInfo["SWING_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | ||||||
| 	CLEUEventInfo["SWING_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | 	CLEUEventInfo["SWING_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | ||||||
| 	CLEUEventInfo["SWING_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | 	CLEUEventInfo["SWING_AURA_BROKEN_SPELL"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | ||||||
| 	CLEUEventInfo["SWING_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | 	CLEUEventInfo["SWING_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | ||||||
| 	CLEUEventInfo["SWING_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | 	CLEUEventInfo["SWING_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | ||||||
| 	CLEUEventInfo["SWING_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | 	CLEUEventInfo["SWING_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | ||||||
| @@ -135,22 +141,28 @@ local function Init() | |||||||
| 	CLEUEventInfo["RANGE_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | 	CLEUEventInfo["RANGE_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | ||||||
| 	CLEUEventInfo["RANGE_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | 	CLEUEventInfo["RANGE_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | ||||||
| 	CLEUEventInfo["RANGE_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | 	CLEUEventInfo["RANGE_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | ||||||
| 	CLEUEventInfo["RANGE_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | 	CLEUEventInfo["RANGE_HEAL_ABSORBED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | ||||||
| 	CLEUEventInfo["RANGE_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | 	CLEUEventInfo["RANGE_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | ||||||
| 	CLEUEventInfo["RANGE_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | 	CLEUEventInfo["RANGE_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | ||||||
| 	CLEUEventInfo["RANGE_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | 	CLEUEventInfo["RANGE_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | ||||||
| 	CLEUEventInfo["RANGE_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | 	CLEUEventInfo["RANGE_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | ||||||
| 	CLEUEventInfo["RANGE_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | 	CLEUEventInfo["RANGE_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | ||||||
| 	CLEUEventInfo["RANGE_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] | 	CLEUEventInfo["RANGE_DISPEL_FAILED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_DISPEL_FAILED"] | ||||||
| 	CLEUEventInfo["RANGE_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | 	CLEUEventInfo["RANGE_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | ||||||
| 	CLEUEventInfo["RANGE_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | 	CLEUEventInfo["RANGE_EXTRA_ATTACKS"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | 	CLEUEventInfo["RANGE_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | 	CLEUEventInfo["RANGE_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | 	CLEUEventInfo["RANGE_AURA_APPLIED_DOSE"] = | ||||||
| 	CLEUEventInfo["RANGE_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | 		CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | ||||||
|  | 	CLEUEventInfo["RANGE_AURA_REMOVED_DOSE"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | 	CLEUEventInfo["RANGE_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | 	CLEUEventInfo["RANGE_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | ||||||
| 	CLEUEventInfo["RANGE_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | 	CLEUEventInfo["RANGE_AURA_BROKEN_SPELL"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | ||||||
| 	CLEUEventInfo["RANGE_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | 	CLEUEventInfo["RANGE_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | ||||||
| 	CLEUEventInfo["RANGE_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | 	CLEUEventInfo["RANGE_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | ||||||
| 	CLEUEventInfo["RANGE_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | 	CLEUEventInfo["RANGE_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | ||||||
| @@ -158,22 +170,28 @@ local function Init() | |||||||
| 	CLEUEventInfo["SPELL_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | 	CLEUEventInfo["SPELL_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | ||||||
| 	CLEUEventInfo["SPELL_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | 	CLEUEventInfo["SPELL_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | ||||||
| 	CLEUEventInfo["SPELL_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | 	CLEUEventInfo["SPELL_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | ||||||
| 	CLEUEventInfo["SPELL_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | 	CLEUEventInfo["SPELL_HEAL_ABSORBED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | ||||||
| 	CLEUEventInfo["SPELL_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | 	CLEUEventInfo["SPELL_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | ||||||
| 	CLEUEventInfo["SPELL_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | 	CLEUEventInfo["SPELL_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | ||||||
| 	CLEUEventInfo["SPELL_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | 	CLEUEventInfo["SPELL_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | ||||||
| 	CLEUEventInfo["SPELL_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | 	CLEUEventInfo["SPELL_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | ||||||
| 	CLEUEventInfo["SPELL_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | 	CLEUEventInfo["SPELL_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | ||||||
| 	CLEUEventInfo["SPELL_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] | 	CLEUEventInfo["SPELL_DISPEL_FAILED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_DISPEL_FAILED"] | ||||||
| 	CLEUEventInfo["SPELL_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | 	CLEUEventInfo["SPELL_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | ||||||
| 	CLEUEventInfo["SPELL_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | 	CLEUEventInfo["SPELL_EXTRA_ATTACKS"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | 	CLEUEventInfo["SPELL_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | 	CLEUEventInfo["SPELL_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | 	CLEUEventInfo["SPELL_AURA_APPLIED_DOSE"] = | ||||||
| 	CLEUEventInfo["SPELL_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | 		CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | ||||||
|  | 	CLEUEventInfo["SPELL_AURA_REMOVED_DOSE"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | 	CLEUEventInfo["SPELL_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | 	CLEUEventInfo["SPELL_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | ||||||
| 	CLEUEventInfo["SPELL_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | 	CLEUEventInfo["SPELL_AURA_BROKEN_SPELL"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | ||||||
| 	CLEUEventInfo["SPELL_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | 	CLEUEventInfo["SPELL_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | ||||||
| 	CLEUEventInfo["SPELL_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | 	CLEUEventInfo["SPELL_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | ||||||
| 	CLEUEventInfo["SPELL_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | 	CLEUEventInfo["SPELL_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | ||||||
| @@ -181,25 +199,39 @@ local function Init() | |||||||
| 	CLEUEventInfo["SPELL_PERIODIC_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | 	CLEUEventInfo["SPELL_PERIODIC_DAMAGE"] = CLEUEventInfo["GENERIC_DAMAGE"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | 	CLEUEventInfo["SPELL_PERIODIC_MISSED"] = CLEUEventInfo["GENERIC_MISSED"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | 	CLEUEventInfo["SPELL_PERIODIC_HEAL"] = CLEUEventInfo["GENERIC_HEAL"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_HEAL_ABSORBED"] = CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | 	CLEUEventInfo["SPELL_PERIODIC_HEAL_ABSORBED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_HEAL_ABSORBED"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | 	CLEUEventInfo["SPELL_PERIODIC_ENERGIZE"] = CLEUEventInfo["GENERIC_ENERGIZE"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | 	CLEUEventInfo["SPELL_PERIODIC_DRAIN"] = CLEUEventInfo["GENERIC_DRAIN"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | 	CLEUEventInfo["SPELL_PERIODIC_LEECH"] = CLEUEventInfo["GENERIC_LEECH"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_INTERRUPT"] = CLEUEventInfo["GENERIC_INTERRUPT"] | 	CLEUEventInfo["SPELL_PERIODIC_INTERRUPT"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_INTERRUPT"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | 	CLEUEventInfo["SPELL_PERIODIC_DISPEL"] = CLEUEventInfo["GENERIC_DISPEL"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_DISPEL_FAILED"] = CLEUEventInfo["GENERIC_DISPEL_FAILED"] | 	CLEUEventInfo["SPELL_PERIODIC_DISPEL_FAILED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_DISPEL_FAILED"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | 	CLEUEventInfo["SPELL_PERIODIC_STOLEN"] = CLEUEventInfo["GENERIC_STOLEN"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_EXTRA_ATTACKS"] = CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | 	CLEUEventInfo["SPELL_PERIODIC_EXTRA_ATTACKS"] = | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED"] = CLEUEventInfo["GENERIC_AURA_APPLIED"] | 		CLEUEventInfo["GENERIC_EXTRA_ATTACKS"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED"] = CLEUEventInfo["GENERIC_AURA_REMOVED"] | 	CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED"] = | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED_DOSE"] = CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | 		CLEUEventInfo["GENERIC_AURA_APPLIED"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED_DOSE"] = CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | 	CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED"] = | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_REFRESH"] = CLEUEventInfo["GENERIC_AURA_REFRESH"] | 		CLEUEventInfo["GENERIC_AURA_REMOVED"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN"] = CLEUEventInfo["GENERIC_AURA_BROKEN"] | 	CLEUEventInfo["SPELL_PERIODIC_AURA_APPLIED_DOSE"] = | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN_SPELL"] = CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | 		CLEUEventInfo["GENERIC_AURA_APPLIED_DOSE"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_CAST_START"] = CLEUEventInfo["GENERIC_CAST_START"] | 	CLEUEventInfo["SPELL_PERIODIC_AURA_REMOVED_DOSE"] = | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_CAST_SUCCESS"] = CLEUEventInfo["GENERIC_CAST_SUCCESS"] | 		CLEUEventInfo["GENERIC_AURA_REMOVED_DOSE"] | ||||||
| 	CLEUEventInfo["SPELL_PERIODIC_CAST_FAILED"] = CLEUEventInfo["GENERIC_CAST_FAILED"] | 	CLEUEventInfo["SPELL_PERIODIC_AURA_REFRESH"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_REFRESH"] | ||||||
|  | 	CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_BROKEN"] | ||||||
|  | 	CLEUEventInfo["SPELL_PERIODIC_AURA_BROKEN_SPELL"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_AURA_BROKEN_SPELL"] | ||||||
|  | 	CLEUEventInfo["SPELL_PERIODIC_CAST_START"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_CAST_START"] | ||||||
|  | 	CLEUEventInfo["SPELL_PERIODIC_CAST_SUCCESS"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_CAST_SUCCESS"] | ||||||
|  | 	CLEUEventInfo["SPELL_PERIODIC_CAST_FAILED"] = | ||||||
|  | 		CLEUEventInfo["GENERIC_CAST_FAILED"] | ||||||
|  |  | ||||||
| 	---@class CLEUParser | 	---@class CLEUParser | ||||||
| 	CLEUParser = { | 	CLEUParser = { | ||||||
| @@ -207,88 +239,132 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetTimestamp = function(...) | 		GetTimestamp = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["timestamp"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["timestamp"], ...) | ||||||
| 			if val == nil then return 0, "Timestamp is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "Timestamp is not a number" end | 				return 0, "Timestamp is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "Timestamp is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetSubevent = function(...) | 		GetSubevent = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["subevent"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["subevent"], ...) | ||||||
| 			if val == nil then return "", "Subevent is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "Subevent is not a string" end | 				return "", "Subevent is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "Subevent is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetHideCaster = function(...) | 		GetHideCaster = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["hideCaster"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["hideCaster"], ...) | ||||||
| 			if val == nil then return false, "HideCaster is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "HideCaster is not a boolean" end | 				return false, "HideCaster is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "HideCaster is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetSourceGUID = function(...) | 		GetSourceGUID = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["sourceGUID"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["sourceGUID"], ...) | ||||||
| 			if val == nil then return "", "SourceGUID is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "SourceGUID is not a string" end | 				return "", "SourceGUID is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "SourceGUID is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetSourceName = function(...) | 		GetSourceName = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["sourceName"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["sourceName"], ...) | ||||||
| 			if val == nil then return "", "SourceName is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "SourceName is not a string" end | 				return "", "SourceName is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "SourceName is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetSourceFlags = function(...) | 		GetSourceFlags = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["sourceFlags"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["sourceFlags"], ...) | ||||||
| 			if val == nil then return 0, "SourceFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "SourceFlags is not a number" end | 				return 0, "SourceFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "SourceFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetSourceRaidFlags = function(...) | 		GetSourceRaidFlags = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["sourceRaidFlags"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["sourceRaidFlags"], ...) | ||||||
| 			if val == nil then return 0, "SourceRaidFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "SourceRaidFlags is not a number" end | 				return 0, "SourceRaidFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "SourceRaidFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetDestGUID = function(...) | 		GetDestGUID = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["destGUID"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["destGUID"], ...) | ||||||
| 			if val == nil then return "", "DestGUID is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "DestGUID is not a string" end | 				return "", "DestGUID is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "DestGUID is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetDestName = function(...) | 		GetDestName = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["destName"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["destName"], ...) | ||||||
| 			if val == nil then return "", "DestName is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "DestName is not a string" end | 				return "", "DestName is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "DestName is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetDestFlags = function(...) | 		GetDestFlags = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["destFlags"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["destFlags"], ...) | ||||||
| 			if val == nil then return 0, "DestFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "DestFlags is not a number" end | 				return 0, "DestFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "DestFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetDestRaidFlags = function(...) | 		GetDestRaidFlags = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC"]["destRaidFlags"], ...) | 			local val = select(CLEUEventInfo["GENERIC"]["destRaidFlags"], ...) | ||||||
| 			if val == nil then return 0, "DestRaidFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "DestRaidFlags is not a number" end | 				return 0, "DestRaidFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "DestRaidFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -304,7 +380,9 @@ local function Init() | |||||||
| 		GetSpellId = function(...) | 		GetSpellId = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellId"], ...) | 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellId"], ...) | ||||||
| 			if val == nil then return 0, "SpellId is nil or missing" end | 			if val == nil then return 0, "SpellId is nil or missing" end | ||||||
| 			if type(val) ~= "number" then return 0, "SpellId is not a number" end | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "SpellId is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -318,8 +396,12 @@ local function Init() | |||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetSpellName = function(...) | 		GetSpellName = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellName"], ...) | 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellName"], ...) | ||||||
| 			if val == nil then return "", "SpellName is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "SpellName is not a string" end | 				return "", "SpellName is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "SpellName is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -332,9 +414,14 @@ local function Init() | |||||||
| 		---@param ... any | 		---@param ... any | ||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetSpellSchool = function(...) | 		GetSpellSchool = function(...) | ||||||
| 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellSchool"], ...) | 			local val = select(CLEUEventInfo["GENERIC_SPELL"]["spellSchool"], | ||||||
| 			if val == nil then return 0, "SpellSchool is nil or missing" end | 				...) | ||||||
| 			if type(val) ~= "number" then return 0, "SpellSchool is not a number" end | 			if val == nil then | ||||||
|  | 				return 0, "SpellSchool is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "SpellSchool is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -364,10 +451,15 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetAmount = function(...) | 		GetAmount = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["amount"], ...) | 			local val = select(CLEUEventInfo[subevent]["amount"], ...) | ||||||
| 			if val == nil then return 0, "Amount is nil or missing" end | 			if val == nil then return 0, "Amount is nil or missing" end | ||||||
| 			if type(val) ~= "number" then return 0, "Amount is not a number" end | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "Amount is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -387,12 +479,21 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetOverkill = function(...) | 		GetOverkill = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
| 			if not CLEUEventInfo[subevent] then return 0, "Subevent is not a valid event" end | 				return 0, | ||||||
| 			if not CLEUEventInfo[subevent]["overkill"] then return 0, "Overkill is nil or missing" end | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
|  | 			if not CLEUEventInfo[subevent] then | ||||||
|  | 				return 0, "Subevent is not a valid event" | ||||||
|  | 			end | ||||||
|  | 			if not CLEUEventInfo[subevent]["overkill"] then | ||||||
|  | 				return 0, "Overkill is nil or missing" | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["overkill"], ...) | 			local val = select(CLEUEventInfo[subevent]["overkill"], ...) | ||||||
| 			if val == nil then return 0, "Overkill is nil or missing" end | 			if val == nil then return 0, "Overkill is nil or missing" end | ||||||
| 			if type(val) ~= "number" then return 0, "Overkill is not a number" end | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "Overkill is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -412,10 +513,15 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetSchool = function(...) | 		GetSchool = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["school"], ...) | 			local val = select(CLEUEventInfo[subevent]["school"], ...) | ||||||
| 			if val == nil then return 0, "School is nil or missing" end | 			if val == nil then return 0, "School is nil or missing" end | ||||||
| 			if type(val) ~= "number" then return 0, "School is not a number" end | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "School is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -437,10 +543,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetResisted = function(...) | 		GetResisted = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["resisted"], ...) | 			local val = select(CLEUEventInfo[subevent]["resisted"], ...) | ||||||
| 			if val == nil then return false, "Resisted is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Resisted is not a boolean" end | 				return false, "Resisted is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Resisted is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -462,10 +575,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetBlocked = function(...) | 		GetBlocked = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["blocked"], ...) | 			local val = select(CLEUEventInfo[subevent]["blocked"], ...) | ||||||
| 			if val == nil then return false, "Blocked is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Blocked is not a boolean" end | 				return false, "Blocked is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Blocked is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -488,10 +608,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetAbsorbed = function(...) | 		GetAbsorbed = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["absorbed"], ...) | 			local val = select(CLEUEventInfo[subevent]["absorbed"], ...) | ||||||
| 			if val == nil then return false, "Absorbed is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Absorbed is not a boolean" end | 				return false, "Absorbed is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Absorbed is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -513,10 +640,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetCritical = function(...) | 		GetCritical = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["critical"], ...) | 			local val = select(CLEUEventInfo[subevent]["critical"], ...) | ||||||
| 			if val == nil then return false, "Critical is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Critical is not a boolean" end | 				return false, "Critical is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Critical is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -536,10 +670,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetGlancing = function(...) | 		GetGlancing = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["glancing"], ...) | 			local val = select(CLEUEventInfo[subevent]["glancing"], ...) | ||||||
| 			if val == nil then return false, "Glancing is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Glancing is not a boolean" end | 				return false, "Glancing is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Glancing is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -559,10 +700,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetCrushing = function(...) | 		GetCrushing = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["crushing"], ...) | 			local val = select(CLEUEventInfo[subevent]["crushing"], ...) | ||||||
| 			if val == nil then return false, "Crushing is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "Crushing is not a boolean" end | 				return false, "Crushing is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "Crushing is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
| 		--- Specific to subevents prefixed by: | 		--- Specific to subevents prefixed by: | ||||||
| @@ -583,10 +731,17 @@ local function Init() | |||||||
| 		---@return boolean, nil|string | 		---@return boolean, nil|string | ||||||
| 		GetIsOffHand = function(...) | 		GetIsOffHand = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return false, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return false, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["isOffHand"], ...) | 			local val = select(CLEUEventInfo[subevent]["isOffHand"], ...) | ||||||
| 			if val == nil then return false, "IsOffHand is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "boolean" then return false, "IsOffHand is not a boolean" end | 				return false, "IsOffHand is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "boolean" then | ||||||
|  | 				return false, "IsOffHand is not a boolean" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -609,10 +764,17 @@ local function Init() | |||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetMissType = function(...) | 		GetMissType = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return "", string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return "", | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["missType"], ...) | 			local val = select(CLEUEventInfo[subevent]["missType"], ...) | ||||||
| 			if val == nil then return "", "MissType is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "MissType is not a string" end | 				return "", "MissType is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "MissType is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -635,10 +797,17 @@ local function Init() | |||||||
| 		--- return type is unconfirmed! | 		--- return type is unconfirmed! | ||||||
| 		GetAmountMissed = function(...) | 		GetAmountMissed = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["amountMissed"], ...) | 			local val = select(CLEUEventInfo[subevent]["amountMissed"], ...) | ||||||
| 			if val == nil then return 0, "AmountMissed is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "AmountMissed is not a number" end | 				return 0, "AmountMissed is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "AmountMissed is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -661,10 +830,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetOverhealing = function(...) | 		GetOverhealing = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["overhealing"], ...) | 			local val = select(CLEUEventInfo[subevent]["overhealing"], ...) | ||||||
| 			if val == nil then return 0, "Overhealing is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "Overhealing is not a number" end | 				return 0, "Overhealing is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "Overhealing is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -685,10 +861,17 @@ local function Init() | |||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetExtraGUID = function(...) | 		GetExtraGUID = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return "", string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return "", | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraGUID"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraGUID"], ...) | ||||||
| 			if val == nil then return "", "ExtraGUID is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "ExtraGUID is not a string" end | 				return "", "ExtraGUID is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "ExtraGUID is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -709,10 +892,17 @@ local function Init() | |||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetExtraName = function(...) | 		GetExtraName = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return "", string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return "", | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraName"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraName"], ...) | ||||||
| 			if val == nil then return "", "ExtraName is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "ExtraName is not a string" end | 				return "", "ExtraName is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "ExtraName is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -733,10 +923,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraFlags = function(...) | 		GetExtraFlags = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraFlags"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraFlags"], ...) | ||||||
| 			if val == nil then return 0, "ExtraFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraFlags is not a number" end | 				return 0, "ExtraFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -757,10 +954,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraRaidFlags = function(...) | 		GetExtraRaidFlags = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraRaidFlags"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraRaidFlags"], ...) | ||||||
| 			if val == nil then return 0, "ExtraRaidFlags is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraRaidFlags is not a number" end | 				return 0, "ExtraRaidFlags is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraRaidFlags is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -785,10 +989,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraSpellID = function(...) | 		GetExtraSpellID = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraSpellID"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraSpellID"], ...) | ||||||
| 			if val == nil then return 0, "ExtraSpellID is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraSpellID is not a number" end | 				return 0, "ExtraSpellID is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraSpellID is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -814,10 +1025,17 @@ local function Init() | |||||||
| 		---@return string, nil|string | 		---@return string, nil|string | ||||||
| 		GetExtraSpellName = function(...) | 		GetExtraSpellName = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return "", string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return "", | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraSpellName"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraSpellName"], ...) | ||||||
| 			if val == nil then return "", "extraSpellName is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "string" then return "", "extraSpellName is not a string" end | 				return "", "extraSpellName is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "string" then | ||||||
|  | 				return "", "extraSpellName is not a string" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -843,10 +1061,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraSchool = function(...) | 		GetExtraSchool = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraSchool"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraSchool"], ...) | ||||||
| 			if val == nil then return 0, "ExtraSchool is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraSchool is not a number" end | 				return 0, "ExtraSchool is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraSchool is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -867,10 +1092,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetAbsorbedAmount = function(...) | 		GetAbsorbedAmount = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["absorbedAmount"], ...) | 			local val = select(CLEUEventInfo[subevent]["absorbedAmount"], ...) | ||||||
| 			if val == nil then return 0, "AbsorbedAmount is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "AbsorbedAmount is not a number" end | 				return 0, "AbsorbedAmount is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "AbsorbedAmount is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -891,10 +1123,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetOverEnergize = function(...) | 		GetOverEnergize = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["overEnergize"], ...) | 			local val = select(CLEUEventInfo[subevent]["overEnergize"], ...) | ||||||
| 			if val == nil then return 0, "OverEnergize is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "OverEnergize is not a number" end | 				return 0, "OverEnergize is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "OverEnergize is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -919,10 +1158,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetPowerType = function(...) | 		GetPowerType = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["powerType"], ...) | 			local val = select(CLEUEventInfo[subevent]["powerType"], ...) | ||||||
| 			if val == nil then return 0, "PowerType is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "PowerType is not a number" end | 				return 0, "PowerType is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "PowerType is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -944,10 +1190,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraAmount = function(...) | 		GetExtraAmount = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraAmount"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraAmount"], ...) | ||||||
| 			if val == nil then return 0, "ExtraAmount is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraAmount is not a number" end | 				return 0, "ExtraAmount is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraAmount is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -976,10 +1229,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraSpellId = function(...) | 		GetExtraSpellId = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["extraSpellId"], ...) | 			local val = select(CLEUEventInfo[subevent]["extraSpellId"], ...) | ||||||
| 			if val == nil then return 0, "ExtraSpellId is nil or missing" end | 			if val == nil then | ||||||
| 			if type(val) ~= "number" then return 0, "ExtraSpellId is not a number" end | 				return 0, "ExtraSpellId is nil or missing" | ||||||
|  | 			end | ||||||
|  | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "ExtraSpellId is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end, | ||||||
|  |  | ||||||
| @@ -1008,12 +1268,17 @@ local function Init() | |||||||
| 		---@return number, nil|string | 		---@return number, nil|string | ||||||
| 		GetExtraAuraType = function(...) | 		GetExtraAuraType = function(...) | ||||||
| 			local subevent, err = CLEUParser.GetSubevent(...) | 			local subevent, err = CLEUParser.GetSubevent(...) | ||||||
| 			if err then return 0, string.format("Failed getting subevent due to: %s", err) end | 			if err then | ||||||
|  | 				return 0, | ||||||
|  | 					string.format("Failed getting subevent due to: %s", err) | ||||||
|  | 			end | ||||||
| 			local val = select(CLEUEventInfo[subevent]["auraType"], ...) | 			local val = select(CLEUEventInfo[subevent]["auraType"], ...) | ||||||
| 			if val == nil then return 0, "AuraType is nil or missing" end | 			if val == nil then return 0, "AuraType is nil or missing" end | ||||||
| 			if type(val) ~= "number" then return 0, "AuraType is not a number" end | 			if type(val) ~= "number" then | ||||||
|  | 				return 0, "AuraType is not a number" | ||||||
|  | 			end | ||||||
| 			return val, nil | 			return val, nil | ||||||
| 		end, | 		end | ||||||
| 	} | 	} | ||||||
| end | end | ||||||
|  |  | ||||||
| @@ -1021,5 +1286,7 @@ local frame = CreateFrame("Frame") | |||||||
| frame:RegisterEvent("PLAYER_LOGIN") | frame:RegisterEvent("PLAYER_LOGIN") | ||||||
| frame:RegisterEvent("PLAYER_ENTERING_WORLD") | frame:RegisterEvent("PLAYER_ENTERING_WORLD") | ||||||
| frame:RegisterEvent("GUILD_ROSTER_UPDATE") | frame:RegisterEvent("GUILD_ROSTER_UPDATE") | ||||||
| frame:SetScript("OnEvent", function(self, event, ...) Init() end) | frame:SetScript("OnEvent", function(self, event, ...) | ||||||
|  | 	Init() | ||||||
|  | end) | ||||||
| Init() | Init() | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "CombatAlerter" | local ModuleName = "CombatAlerter" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -19,10 +20,7 @@ function shared.CombatAlerter.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		---@type string|nil, string, string | 		local destination, err = CLEUParser.GetDestName(...) | ||||||
| 		local err, source, destination |  | ||||||
|  |  | ||||||
| 		destination, err = CLEUParser.GetDestName(...) |  | ||||||
| 		if err then | 		if err then | ||||||
| 			if Heimdall_Data.config.combatAlerter.debug then | 			if Heimdall_Data.config.combatAlerter.debug then | ||||||
| 				print(string.format("[%s] Error getting destination: %s", ModuleName, err)) | 				print(string.format("[%s] Error getting destination: %s", ModuleName, err)) | ||||||
| @@ -41,7 +39,7 @@ function shared.CombatAlerter.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		source, err = CLEUParser.GetSourceName(...) | 		local source, err = CLEUParser.GetSourceName(...) | ||||||
| 		if err then | 		if err then | ||||||
| 			if Heimdall_Data.config.combatAlerter.debug then | 			if Heimdall_Data.config.combatAlerter.debug then | ||||||
| 				print(string.format("[%s] Error getting source, using 'unknown': %s", ModuleName, err)) | 				print(string.format("[%s] Error getting source, using 'unknown': %s", ModuleName, err)) | ||||||
| @@ -55,14 +53,8 @@ function shared.CombatAlerter.Init() | |||||||
|  |  | ||||||
| 		if shared.stinkyTracker.stinkies and shared.stinkyTracker.stinkies[source] then | 		if shared.stinkyTracker.stinkies and shared.stinkyTracker.stinkies[source] then | ||||||
| 			if Heimdall_Data.config.combatAlerter.debug then | 			if Heimdall_Data.config.combatAlerter.debug then | ||||||
| 				print( | 				print(string.format("[%s] Source is tracked stinky: %s (Already alerted: %s)", ModuleName, source, | ||||||
| 					string.format( | 					tostring(alerted[source] or false))) | ||||||
| 						"[%s] Source is tracked stinky: %s (Already alerted: %s)", |  | ||||||
| 						ModuleName, |  | ||||||
| 						source, |  | ||||||
| 						tostring(alerted[source] or false) |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if alerted[source] then return end | 			if alerted[source] then return end | ||||||
|  |  | ||||||
| @@ -71,16 +63,8 @@ function shared.CombatAlerter.Init() | |||||||
| 			local zone, subZone = GetZoneText(), GetSubZoneText() | 			local zone, subZone = GetZoneText(), GetSubZoneText() | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.combatAlerter.debug then | 			if Heimdall_Data.config.combatAlerter.debug then | ||||||
| 				print( | 				print(string.format("[%s] Player location: %s/%s at %.2f,%.2f", ModuleName, zone, subZone, x * 100, | ||||||
| 					string.format( | 					y * 100)) | ||||||
| 						"[%s] Player location: %s/%s at %.2f,%.2f", |  | ||||||
| 						ModuleName, |  | ||||||
| 						zone, |  | ||||||
| 						subZone, |  | ||||||
| 						x * 100, |  | ||||||
| 						y * 100 |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			SetMapToCurrentZone() | 			SetMapToCurrentZone() | ||||||
| @@ -89,14 +73,11 @@ function shared.CombatAlerter.Init() | |||||||
|  |  | ||||||
| 			for _, channel in pairs(Heimdall_Data.config.combatAlerter.channels) do | 			for _, channel in pairs(Heimdall_Data.config.combatAlerter.channels) do | ||||||
| 				local locale = shared.GetLocaleForChannel(channel) | 				local locale = shared.GetLocaleForChannel(channel) | ||||||
| 				local text = string.format( | 				local text = string.format(shared._L("combatAlerterInCombat", locale), | ||||||
| 					shared._L("combatAlerterInCombat", locale), |  | ||||||
| 					source, | 					source, | ||||||
| 					shared._L("zone", locale), | 					shared._L("zone", locale), shared._L("subZone", locale), | ||||||
| 					shared._L("subZone", locale), |  | ||||||
| 					tostring(areaId), | 					tostring(areaId), | ||||||
| 					x * 100, | 					x * 100, y * 100 | ||||||
| 					y * 100 |  | ||||||
| 				) | 				) | ||||||
| 				---@type Message | 				---@type Message | ||||||
| 				local msg = { | 				local msg = { | ||||||
| @@ -130,6 +111,8 @@ function shared.CombatAlerter.Init() | |||||||
| 		alerted = {} | 		alerted = {} | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.combatAlerter.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.combatAlerter.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] CombatAlerter loaded") | 	print("[Heimdall] CombatAlerter loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Commander" | local ModuleName = "Commander" | ||||||
|  |  | ||||||
| local helpMessages = { | local helpMessages = { | ||||||
| @@ -28,7 +29,7 @@ local helpMessages = { | |||||||
| 		"9) note <name> i..j - lists notes from i to j for the character.", | 		"9) note <name> i..j - lists notes from i to j for the character.", | ||||||
| 		"10) note <name> delete i - deletes the i-th note for the character.", | 		"10) note <name> delete i - deletes the i-th note for the character.", | ||||||
| 		"11) note <name> delete i..j - deletes notes from i to j for the character.", | 		"11) note <name> delete i..j - deletes notes from i to j for the character.", | ||||||
| 	}, | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -50,12 +51,16 @@ function shared.Commander.Init() | |||||||
| 			if #currentChunk + #word + 1 <= size then | 			if #currentChunk + #word + 1 <= size then | ||||||
| 				currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word) | 				currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word) | ||||||
| 			else | 			else | ||||||
| 				if #currentChunk > 0 then ret[#ret + 1] = currentChunk end | 				if #currentChunk > 0 then | ||||||
|  | 					ret[#ret + 1] = currentChunk | ||||||
|  | 				end | ||||||
| 				currentChunk = word | 				currentChunk = word | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if #currentChunk > 0 then ret[#ret + 1] = currentChunk end | 		if #currentChunk > 0 then | ||||||
|  | 			ret[#ret + 1] = currentChunk | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 		return ret | 		return ret | ||||||
| 	end | 	end | ||||||
| @@ -64,7 +69,9 @@ function shared.Commander.Init() | |||||||
| 	local function Count(arr) | 	local function Count(arr) | ||||||
| 		local ret = {} | 		local ret = {} | ||||||
| 		for _, player in pairs(arr) do | 		for _, player in pairs(arr) do | ||||||
| 			if shared.Whoer.ShouldNotifyForZone(player.zone) then ret[player.zone] = (ret[player.zone] or 0) + 1 end | 			if shared.Whoer.ShouldNotifyForZone(player.zone) then | ||||||
|  | 				ret[player.zone] = (ret[player.zone] or 0) + 1 | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 		local text = {} | 		local text = {} | ||||||
| 		for zone, count in pairs(ret) do | 		for zone, count in pairs(ret) do | ||||||
| @@ -77,7 +84,6 @@ function shared.Commander.Init() | |||||||
| 	local function CountPartitioned(arr) | 	local function CountPartitioned(arr) | ||||||
| 		local count = Count(arr) | 		local count = Count(arr) | ||||||
| 		local text = {} | 		local text = {} | ||||||
| 		---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack |  | ||||||
| 		for _, line in pairs(Partition(strjoin(", ", unpack(count)), 200)) do | 		for _, line in pairs(Partition(strjoin(", ", unpack(count)), 200)) do | ||||||
| 			text[#text + 1] = line | 			text[#text + 1] = line | ||||||
| 		end | 		end | ||||||
| @@ -89,13 +95,8 @@ function shared.Commander.Init() | |||||||
| 		local ret = {} | 		local ret = {} | ||||||
| 		for _, player in pairs(arr) do | 		for _, player in pairs(arr) do | ||||||
| 			if shared.Whoer.ShouldNotifyForZone(player.zone) then | 			if shared.Whoer.ShouldNotifyForZone(player.zone) then | ||||||
| 				ret[#ret + 1] = string.format( | 				ret[#ret + 1] = string.format("%s/%s (%s) %s", player.name, player.class, player.zone, | ||||||
| 					"%s/%s (%s) %s", | 					player.stinky and "(!!!!)" or "") | ||||||
| 					player.name, |  | ||||||
| 					player.class, |  | ||||||
| 					player.zone, |  | ||||||
| 					player.stinky and "(!!!!)" or "" |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then | ||||||
| @@ -108,7 +109,6 @@ function shared.Commander.Init() | |||||||
| 	local function WhoPartitioned(arr) | 	local function WhoPartitioned(arr) | ||||||
| 		local who = Who(arr) | 		local who = Who(arr) | ||||||
| 		local text = {} | 		local text = {} | ||||||
| 		---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack |  | ||||||
| 		for _, line in pairs(Partition(strjoin(", ", unpack(who)), 200)) do | 		for _, line in pairs(Partition(strjoin(", ", unpack(who)), 200)) do | ||||||
| 			text[#text + 1] = "who: " .. line | 			text[#text + 1] = "who: " .. line | ||||||
| 		end | 		end | ||||||
| @@ -119,7 +119,9 @@ function shared.Commander.Init() | |||||||
| 	local function CountClass(arr) | 	local function CountClass(arr) | ||||||
| 		local ret = {} | 		local ret = {} | ||||||
| 		for _, player in pairs(arr) do | 		for _, player in pairs(arr) do | ||||||
| 			if shared.Whoer.ShouldNotifyForZone(player.zone) then ret[player.class] = (ret[player.class] or 0) + 1 end | 			if shared.Whoer.ShouldNotifyForZone(player.zone) then | ||||||
|  | 				ret[player.class] = (ret[player.class] or 0) + 1 | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 		local text = {} | 		local text = {} | ||||||
| 		for class, count in pairs(ret) do | 		for class, count in pairs(ret) do | ||||||
| @@ -135,7 +137,6 @@ function shared.Commander.Init() | |||||||
| 	local function CountClassPartitioned(arr) | 	local function CountClassPartitioned(arr) | ||||||
| 		local countClass = CountClass(arr) | 		local countClass = CountClass(arr) | ||||||
| 		local text = {} | 		local text = {} | ||||||
| 		---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack |  | ||||||
| 		for _, line in pairs(Partition(strjoin(", ", unpack(countClass)), 200)) do | 		for _, line in pairs(Partition(strjoin(", ", unpack(countClass)), 200)) do | ||||||
| 			text[#text + 1] = line | 			text[#text + 1] = line | ||||||
| 		end | 		end | ||||||
| @@ -143,27 +144,36 @@ function shared.Commander.Init() | |||||||
| 	end | 	end | ||||||
| 	local function CountClassPartitionedStinkies() | 	local function CountClassPartitionedStinkies() | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then | ||||||
| 			print(string.format("[%s] Executing: CountClassPartitionedStinkies", ModuleName)) | 			print(string.format("[%s] Executing: CountClassPartitionedStinkies", | ||||||
|  | 				ModuleName)) | ||||||
| 		end | 		end | ||||||
| 		local res = CountClassPartitioned(HeimdallStinkies) | 		local res = CountClassPartitioned(HeimdallStinkies) | ||||||
| 		if #res == 0 then return { "No stinkies found" } end | 		if #res == 0 then | ||||||
|  | 			return { "No stinkies found" } | ||||||
|  | 		end | ||||||
| 		return res | 		return res | ||||||
| 	end | 	end | ||||||
| 	local function WhoPartitionedStinkies() | 	local function WhoPartitionedStinkies() | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then | ||||||
| 			print(string.format("[%s] Executing: WhoPartitionedStinkies", ModuleName)) | 			print(string.format("[%s] Executing: WhoPartitionedStinkies", | ||||||
|  | 				ModuleName)) | ||||||
| 			shared.dumpTable(HeimdallStinkies) | 			shared.dumpTable(HeimdallStinkies) | ||||||
| 		end | 		end | ||||||
| 		local res = WhoPartitioned(HeimdallStinkies) | 		local res = WhoPartitioned(HeimdallStinkies) | ||||||
| 		if #res == 0 then return { "No stinkies found" } end | 		if #res == 0 then | ||||||
|  | 			return { "No stinkies found" } | ||||||
|  | 		end | ||||||
| 		return res | 		return res | ||||||
| 	end | 	end | ||||||
| 	local function CountPartitionedStinkies() | 	local function CountPartitionedStinkies() | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then | ||||||
| 			print(string.format("[%s] Executing: CountPartitionedStinkies", ModuleName)) | 			print(string.format("[%s] Executing: CountPartitionedStinkies", | ||||||
|  | 				ModuleName)) | ||||||
| 		end | 		end | ||||||
| 		local res = CountPartitioned(HeimdallStinkies) | 		local res = CountPartitioned(HeimdallStinkies) | ||||||
| 		if #res == 0 then return { "No stinkies found" } end | 		if #res == 0 then | ||||||
|  | 			return { "No stinkies found" } | ||||||
|  | 		end | ||||||
| 		return res | 		return res | ||||||
| 	end | 	end | ||||||
| 	local function HelpRu() | 	local function HelpRu() | ||||||
| @@ -180,32 +190,26 @@ function shared.Commander.Init() | |||||||
| 		AcceptGroup() | 		AcceptGroup() | ||||||
| 		groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST") | 		groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST") | ||||||
| 		C_Timer.NewTimer(0.1, function() | 		C_Timer.NewTimer(0.1, function() | ||||||
| 			if Heimdall_Data.config.commander.debug then | 			if Heimdall_Data.config.commander.debug then print(string.format("[%s] Click event triggered", ModuleName)) end | ||||||
| 				print(string.format("[%s] Click event triggered", ModuleName)) |  | ||||||
| 			end |  | ||||||
| 			_G["StaticPopup1Button1"]:Click() | 			_G["StaticPopup1Button1"]:Click() | ||||||
| 		end, 1) | 		end, 1) | ||||||
| 	end) | 	end) | ||||||
| 	local function JoinGroup() | 	local function JoinGroup() | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then print(string.format("[%s] JoinGroup command received", ModuleName)) end | ||||||
| 			print(string.format("[%s] JoinGroup command received", ModuleName)) |  | ||||||
| 		end |  | ||||||
| 		groupInviteFrame:RegisterEvent("PARTY_INVITE_REQUEST") | 		groupInviteFrame:RegisterEvent("PARTY_INVITE_REQUEST") | ||||||
| 		C_Timer.NewTimer(10, function() groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST") end, 1) | 		C_Timer.NewTimer(10, function() | ||||||
|  | 			groupInviteFrame:UnregisterEvent("PARTY_INVITE_REQUEST") | ||||||
|  | 		end, 1) | ||||||
| 		return { "+" } | 		return { "+" } | ||||||
| 	end | 	end | ||||||
| 	local function LeaveGroup() | 	local function LeaveGroup() | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then print(string.format("[%s] LeaveGroup command received", ModuleName)) end | ||||||
| 			print(string.format("[%s] LeaveGroup command received", ModuleName)) |  | ||||||
| 		end |  | ||||||
| 		LeaveParty() | 		LeaveParty() | ||||||
| 		return {} | 		return {} | ||||||
| 	end | 	end | ||||||
| 	---@param target string | 	---@param target string | ||||||
| 	local function FollowTarget(target) | 	local function FollowTarget(target) | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then print(string.format("[%s] Following target: %s", ModuleName, target)) end | ||||||
| 			print(string.format("[%s] Following target: %s", ModuleName, target)) |  | ||||||
| 		end |  | ||||||
| 		if not target then return end | 		if not target then return end | ||||||
| 		FollowUnit(target) | 		FollowUnit(target) | ||||||
| 		return {} | 		return {} | ||||||
| @@ -214,13 +218,14 @@ function shared.Commander.Init() | |||||||
| 	---@param args string[] | 	---@param args string[] | ||||||
| 	local function MacroTarget(args) | 	local function MacroTarget(args) | ||||||
| 		if Heimdall_Data.config.commander.debug then | 		if Heimdall_Data.config.commander.debug then | ||||||
| 			---@diagnostic disable-next-line: param-type-mismatch something wrong with luals, it's picking up the "wrong" unpack | 			print(string.format("[%s] Macroing: %s", ModuleName, | ||||||
| 			print(string.format("[%s] Macroing: %s", ModuleName, strjoin(" ", unpack(args)))) | 				strjoin(" ", unpack(args)))) | ||||||
| 		end | 		end | ||||||
| 		if #args < 2 or #args % 2 ~= 0 then | 		if #args < 2 or #args % 2 ~= 0 then | ||||||
| 			if #args < 2 or #args % 2 ~= 0 then | 			if #args < 2 or #args % 2 ~= 0 then | ||||||
| 				if Heimdall_Data.config.commander.debug then | 				if Heimdall_Data.config.commander.debug then | ||||||
| 					print(string.format("[%s] Invalid number of arguments for MacroTarget", ModuleName)) | 					print(string.format( | ||||||
|  | 						"[%s] Invalid number of arguments for MacroTarget", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 				return {} | 				return {} | ||||||
| 			end | 			end | ||||||
| @@ -238,7 +243,7 @@ function shared.Commander.Init() | |||||||
| 				name = name, | 				name = name, | ||||||
| 				class = class or "unknown", | 				class = class or "unknown", | ||||||
| 				seenAt = GetTime(), | 				seenAt = GetTime(), | ||||||
| 				hostile = true, | 				hostile = true | ||||||
| 			} | 			} | ||||||
| 		end | 		end | ||||||
| 		return {} | 		return {} | ||||||
| @@ -250,15 +255,15 @@ function shared.Commander.Init() | |||||||
| 	---@field callback fun(...: any): string[] | 	---@field callback fun(...: any): string[] | ||||||
|  |  | ||||||
| 	local commands = { | 	local commands = { | ||||||
| 		{ keywordRe = "^who$", commanderOnly = false, callback = WhoPartitionedStinkies }, | 		{ keywordRe = "^who$",        commanderOnly = false, callback = WhoPartitionedStinkies }, | ||||||
| 		{ keywordRe = "^howmany$", commanderOnly = false, callback = CountPartitionedStinkies }, | 		{ keywordRe = "^howmany$",    commanderOnly = false, callback = CountPartitionedStinkies }, | ||||||
| 		{ keywordRe = "^classes$", commanderOnly = false, callback = CountClassPartitionedStinkies }, | 		{ keywordRe = "^classes$",    commanderOnly = false, callback = CountClassPartitionedStinkies }, | ||||||
| 		{ keywordRe = "^help$", commanderOnly = false, callback = HelpRu }, | 		{ keywordRe = "^help$",       commanderOnly = false, callback = HelpRu }, | ||||||
| 		{ keywordRe = "^helpen$", commanderOnly = false, callback = HelpEn }, | 		{ keywordRe = "^helpen$",     commanderOnly = false, callback = HelpEn }, | ||||||
| 		{ keywordRe = "^joingroup$", commanderOnly = false, callback = JoinGroup }, | 		{ keywordRe = "^joingroup$",  commanderOnly = false, callback = JoinGroup }, | ||||||
| 		{ keywordRe = "^leavegroup$", commanderOnly = false, callback = LeaveGroup }, | 		{ keywordRe = "^leavegroup$", commanderOnly = false, callback = LeaveGroup }, | ||||||
| 		{ keywordRe = "^follow$", commanderOnly = false, callback = FollowTarget }, | 		{ keywordRe = "^follow$",     commanderOnly = false, callback = FollowTarget }, | ||||||
| 		{ keywordRe = "^macro", commanderOnly = false, callback = MacroTarget }, | 		{ keywordRe = "^macro",       commanderOnly = false, callback = MacroTarget }, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	local commanderChannelFrame = CreateFrame("Frame") | 	local commanderChannelFrame = CreateFrame("Frame") | ||||||
| @@ -285,14 +290,8 @@ function shared.Commander.Init() | |||||||
| 		end | 		end | ||||||
| 		if not ok then | 		if not ok then | ||||||
| 			if Heimdall_Data.config.commander.debug then | 			if Heimdall_Data.config.commander.debug then | ||||||
| 				print( | 				print(string.format("[%s] Channel name '%s' does not match any of the channels '%s'", ModuleName, | ||||||
| 					string.format( | 					channelname, table.concat(Heimdall_Data.config.commander.channels, ", "))) | ||||||
| 						"[%s] Channel name '%s' does not match any of the channels '%s'", |  | ||||||
| 						ModuleName, |  | ||||||
| 						channelname, |  | ||||||
| 						table.concat(Heimdall_Data.config.commander.channels, ", ") |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -308,33 +307,28 @@ function shared.Commander.Init() | |||||||
| 			if Heimdall_Data.config.commander.debug then | 			if Heimdall_Data.config.commander.debug then | ||||||
| 				print(string.format("[%s] Command match: %s = %s", ModuleName, command.keywordRe, tostring(enabled))) | 				print(string.format("[%s] Command match: %s = %s", ModuleName, command.keywordRe, tostring(enabled))) | ||||||
| 			end | 			end | ||||||
| 			if | 			if enabled and | ||||||
| 				enabled | 				(not command.commanderOnly | ||||||
| 				and ( | 					or (command.commanderOnly | ||||||
| 					not command.commanderOnly | 						and sender == Heimdall_Data.config.commander.commander)) then | ||||||
| 					or (command.commanderOnly and sender == Heimdall_Data.config.commander.commander) |  | ||||||
| 				) |  | ||||||
| 			then |  | ||||||
| 				if msg:match(command.keywordRe) then | 				if msg:match(command.keywordRe) then | ||||||
| 					---@diagnostic disable-next-line: redundant-parameter Currently luals does not support variadic functions as a @field |  | ||||||
| 					local messages = command.callback({ strsplit(",", msg) }) | 					local messages = command.callback({ strsplit(",", msg) }) | ||||||
| 					if Heimdall_Data.config.commander.debug then | 					if Heimdall_Data.config.commander.debug then | ||||||
| 						---@diagnostic disable-next-line: param-type-mismatch |  | ||||||
| 						print(string.format("[%s] Messages to send: %s", ModuleName, strjoin(", ", unpack(messages)))) | 						print(string.format("[%s] Messages to send: %s", ModuleName, strjoin(", ", unpack(messages)))) | ||||||
| 					end | 					end | ||||||
| 					for _, message in ipairs(messages) do | 					for _, message in ipairs(messages) do | ||||||
| 						---@type Message | 						---@type Message | ||||||
| 						local returnmsg = { | 						local msg = { | ||||||
| 							channel = "C", | 							channel = "C", | ||||||
| 							data = channelname, | 							data = channelname, | ||||||
| 							message = message, | 							message = message | ||||||
| 						} | 						} | ||||||
| 						if Heimdall_Data.config.commander.debug then | 						if Heimdall_Data.config.commander.debug then | ||||||
| 							print(string.format("[%s] Queuing message", ModuleName)) | 							print(string.format("[%s] Queuing message", ModuleName)) | ||||||
| 							shared.dumpTable(msg) | 							shared.dumpTable(msg) | ||||||
| 						end | 						end | ||||||
| 						--table.insert(shared.messenger.queue, msg) | 						--table.insert(shared.messenger.queue, msg) | ||||||
| 						table.insert(shared.networkMessenger.queue, returnmsg) | 						table.insert(shared.networkMessenger.queue, msg) | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
|   | |||||||
							
								
								
									
										4673
									
								
								Modules/Config.lua
									
									
									
									
									
								
							
							
						
						
									
										4673
									
								
								Modules/Config.lua
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,7 +1,10 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Configurator" | local ModuleName = "Configurator" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Configurator = {} | shared.Configurator = {} | ||||||
| function shared.Configurator.Init() print(string.format("[Heimdall] %s module loaded", ModuleName)) end | function shared.Configurator.Init() | ||||||
|  | 	print("[Heimdall] Configurator module loaded") | ||||||
|  | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "DeathReporter" | local ModuleName = "DeathReporter" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -15,15 +16,8 @@ function shared.DeathReporter.Init() | |||||||
| 	---@param spellName string | 	---@param spellName string | ||||||
| 	local function RegisterDeath(source, destination, spellName) | 	local function RegisterDeath(source, destination, spellName) | ||||||
| 		if Heimdall_Data.config.deathReporter.debug then | 		if Heimdall_Data.config.deathReporter.debug then | ||||||
| 			print( | 			print(string.format("[%s] Processing death event - Source: %s, Target: %s, Spell: %s", | ||||||
| 				string.format( | 				ModuleName, source, destination, spellName)) | ||||||
| 					"[%s] Processing death event - Source: %s, Target: %s, Spell: %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					source, |  | ||||||
| 					destination, |  | ||||||
| 					spellName |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not Heimdall_Data.config.deathReporter.enabled then | 		if not Heimdall_Data.config.deathReporter.enabled then | ||||||
| @@ -33,52 +27,27 @@ function shared.DeathReporter.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if | 		if recentDeaths[destination] and GetTime() - recentDeaths[destination] < Heimdall_Data.config.deathReporter.throttle then | ||||||
| 			recentDeaths[destination] |  | ||||||
| 			and GetTime() - recentDeaths[destination] < Heimdall_Data.config.deathReporter.throttle |  | ||||||
| 		then |  | ||||||
| 			if Heimdall_Data.config.deathReporter.debug then | 			if Heimdall_Data.config.deathReporter.debug then | ||||||
| 				local timeLeft = Heimdall_Data.config.deathReporter.throttle - (GetTime() - recentDeaths[destination]) | 				local timeLeft = Heimdall_Data.config.deathReporter.throttle - (GetTime() - recentDeaths[destination]) | ||||||
| 				print( | 				print(string.format("[%s] Death report throttled for %s (%.1f seconds remaining)", | ||||||
| 					string.format( | 					ModuleName, destination, timeLeft)) | ||||||
| 						"[%s] Death report throttled for %s (%.1f seconds remaining)", |  | ||||||
| 						ModuleName, |  | ||||||
| 						destination, |  | ||||||
| 						timeLeft |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if | 		if recentDuels[destination] and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle then | ||||||
| 			recentDuels[destination] |  | ||||||
| 			and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle |  | ||||||
| 		then |  | ||||||
| 			if Heimdall_Data.config.deathReporter.debug then | 			if Heimdall_Data.config.deathReporter.debug then | ||||||
| 				print( | 				print(string.format("[%s] Ignoring death report - Recent duel detected for target: %s", ModuleName, | ||||||
| 					string.format( | 					destination)) | ||||||
| 						"[%s] Ignoring death report - Recent duel detected for target: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						destination |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if | 		if recentDuels[source] and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle then | ||||||
| 			recentDuels[source] |  | ||||||
| 			and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle |  | ||||||
| 		then |  | ||||||
| 			if Heimdall_Data.config.deathReporter.debug then | 			if Heimdall_Data.config.deathReporter.debug then | ||||||
| 				print( | 				print(string.format("[%s] Ignoring death report - Recent duel detected for source: %s", ModuleName, | ||||||
| 					string.format( | 					source)) | ||||||
| 						"[%s] Ignoring death report - Recent duel detected for source: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						source |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -89,48 +58,25 @@ function shared.DeathReporter.Init() | |||||||
| 		recentDeaths[destination] = GetTime() | 		recentDeaths[destination] = GetTime() | ||||||
|  |  | ||||||
| 		C_Timer.NewTimer(3, function() | 		C_Timer.NewTimer(3, function() | ||||||
| 			if | 			if recentDuels[destination] and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle then | ||||||
| 				recentDuels[destination] |  | ||||||
| 				and GetTime() - recentDuels[destination] < Heimdall_Data.config.deathReporter.duelThrottle |  | ||||||
| 			then |  | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print( | 					print(string.format("[%s] Cancelling delayed death report - Recent duel detected for: %s", ModuleName, | ||||||
| 						string.format( | 						destination)) | ||||||
| 							"[%s] Cancelling delayed death report - Recent duel detected for: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							destination |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if | 			if recentDuels[source] and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle then | ||||||
| 				recentDuels[source] |  | ||||||
| 				and GetTime() - recentDuels[source] < Heimdall_Data.config.deathReporter.duelThrottle |  | ||||||
| 			then |  | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print( | 					print(string.format("[%s] Cancelling delayed death report - Recent duel detected for: %s", ModuleName, | ||||||
| 						string.format( | 						source)) | ||||||
| 							"[%s] Cancelling delayed death report - Recent duel detected for: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							source |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.deathReporter.debug then | 			if Heimdall_Data.config.deathReporter.debug then | ||||||
| 				print( | 				print(string.format("[%s] Sending death report - %s killed %s with %s", | ||||||
| 					string.format( | 					ModuleName, source, destination, spellName)) | ||||||
| 						"[%s] Sending death report - %s killed %s with %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						source, |  | ||||||
| 						destination, |  | ||||||
| 						spellName |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			local zone, subzone = GetZoneText() or "Unknown", GetSubZoneText() or "Unknown" | 			local zone, subzone = GetZoneText() or "Unknown", GetSubZoneText() or "Unknown" | ||||||
| @@ -149,22 +95,18 @@ function shared.DeathReporter.Init() | |||||||
|  |  | ||||||
| 			for _, channel in pairs(Heimdall_Data.config.deathReporter.channels) do | 			for _, channel in pairs(Heimdall_Data.config.deathReporter.channels) do | ||||||
| 				local locale = shared.GetLocaleForChannel(channel) | 				local locale = shared.GetLocaleForChannel(channel) | ||||||
| 				local text = string.format( | 				local text = string.format(shared._L("killed", locale), | ||||||
| 					shared._L("killed", locale), |  | ||||||
| 					source, | 					source, | ||||||
| 					destination, | 					destination, | ||||||
| 					shared._L(spellName, locale), | 					shared._L(spellName, locale), | ||||||
| 					shared._L(zone, locale), | 					shared._L(zone, locale), shared._L(subzone, locale), | ||||||
| 					shared._L(subzone, locale), |  | ||||||
| 					zoneId, | 					zoneId, | ||||||
| 					x * 100, | 					x * 100, y * 100) | ||||||
| 					y * 100 |  | ||||||
| 				) |  | ||||||
| 				---@type Message | 				---@type Message | ||||||
| 				local msg = { | 				local msg = { | ||||||
| 					channel = "C", | 					channel = "C", | ||||||
| 					data = channel, | 					data = channel, | ||||||
| 					message = text, | 					message = text | ||||||
| 				} | 				} | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print(string.format("[%s] Queuing death report message", ModuleName)) | 					print(string.format("[%s] Queuing death report message", ModuleName)) | ||||||
| @@ -182,33 +124,32 @@ function shared.DeathReporter.Init() | |||||||
| 		--			print(string.format("[%s] Received combat log event", ModuleName)) | 		--			print(string.format("[%s] Received combat log event", ModuleName)) | ||||||
| 		--		end | 		--		end | ||||||
| 		if not Heimdall_Data.config.deathReporter.enabled then return end | 		if not Heimdall_Data.config.deathReporter.enabled then return end | ||||||
| 		local overkill, source, destination, spellName, sourceGUID, destinationGUID, err | 		local overkill, err = CLEUParser.GetOverkill(...) | ||||||
| 		overkill, err = CLEUParser.GetOverkill(...) |  | ||||||
| 		if not err and overkill > 0 then | 		if not err and overkill > 0 then | ||||||
| 			source, err = CLEUParser.GetSourceName(...) | 			local source, err = CLEUParser.GetSourceName(...) | ||||||
| 			if err then | 			if err then | ||||||
| 				source = "unknown" | 				source = "unknown" | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print(string.format("[%s] Error getting source name", ModuleName)) | 					print(string.format("[%s] Error getting source name", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 			destination, err = CLEUParser.GetDestName(...) | 			local destination, err = CLEUParser.GetDestName(...) | ||||||
| 			if err then | 			if err then | ||||||
| 				destination = "unknown" | 				destination = "unknown" | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print(string.format("[%s] Error getting destination name", ModuleName)) | 					print(string.format("[%s] Error getting destination name", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 			spellName, err = CLEUParser.GetSpellName(...) | 			local spellName, err = CLEUParser.GetSpellName(...) | ||||||
| 			if err then | 			if err then | ||||||
| 				spellName = "unknown" | 				spellName = "unknown" | ||||||
| 				if Heimdall_Data.config.deathReporter.debug then | 				if Heimdall_Data.config.deathReporter.debug then | ||||||
| 					print(string.format("[%s] Error getting spell name", ModuleName)) | 					print(string.format("[%s] Error getting spell name", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 			sourceGUID, err = CLEUParser.GetSourceGUID(...) | 			local sourceGUID, err = CLEUParser.GetSourceGUID(...) | ||||||
| 			if err or not string.match(sourceGUID, "Player") then return end | 			if err or not string.match(sourceGUID, "Player") then return end | ||||||
| 			destinationGUID, err = CLEUParser.GetDestGUID(...) | 			local destinationGUID, err = CLEUParser.GetDestGUID(...) | ||||||
| 			if err or not string.match(destinationGUID, "Player") then return end | 			if err or not string.match(destinationGUID, "Player") then return end | ||||||
| 			RegisterDeath(source, destination, spellName) | 			RegisterDeath(source, destination, spellName) | ||||||
| 		end | 		end | ||||||
| @@ -221,9 +162,7 @@ function shared.DeathReporter.Init() | |||||||
| 		local source, destination = string.match(msg, "([^ ]+) has defeated ([^ ]+) in a duel") | 		local source, destination = string.match(msg, "([^ ]+) has defeated ([^ ]+) in a duel") | ||||||
| 		if Heimdall_Data.config.deathReporter.debug then | 		if Heimdall_Data.config.deathReporter.debug then | ||||||
| 			print(string.format("[%s] Received system message: %s", ModuleName, msg)) | 			print(string.format("[%s] Received system message: %s", ModuleName, msg)) | ||||||
| 			print( | 			print(string.format("[%s] Source: %s, Destination: %s", ModuleName, tostring(source), tostring(destination))) | ||||||
| 				string.format("[%s] Source: %s, Destination: %s", ModuleName, tostring(source), tostring(destination)) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
| 		if not source or not destination then return end | 		if not source or not destination then return end | ||||||
| 		source = string.match(source, "([^-]+)") | 		source = string.match(source, "([^-]+)") | ||||||
| @@ -239,14 +178,8 @@ function shared.DeathReporter.Init() | |||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.deathReporter.debug then | 	if Heimdall_Data.config.deathReporter.debug then | ||||||
| 		print( | 		print(string.format("[%s] Module initialized with throttle: %.1fs, duel throttle: %.1fs", | ||||||
| 			string.format( | 			ModuleName, Heimdall_Data.config.deathReporter.throttle, Heimdall_Data.config.deathReporter.duelThrottle)) | ||||||
| 				"[%s] Module initialized with throttle: %.1fs, duel throttle: %.1fs", |  | ||||||
| 				ModuleName, |  | ||||||
| 				Heimdall_Data.config.deathReporter.throttle, |  | ||||||
| 				Heimdall_Data.config.deathReporter.duelThrottle |  | ||||||
| 			) |  | ||||||
| 		) |  | ||||||
| 	end | 	end | ||||||
| 	print("[Heimdall] DeathReporter loaded") | 	print("[Heimdall] DeathReporter loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Dueler" | local ModuleName = "Dueler" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -43,13 +44,8 @@ function shared.Dueler.Init() | |||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.dueler.debug then | 	if Heimdall_Data.config.dueler.debug then | ||||||
| 		print( | 		print(string.format("[%s] Module initialized with auto-decline: %s", ModuleName, | ||||||
| 			string.format( | 			tostring(Heimdall_Data.config.dueler.declineOther))) | ||||||
| 				"[%s] Module initialized with auto-decline: %s", |  | ||||||
| 				ModuleName, |  | ||||||
| 				tostring(Heimdall_Data.config.dueler.declineOther) |  | ||||||
| 			) |  | ||||||
| 		) |  | ||||||
| 	end | 	end | ||||||
| 	print("[Heimdall] Dueler loaded") | 	print("[Heimdall] Dueler loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
|  |  | ||||||
| if not shared.dumpTable then | if not shared.dumpTable then | ||||||
| 	---@param table table | 	---@param table table | ||||||
| @@ -9,13 +10,15 @@ if not shared.dumpTable then | |||||||
| 			print(tostring(table)) | 			print(tostring(table)) | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		if depth == nil then depth = 0 end | 		if depth == nil then | ||||||
| 		if depth > 200 then | 			depth = 0 | ||||||
|  | 		end | ||||||
|  | 		if (depth > 200) then | ||||||
| 			print("Error: Depth > 200 in dumpTable()") | 			print("Error: Depth > 200 in dumpTable()") | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		for k, v in pairs(table) do | 		for k, v in pairs(table) do | ||||||
| 			if type(v) == "table" then | 			if (type(v) == "table") then | ||||||
| 				print(string.rep("  ", depth) .. k .. ":") | 				print(string.rep("  ", depth) .. k .. ":") | ||||||
| 				shared.dumpTable(v, depth + 1) | 				shared.dumpTable(v, depth + 1) | ||||||
| 			else | 			else | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Echoer" | local ModuleName = "Echoer" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -43,16 +44,18 @@ function shared.Echoer.Init() | |||||||
| 			if Heimdall_Data.config.echoer.debug then | 			if Heimdall_Data.config.echoer.debug then | ||||||
| 				print(string.format("[%s] Found echo command in message: %s", ModuleName, msg)) | 				print(string.format("[%s] Found echo command in message: %s", ModuleName, msg)) | ||||||
| 			end | 			end | ||||||
| 			local echomsg = string.sub(msg, string.len(Heimdall_Data.config.echoer.prefix) + 1) | 			local msg = string.sub(msg, string.len(Heimdall_Data.config.echoer.prefix) + 1) | ||||||
| 			if Heimdall_Data.config.echoer.debug then | 			if Heimdall_Data.config.echoer.debug then | ||||||
| 				print(string.format("[%s] Echoing message: %s", ModuleName, echomsg)) | 				print(string.format("[%s] Echoing message: %s", ModuleName, msg)) | ||||||
| 			end | 			end | ||||||
| 			SendChatMessage(echomsg, "SAY") | 			SendChatMessage(msg, "SAY") | ||||||
| 		elseif Heimdall_Data.config.echoer.debug then | 		elseif Heimdall_Data.config.echoer.debug then | ||||||
| 			print(string.format("[%s] Message does not start with echo prefix", ModuleName)) | 			print(string.format("[%s] Message does not start with echo prefix", ModuleName)) | ||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.echoer.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.echoer.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] Echoer loaded") | 	print("[Heimdall] Echoer loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Emoter" | local ModuleName = "Emoter" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -54,6 +55,8 @@ function shared.Emoter.Init() | |||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.emoter.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.emoter.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] Emoter loaded") | 	print("[Heimdall] Emoter loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,14 +1,14 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Inviter" | local ModuleName = "Inviter" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Inviter = {} | shared.Inviter = {} | ||||||
| function shared.Inviter.Init() | function shared.Inviter.Init() | ||||||
| 	-- Fallback for old config |  | ||||||
| 	if type(Heimdall_Data.config.inviter.listeningChannel) == "string" then | 	if type(Heimdall_Data.config.inviter.listeningChannel) == "string" then | ||||||
| 		Heimdall_Data.config.inviter.listeningChannel = { | 		Heimdall_Data.config.inviter.listeningChannel = { | ||||||
| 			[Heimdall_Data.config.inviter.listeningChannel] = true, | 			[Heimdall_Data.config.inviter.listeningChannel] = true | ||||||
| 		} | 		} | ||||||
| 	end | 	end | ||||||
| 	---@type Timer | 	---@type Timer | ||||||
| @@ -36,9 +36,7 @@ function shared.Inviter.Init() | |||||||
| 		if Heimdall_Data.config.inviter.agentsAssist then | 		if Heimdall_Data.config.inviter.agentsAssist then | ||||||
| 			if Heimdall_Data.config.inviter.debug then | 			if Heimdall_Data.config.inviter.debug then | ||||||
| 				local agentCount = 0 | 				local agentCount = 0 | ||||||
| 				for _ in pairs(Heimdall_Data.config.agents) do | 				for _ in pairs(Heimdall_Data.config.agents) do agentCount = agentCount + 1 end | ||||||
| 					agentCount = agentCount + 1 |  | ||||||
| 				end |  | ||||||
| 				print(string.format("[%s] Processing %d agents for assistant promotion", ModuleName, agentCount)) | 				print(string.format("[%s] Processing %d agents for assistant promotion", ModuleName, agentCount)) | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| @@ -102,18 +100,10 @@ function shared.Inviter.Init() | |||||||
| 			local frame = FindPlayerRaidFrame(name) | 			local frame = FindPlayerRaidFrame(name) | ||||||
| 			if frame then | 			if frame then | ||||||
| 				playerButtons[name] = frame | 				playerButtons[name] = frame | ||||||
| 				-- All of these are ELVUI specific so they won't be in our meta... | 				local button = framePool[frame.unit] or CreateFrame("Button", | ||||||
| 				---@diagnostic disable-next-line: undefined-field | 					string.format("HeimdallKickButton%s", frame.unit, frame, "SecureActionButtonTemplate")) | ||||||
| 				local button = framePool[frame.unit] |  | ||||||
| 					or CreateFrame( |  | ||||||
| 						"Button", |  | ||||||
| 						---@diagnostic disable-next-line: undefined-field |  | ||||||
| 						string.format("HeimdallKickButton%s", frame.unit, frame, "SecureActionButtonTemplate") |  | ||||||
| 					) |  | ||||||
| 				---@diagnostic disable-next-line: undefined-field |  | ||||||
| 				framePool[frame.unit] = button | 				framePool[frame.unit] = button | ||||||
|  |  | ||||||
| 				---@diagnostic disable-next-line: undefined-field |  | ||||||
| 				button:SetSize(frame.UNIT_WIDTH / 2, frame.UNIT_HEIGHT / 2) | 				button:SetSize(frame.UNIT_WIDTH / 2, frame.UNIT_HEIGHT / 2) | ||||||
| 				button:SetPoint("CENTER", frame, "CENTER", 0, 0) | 				button:SetPoint("CENTER", frame, "CENTER", 0, 0) | ||||||
| 				button:SetNormalTexture("Interface\\Buttons\\UI-GroupLoot-KickIcon") | 				button:SetNormalTexture("Interface\\Buttons\\UI-GroupLoot-KickIcon") | ||||||
| @@ -152,7 +142,9 @@ function shared.Inviter.Init() | |||||||
| 						groupMembers[name] = now | 						groupMembers[name] = now | ||||||
| 					else | 					else | ||||||
| 						local online = UnitIsConnected(unit) | 						local online = UnitIsConnected(unit) | ||||||
| 						if online then groupMembers[name] = now end | 						if online then | ||||||
|  | 							groupMembers[name] = now | ||||||
|  | 						end | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| @@ -229,7 +221,9 @@ function shared.Inviter.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		if msg == Heimdall_Data.config.inviter.keyword then | 		if msg == Heimdall_Data.config.inviter.keyword then | ||||||
| 			if Heimdall_Data.config.inviter.debug then print(string.format("[%s] Inviting %s", ModuleName, sender)) end | 			if Heimdall_Data.config.inviter.debug then | ||||||
|  | 				print(string.format("[%s] Inviting %s", ModuleName, sender)) | ||||||
|  | 			end | ||||||
| 			InviteUnit(sender) | 			InviteUnit(sender) | ||||||
| 		else | 		else | ||||||
| 			if Heimdall_Data.config.inviter.debug then | 			if Heimdall_Data.config.inviter.debug then | ||||||
| @@ -239,25 +233,17 @@ function shared.Inviter.Init() | |||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.inviter.debug then | 	if Heimdall_Data.config.inviter.debug then | ||||||
| 		print( | 		print(string.format("[%s] Module initialized - All assist: %s, Agents assist: %s", | ||||||
| 			string.format( | 			ModuleName, | ||||||
| 				"[%s] Module initialized - All assist: %s, Agents assist: %s", | 			tostring(Heimdall_Data.config.inviter.allAssist), | ||||||
| 				ModuleName, | 			tostring(Heimdall_Data.config.inviter.agentsAssist))) | ||||||
| 				tostring(Heimdall_Data.config.inviter.allAssist), |  | ||||||
| 				tostring(Heimdall_Data.config.inviter.agentsAssist) |  | ||||||
| 			) |  | ||||||
| 		) |  | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.inviter.debug then | 	if Heimdall_Data.config.inviter.debug then | ||||||
| 		print( | 		print(string.format("[%s] Module initialized - All assist: %s, Agents assist: %s", | ||||||
| 			string.format( | 			ModuleName, | ||||||
| 				"[%s] Module initialized - All assist: %s, Agents assist: %s", | 			tostring(Heimdall_Data.config.inviter.allAssist), | ||||||
| 				ModuleName, | 			tostring(Heimdall_Data.config.inviter.agentsAssist))) | ||||||
| 				tostring(Heimdall_Data.config.inviter.allAssist), |  | ||||||
| 				tostring(Heimdall_Data.config.inviter.agentsAssist) |  | ||||||
| 			) |  | ||||||
| 		) |  | ||||||
| 	end | 	end | ||||||
| 	print("[Heimdall] Inviter loaded") | 	print("[Heimdall] Inviter loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,101 +1,107 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Macroer" | local ModuleName = "Macroer" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Macroer = {} | shared.Macroer = {} | ||||||
| function shared.Macroer.Init() | function shared.Macroer.Init() | ||||||
| 	---@class stinky |     ---@class stinky | ||||||
| 	---@field name string |     ---@field name string | ||||||
| 	---@field class string |     ---@field class string | ||||||
| 	---@field seenAt number |     ---@field seenAt number | ||||||
| 	---@field hostile boolean |     ---@field hostile boolean | ||||||
|  |  | ||||||
| 	local function FindOrCreateMacro(macroName) |     local function FindOrCreateMacro(macroName) | ||||||
| 		if Heimdall_Data.config.macroer.debug then |         if Heimdall_Data.config.macroer.debug then | ||||||
| 			print(string.format("[%s] Finding or creating macro: %s", ModuleName, macroName)) |             print(string.format("[%s] Finding or creating macro: %s", ModuleName, macroName)) | ||||||
| 		end |         end | ||||||
| 		local idx = GetMacroIndexByName(macroName) |         local idx = GetMacroIndexByName(macroName) | ||||||
| 		if idx == 0 then |         if idx == 0 then | ||||||
| 			if Heimdall_Data.config.macroer.debug then |             if Heimdall_Data.config.macroer.debug then | ||||||
| 				print(string.format("[%s] Creating new macro: %s", ModuleName, macroName)) |                 print(string.format("[%s] Creating new macro: %s", ModuleName, macroName)) | ||||||
| 			end |             end | ||||||
| 			CreateMacro(macroName, "INV_Misc_QuestionMark", "") |             CreateMacro(macroName, "INV_Misc_QuestionMark", "") | ||||||
| 		end |         end | ||||||
| 		idx = GetMacroIndexByName(macroName) |         idx = GetMacroIndexByName(macroName) | ||||||
| 		if Heimdall_Data.config.macroer.debug then print(string.format("[%s] Macro index: %d", ModuleName, idx)) end |         if Heimdall_Data.config.macroer.debug then | ||||||
| 		return idx |             print(string.format("[%s] Macro index: %d", ModuleName, idx)) | ||||||
| 	end |         end | ||||||
|  |         return idx | ||||||
|  |     end | ||||||
|  |  | ||||||
| 	---@param stinkies table<string, stinky> |     ---@param stinkies table<string, stinky> | ||||||
| 	local function FixMacro(stinkies) |     local function FixMacro(stinkies) | ||||||
| 		if Heimdall_Data.config.macroer.debug then |         if Heimdall_Data.config.macroer.debug then | ||||||
| 			print(string.format("[%s] Fixing macro with %d stinkies", ModuleName, #stinkies)) |             print(string.format("[%s] Fixing macro with %d stinkies", ModuleName, #stinkies)) | ||||||
| 		end |         end | ||||||
| 		if not Heimdall_Data.config.macroer.enabled then |         if not Heimdall_Data.config.macroer.enabled then | ||||||
| 			if Heimdall_Data.config.macroer.debug then |             if Heimdall_Data.config.macroer.debug then | ||||||
| 				print(string.format("[%s] Module disabled, skipping macro update", ModuleName)) |                 print(string.format("[%s] Module disabled, skipping macro update", ModuleName)) | ||||||
| 			end |             end | ||||||
| 			return |             return | ||||||
| 		end |         end | ||||||
| 		if InCombatLockdown() then |         if InCombatLockdown() then | ||||||
| 			if Heimdall_Data.config.macroer.debug then |             if Heimdall_Data.config.macroer.debug then | ||||||
| 				print(string.format("[%s] In combat, skipping macro update", ModuleName)) |                 print(string.format("[%s] In combat, skipping macro update", ModuleName)) | ||||||
| 			end |             end | ||||||
| 			return |             return | ||||||
| 		end |         end | ||||||
|  |  | ||||||
| 		local priorityMap = {} |         local priorityMap = {} | ||||||
| 		for priority, className in ipairs(Heimdall_Data.config.macroer.priority) do |         for priority, className in ipairs(Heimdall_Data.config.macroer.priority) do | ||||||
| 			priorityMap[className] = priority |             priorityMap[className] = priority | ||||||
| 		end |         end | ||||||
| 		local minPriority = #Heimdall_Data.config.macroer.priority + 1 |         local minPriority = #Heimdall_Data.config.macroer.priority + 1 | ||||||
|  |  | ||||||
| 		local sortedStinkies = {} |         local sortedStinkies = {} | ||||||
| 		for _, stinky in pairs(stinkies) do |         for _, stinky in pairs(stinkies) do | ||||||
| 			if not Heimdall_Data.config.agents[stinky.name] then sortedStinkies[#sortedStinkies + 1] = stinky end |             if not Heimdall_Data.config.agents[stinky.name] then | ||||||
| 		end |                 sortedStinkies[#sortedStinkies + 1] = stinky | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.macroer.debug then |         if Heimdall_Data.config.macroer.debug then | ||||||
| 			print(string.format("[%s] Processing %d non-agent stinkies", ModuleName, #sortedStinkies)) |             print(string.format("[%s] Processing %d non-agent stinkies", ModuleName, #sortedStinkies)) | ||||||
| 		end |         end | ||||||
|  |  | ||||||
| 		table.sort(sortedStinkies, function(a, b) |         table.sort(sortedStinkies, function(a, b) | ||||||
| 			local aPriority = priorityMap[a.class] or minPriority |             local aPriority = priorityMap[a.class] or minPriority | ||||||
| 			local bPriority = priorityMap[b.class] or minPriority |             local bPriority = priorityMap[b.class] or minPriority | ||||||
| 			return aPriority > bPriority |             return aPriority > bPriority | ||||||
| 		end) |         end) | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.macroer.debug then |         if Heimdall_Data.config.macroer.debug then | ||||||
| 			print(string.format("[%s] Sorted stinkies: %d", ModuleName, #sortedStinkies)) |             print(string.format("[%s] Sorted stinkies: %d", ModuleName, #sortedStinkies)) | ||||||
| 			shared.dumpTable(sortedStinkies) |             shared.dumpTable(sortedStinkies) | ||||||
| 		end |         end | ||||||
| 		local lines = { "/targetenemy" } |         local lines = { "/targetenemy" } | ||||||
| 		for _, stinky in pairs(sortedStinkies) do |         for _, stinky in pairs(sortedStinkies) do | ||||||
| 			if stinky.seenAt > GetTime() - 600 then |             if stinky.seenAt > GetTime() - 600 then | ||||||
| 				if Heimdall_Data.config.macroer.debug then |                 if Heimdall_Data.config.macroer.debug then | ||||||
| 					print(string.format("[%s] Adding target macro for: %s", ModuleName, stinky.name)) |                     print(string.format("[%s] Adding target macro for: %s", ModuleName, stinky.name)) | ||||||
| 				end |                 end | ||||||
| 				lines[#lines + 1] = string.format("/tar %s", stinky.name) |                 lines[#lines + 1] = string.format("/tar %s", stinky.name) | ||||||
| 			end |             end | ||||||
| 		end |         end | ||||||
|  |  | ||||||
| 		local idx = FindOrCreateMacro("HeimdallTarget") |         local idx = FindOrCreateMacro("HeimdallTarget") | ||||||
| 		---@diagnostic disable-next-line: param-type-mismatch |         local body = strjoin("\n", unpack(lines)) | ||||||
| 		local body = strjoin("\n", unpack(lines)) |         if Heimdall_Data.config.macroer.debug then | ||||||
| 		if Heimdall_Data.config.macroer.debug then |             print(string.format("[%s] Updating macro with %d lines", ModuleName, #lines)) | ||||||
| 			print(string.format("[%s] Updating macro with %d lines", ModuleName, #lines)) |         end | ||||||
| 		end |         EditMacro(idx, "HeimdallTarget", "INV_Misc_QuestionMark", body) | ||||||
| 		EditMacro(idx, "HeimdallTarget", "INV_Misc_QuestionMark", body) |     end | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	shared.stinkyTracker.stinkies:onChange(function(value) |     shared.stinkyTracker.stinkies:onChange(function(value) | ||||||
| 		if Heimdall_Data.config.macroer.debug then |         if Heimdall_Data.config.macroer.debug then | ||||||
| 			print(string.format("[%s] Stinkies changed, updating macro", ModuleName)) |             print(string.format("[%s] Stinkies changed, updating macro", ModuleName)) | ||||||
| 		end |         end | ||||||
| 		FixMacro(value) |         FixMacro(value) | ||||||
| 	end) |     end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.macroer.debug then print(string.format("[%s] Module initialized", ModuleName)) end |     if Heimdall_Data.config.macroer.debug then | ||||||
| 	print("[Heimdall] Macroer loaded") |         print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  |     end | ||||||
|  |     print("[Heimdall] Macroer loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Messenger" | local ModuleName = "Messenger" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -34,74 +35,45 @@ function shared.Messenger.Init() | |||||||
| 	if not shared.messenger.queue then shared.messenger.queue = {} end | 	if not shared.messenger.queue then shared.messenger.queue = {} end | ||||||
| 	if not shared.messenger.ticker then | 	if not shared.messenger.ticker then | ||||||
| 		local function DoMessage() | 		local function DoMessage() | ||||||
| 			if Heimdall_Data.config.messenger.debug then | 			--if Heimdall_Data.config.messenger.debug then | ||||||
| 				print(string.format("[%s] Processing message queue - Size: %d", ModuleName, #shared.messenger.queue)) | 			--	print(string.format("[%s] Processing message queue", ModuleName)) | ||||||
| 			end | 			--end | ||||||
|  |  | ||||||
| 			if not Heimdall_Data.config.messenger.enabled then | 			if not Heimdall_Data.config.messenger.enabled then | ||||||
| 				if Heimdall_Data.config.messenger.debug then | 				--if Heimdall_Data.config.messenger.debug then | ||||||
| 					print(string.format("[%s] Module disabled, skipping message processing", ModuleName)) | 				--	print(string.format("[%s] Module disabled, skipping message processing", ModuleName)) | ||||||
| 				end | 				--end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local message = shared.messenger.queue[1] | 			local message = shared.messenger.queue[1] | ||||||
| 			if not message then | 			if not message then | ||||||
| 				if Heimdall_Data.config.messenger.debug then | 				--if Heimdall_Data.config.messenger.debug then | ||||||
| 					print(string.format("[%s] Message queue empty", ModuleName)) | 				--	print(string.format("[%s] Message queue empty", ModuleName)) | ||||||
| 				end | 				--end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.messenger.debug then |  | ||||||
| 				print( |  | ||||||
| 					string.format( |  | ||||||
| 						"[%s] Processing message - Channel: %s, Data: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						message.channel or "nil", |  | ||||||
| 						message.data or "nil" |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 				print(string.format("[%s] Message content: %s", ModuleName, message.message or "nil")) |  | ||||||
| 			end |  | ||||||
|  |  | ||||||
| 			if not message.message or message.message == "" then | 			if not message.message or message.message == "" then | ||||||
| 				if Heimdall_Data.config.messenger.debug then | 				if Heimdall_Data.config.messenger.debug then | ||||||
| 					print(string.format("[%s] Invalid message: empty content", ModuleName)) | 					print(string.format("[%s] Invalid message: empty content", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if not message.channel or message.channel == "" then | 			if not message.channel or message.channel == "" then | ||||||
| 				if Heimdall_Data.config.messenger.debug then | 				if Heimdall_Data.config.messenger.debug then | ||||||
| 					print(string.format("[%s] Invalid message: no channel specified", ModuleName)) | 					print(string.format("[%s] Invalid message: no channel specified", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if string.find(message.channel, "^C") then | 			if string.find(message.channel, "^C") then | ||||||
| 				if Heimdall_Data.config.messenger.debug then |  | ||||||
| 					print(string.format("[%s] Converting channel type from C to CHANNEL", ModuleName)) |  | ||||||
| 				end |  | ||||||
| 				message.channel = "CHANNEL" | 				message.channel = "CHANNEL" | ||||||
| 			elseif string.find(message.channel, "^W") then | 			elseif string.find(message.channel, "^W") then | ||||||
| 				if Heimdall_Data.config.messenger.debug then |  | ||||||
| 					print(string.format("[%s] Converting channel type from W to WHISPER", ModuleName)) |  | ||||||
| 				end |  | ||||||
| 				message.channel = "WHISPER" | 				message.channel = "WHISPER" | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if message.channel == "CHANNEL" and message.data and string.match(message.data, "%D") then | 			if message.channel == "CHANNEL" and message.data and string.match(message.data, "%D") then | ||||||
| 				if Heimdall_Data.config.messenger.debug then | 				if Heimdall_Data.config.messenger.debug then | ||||||
| 					print( | 					print(string.format("[%s] Processing channel message: '%s' to '%s'", ModuleName, message.message, | ||||||
| 						string.format( | 						message.data)) | ||||||
| 							"[%s] Processing channel message: '%s' to '%s'", |  | ||||||
| 							ModuleName, |  | ||||||
| 							message.message, |  | ||||||
| 							message.data |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 				local channelId = GetChannelName(message.data) | 				local channelId = GetChannelName(message.data) | ||||||
| 				if channelId == 0 then | 				if channelId == 0 then | ||||||
| @@ -137,15 +109,8 @@ function shared.Messenger.Init() | |||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.messenger.debug then | 			if Heimdall_Data.config.messenger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Sending message: '%s' to %s:%s", ModuleName, message.message, message.channel, | ||||||
| 					string.format( | 					message.data)) | ||||||
| 						"[%s] Sending message: '%s' to %s:%s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						message.message, |  | ||||||
| 						message.channel, |  | ||||||
| 						message.data |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if string.len(message.message) > 255 then | 			if string.len(message.message) > 255 then | ||||||
| 				print(string.format("[%s] Message too long!!!!: %s", ModuleName, message.message)) | 				print(string.format("[%s] Message too long!!!!: %s", ModuleName, message.message)) | ||||||
| @@ -154,9 +119,10 @@ function shared.Messenger.Init() | |||||||
| 			SendChatMessage(message.message, message.channel, nil, message.data) | 			SendChatMessage(message.message, message.channel, nil, message.data) | ||||||
| 		end | 		end | ||||||
| 		local function Tick() | 		local function Tick() | ||||||
| 			if Heimdall_Data.config.messenger.debug then | 			--if Heimdall_Data.config.messenger.debug then | ||||||
| 				print(string.format("[%s] Tick - Queue size: %d", ModuleName, #shared.messenger.queue)) | 			--	local queueSize = #shared.messenger.queue | ||||||
| 			end | 			--	print(string.format("[%s] Queue check - Messages pending: %d", ModuleName, queueSize)) | ||||||
|  | 			--end | ||||||
| 			DoMessage() | 			DoMessage() | ||||||
| 			shared.messenger.ticker = C_Timer.NewTimer(Heimdall_Data.config.messenger.interval, Tick, 1) | 			shared.messenger.ticker = C_Timer.NewTimer(Heimdall_Data.config.messenger.interval, Tick, 1) | ||||||
| 		end | 		end | ||||||
| @@ -164,13 +130,8 @@ function shared.Messenger.Init() | |||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.messenger.debug then | 	if Heimdall_Data.config.messenger.debug then | ||||||
| 		print( | 		print(string.format("[%s] Module initialized with interval: %s", ModuleName, | ||||||
| 			string.format( | 			Heimdall_Data.config.messenger.interval)) | ||||||
| 				"[%s] Module initialized with interval: %s", |  | ||||||
| 				ModuleName, |  | ||||||
| 				Heimdall_Data.config.messenger.interval |  | ||||||
| 			) |  | ||||||
| 		) |  | ||||||
| 	end | 	end | ||||||
| 	print("[Heimdall] Messenger loaded") | 	print("[Heimdall] Messenger loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "MinimapTagger" | local ModuleName = "MinimapTagger" | ||||||
| local HeimdallRoot = "Interface\\AddOns\\Heimdall\\" | local HeimdallRoot = "Interface\\AddOns\\Heimdall\\" | ||||||
| local SoundRoot = HeimdallRoot .. "Sounds\\" | local SoundRoot = HeimdallRoot .. "Sounds\\" | ||||||
| @@ -55,7 +56,7 @@ function shared.MinimapTagger.Init() | |||||||
| 			self:SetAlpha(1) | 			self:SetAlpha(1) | ||||||
| 			self.custom.busy = true | 			self.custom.busy = true | ||||||
| 			self.custom.progress = 0 | 			self.custom.progress = 0 | ||||||
| 			self:SetScript("OnUpdate", function(selff, elapsed) | 			self:SetScript("OnUpdate", function(self, elapsed) | ||||||
| 				self.custom.progress = self.custom.progress + elapsed | 				self.custom.progress = self.custom.progress + elapsed | ||||||
| 				local progress = self.custom.progress / ttl | 				local progress = self.custom.progress / ttl | ||||||
| 				--				if Heimdall_Data.config.minimapTagger.debug then | 				--				if Heimdall_Data.config.minimapTagger.debug then | ||||||
| @@ -88,21 +89,14 @@ function shared.MinimapTagger.Init() | |||||||
| 		table.insert(alertFramePool, frame) | 		table.insert(alertFramePool, frame) | ||||||
| 	end | 	end | ||||||
| 	local muteAlertUntil = 0 | 	local muteAlertUntil = 0 | ||||||
| 	---@param x number|nil | 	---@param x number | ||||||
| 	---@param y number|nil | 	---@param y number | ||||||
| 	---@param scale number? | 	---@param scale number? | ||||||
| 	---@param doTag boolean? | 	---@param doTag boolean? | ||||||
| 	local function PlantAlert(x, y, scale, doTag) | 	local function PlantAlert(x, y, scale, doTag) | ||||||
| 		if x == nil or y == nil then |  | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then |  | ||||||
| 				print(string.format("[%s] Alert position is nil, ignoring", ModuleName)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if doTag == nil then doTag = true end | 		if doTag == nil then doTag = true end | ||||||
| 		local frame = nil | 		local frame = nil | ||||||
| 		for _, alertFrame in ipairs(alertFramePool) do | 		for _, alertFrame in ipairs(alertFramePool) do | ||||||
| 			---@diagnostic disable-next-line: undefined-field |  | ||||||
| 			if not alertFrame.custom.busy then | 			if not alertFrame.custom.busy then | ||||||
| 				frame = alertFrame | 				frame = alertFrame | ||||||
| 				break | 				break | ||||||
| @@ -116,13 +110,8 @@ function shared.MinimapTagger.Init() | |||||||
| 		end | 		end | ||||||
| 		if Heimdall_Data.config.minimapTagger.alertSound then | 		if Heimdall_Data.config.minimapTagger.alertSound then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Playing alert sound: %s", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.minimapTagger.alertSoundFile)) | ||||||
| 						"[%s] Playing alert sound: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.minimapTagger.alertSoundFile |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if muteAlertUntil > GetTime() then | 			if muteAlertUntil > GetTime() then | ||||||
| 				if Heimdall_Data.config.minimapTagger.debug then | 				if Heimdall_Data.config.minimapTagger.debug then | ||||||
| @@ -132,17 +121,14 @@ function shared.MinimapTagger.Init() | |||||||
| 				muteAlertUntil = GetTime() + Heimdall_Data.config.minimapTagger.alertSoundThrottle | 				muteAlertUntil = GetTime() + Heimdall_Data.config.minimapTagger.alertSoundThrottle | ||||||
| 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.alertSoundFile, "Master") | 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.alertSoundFile, "Master") | ||||||
| 				if not ok and Heimdall_Data.config.minimapTagger.debug then | 				if not ok and Heimdall_Data.config.minimapTagger.debug then | ||||||
| 					print( | 					print(string.format("[%s] Failed to play alert sound: %s", ModuleName, | ||||||
| 						string.format( | 						Heimdall_Data.config.minimapTagger.alertSoundFile)) | ||||||
| 							"[%s] Failed to play alert sound: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							Heimdall_Data.config.minimapTagger.alertSoundFile |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.alertTTL) end | 		if doTag then | ||||||
|  | 			PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.alertTTL) | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	--endregion | 	--endregion | ||||||
|  |  | ||||||
| @@ -159,21 +145,14 @@ function shared.MinimapTagger.Init() | |||||||
| 		table.insert(tagFramePool, frame) | 		table.insert(tagFramePool, frame) | ||||||
| 	end | 	end | ||||||
| 	local muteTagUntil = 0 | 	local muteTagUntil = 0 | ||||||
| 	---@param x number|nil | 	---@param x number | ||||||
| 	---@param y number|nil | 	---@param y number | ||||||
| 	---@param scale number? | 	---@param scale number? | ||||||
| 	---@param doTag boolean? | 	---@param doTag boolean? | ||||||
| 	local function PlantTag(x, y, scale, doTag) | 	local function PlantTag(x, y, scale, doTag) | ||||||
| 		if x == nil or y == nil then |  | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then |  | ||||||
| 				print(string.format("[%s] Tag position is nil, ignoring", ModuleName)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if doTag == nil then doTag = true end | 		if doTag == nil then doTag = true end | ||||||
| 		local frame = nil | 		local frame = nil | ||||||
| 		for _, tagFrame in ipairs(tagFramePool) do | 		for _, tagFrame in ipairs(tagFramePool) do | ||||||
| 			---@diagnostic disable-next-line: undefined-field |  | ||||||
| 			if not tagFrame.custom.busy then | 			if not tagFrame.custom.busy then | ||||||
| 				frame = tagFrame | 				frame = tagFrame | ||||||
| 				break | 				break | ||||||
| @@ -187,13 +166,8 @@ function shared.MinimapTagger.Init() | |||||||
| 		end | 		end | ||||||
| 		if Heimdall_Data.config.minimapTagger.tagSound then | 		if Heimdall_Data.config.minimapTagger.tagSound then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Playing tag sound: %s", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.minimapTagger.tagSoundFile)) | ||||||
| 						"[%s] Playing tag sound: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.minimapTagger.tagSoundFile |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if muteTagUntil > GetTime() then | 			if muteTagUntil > GetTime() then | ||||||
| 				if Heimdall_Data.config.minimapTagger.debug then | 				if Heimdall_Data.config.minimapTagger.debug then | ||||||
| @@ -203,17 +177,14 @@ function shared.MinimapTagger.Init() | |||||||
| 				muteTagUntil = GetTime() + Heimdall_Data.config.minimapTagger.tagSoundThrottle | 				muteTagUntil = GetTime() + Heimdall_Data.config.minimapTagger.tagSoundThrottle | ||||||
| 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.tagSoundFile, "Master") | 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.tagSoundFile, "Master") | ||||||
| 				if not ok and Heimdall_Data.config.minimapTagger.debug then | 				if not ok and Heimdall_Data.config.minimapTagger.debug then | ||||||
| 					print( | 					print(string.format("[%s] Failed to play tag sound: %s", ModuleName, | ||||||
| 						string.format( | 						Heimdall_Data.config.minimapTagger.tagSoundFile)) | ||||||
| 							"[%s] Failed to play tag sound: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							Heimdall_Data.config.minimapTagger.tagSoundFile |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.tagTTL) end | 		if doTag then | ||||||
|  | 			PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.tagTTL) | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	--endregion | 	--endregion | ||||||
|  |  | ||||||
| @@ -230,21 +201,14 @@ function shared.MinimapTagger.Init() | |||||||
| 		table.insert(combatFramePool, frame) | 		table.insert(combatFramePool, frame) | ||||||
| 	end | 	end | ||||||
| 	local muteCombatUntil = 0 | 	local muteCombatUntil = 0 | ||||||
| 	---@param x number|nil | 	---@param x number | ||||||
| 	---@param y number|nil | 	---@param y number | ||||||
| 	---@param scale number? | 	---@param scale number? | ||||||
| 	---@param doTag boolean? | 	---@param doTag boolean? | ||||||
| 	local function PlantCombat(x, y, scale, doTag) | 	local function PlantCombat(x, y, scale, doTag) | ||||||
| 		if x == nil or y == nil then |  | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then |  | ||||||
| 				print(string.format("[%s] Combat position is nil, ignoring", ModuleName)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if doTag == nil then doTag = true end | 		if doTag == nil then doTag = true end | ||||||
| 		local frame = nil | 		local frame = nil | ||||||
| 		for _, combatFrame in ipairs(combatFramePool) do | 		for _, combatFrame in ipairs(combatFramePool) do | ||||||
| 			---@diagnostic disable-next-line: undefined-field |  | ||||||
| 			if not combatFrame.custom.busy then | 			if not combatFrame.custom.busy then | ||||||
| 				frame = combatFrame | 				frame = combatFrame | ||||||
| 				break | 				break | ||||||
| @@ -258,13 +222,8 @@ function shared.MinimapTagger.Init() | |||||||
| 		end | 		end | ||||||
| 		if Heimdall_Data.config.minimapTagger.combatSound then | 		if Heimdall_Data.config.minimapTagger.combatSound then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Playing combat sound: %s", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.minimapTagger.combatSoundFile)) | ||||||
| 						"[%s] Playing combat sound: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.minimapTagger.combatSoundFile |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if muteCombatUntil > GetTime() then | 			if muteCombatUntil > GetTime() then | ||||||
| 				if Heimdall_Data.config.minimapTagger.debug then | 				if Heimdall_Data.config.minimapTagger.debug then | ||||||
| @@ -274,17 +233,14 @@ function shared.MinimapTagger.Init() | |||||||
| 				muteCombatUntil = GetTime() + Heimdall_Data.config.minimapTagger.combatSoundThrottle | 				muteCombatUntil = GetTime() + Heimdall_Data.config.minimapTagger.combatSoundThrottle | ||||||
| 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.combatSoundFile, "Master") | 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.combatSoundFile, "Master") | ||||||
| 				if not ok and Heimdall_Data.config.minimapTagger.debug then | 				if not ok and Heimdall_Data.config.minimapTagger.debug then | ||||||
| 					print( | 					print(string.format("[%s] Failed to play combat sound: %s", ModuleName, | ||||||
| 						string.format( | 						Heimdall_Data.config.minimapTagger.combatSoundFile)) | ||||||
| 							"[%s] Failed to play combat sound: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							Heimdall_Data.config.minimapTagger.combatSoundFile |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.combatTTL) end | 		if doTag then | ||||||
|  | 			PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.combatTTL) | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	--endregion | 	--endregion | ||||||
|  |  | ||||||
| @@ -301,21 +257,14 @@ function shared.MinimapTagger.Init() | |||||||
| 		table.insert(helpFramePool, frame) | 		table.insert(helpFramePool, frame) | ||||||
| 	end | 	end | ||||||
| 	local muteHelpUntil = 0 | 	local muteHelpUntil = 0 | ||||||
| 	---@param x number|nil | 	---@param x number | ||||||
| 	---@param y number|nil | 	---@param y number | ||||||
| 	---@param scale number? | 	---@param scale number? | ||||||
| 	---@param doTag boolean? | 	---@param doTag boolean? | ||||||
| 	local function PlantHelp(x, y, scale, doTag) | 	local function PlantHelp(x, y, scale, doTag) | ||||||
| 		if x == nil or y == nil then |  | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then |  | ||||||
| 				print(string.format("[%s] Help position is nil, ignoring", ModuleName)) |  | ||||||
| 			end |  | ||||||
| 			return |  | ||||||
| 		end |  | ||||||
| 		if doTag == nil then doTag = true end | 		if doTag == nil then doTag = true end | ||||||
| 		local frame = nil | 		local frame = nil | ||||||
| 		for _, helpFrame in ipairs(helpFramePool) do | 		for _, helpFrame in ipairs(helpFramePool) do | ||||||
| 			---@diagnostic disable-next-line: undefined-field |  | ||||||
| 			if not helpFrame.custom.busy then | 			if not helpFrame.custom.busy then | ||||||
| 				frame = helpFrame | 				frame = helpFrame | ||||||
| 				break | 				break | ||||||
| @@ -329,13 +278,8 @@ function shared.MinimapTagger.Init() | |||||||
| 		end | 		end | ||||||
| 		if Heimdall_Data.config.minimapTagger.helpSound then | 		if Heimdall_Data.config.minimapTagger.helpSound then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Playing help sound: %s", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.minimapTagger.helpSoundFile)) | ||||||
| 						"[%s] Playing help sound: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.minimapTagger.helpSoundFile |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			if muteHelpUntil > GetTime() then | 			if muteHelpUntil > GetTime() then | ||||||
| 				if Heimdall_Data.config.minimapTagger.debug then | 				if Heimdall_Data.config.minimapTagger.debug then | ||||||
| @@ -345,17 +289,14 @@ function shared.MinimapTagger.Init() | |||||||
| 				muteHelpUntil = GetTime() + Heimdall_Data.config.minimapTagger.helpSoundThrottle | 				muteHelpUntil = GetTime() + Heimdall_Data.config.minimapTagger.helpSoundThrottle | ||||||
| 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.helpSoundFile, "Master") | 				local ok = PlaySoundFile(SoundRoot .. Heimdall_Data.config.minimapTagger.helpSoundFile, "Master") | ||||||
| 				if not ok and Heimdall_Data.config.minimapTagger.debug then | 				if not ok and Heimdall_Data.config.minimapTagger.debug then | ||||||
| 					print( | 					print(string.format("[%s] Failed to play help sound: %s", ModuleName, | ||||||
| 						string.format( | 						Heimdall_Data.config.minimapTagger.helpSoundFile)) | ||||||
| 							"[%s] Failed to play help sound: %s", |  | ||||||
| 							ModuleName, |  | ||||||
| 							Heimdall_Data.config.minimapTagger.helpSoundFile |  | ||||||
| 						) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		if doTag then PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.helpTTL) end | 		if doTag then | ||||||
|  | 			PlantFrame(x, y, frame, scale, Heimdall_Data.config.minimapTagger.helpTTL) | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	--endregion | 	--endregion | ||||||
|  |  | ||||||
| @@ -382,23 +323,20 @@ function shared.MinimapTagger.Init() | |||||||
| 		BattlefieldMinimap:SetMovable(true) | 		BattlefieldMinimap:SetMovable(true) | ||||||
| 		BattlefieldMinimap:EnableMouse(true) | 		BattlefieldMinimap:EnableMouse(true) | ||||||
| 		BattlefieldMinimap:RegisterForDrag("LeftButton") | 		BattlefieldMinimap:RegisterForDrag("LeftButton") | ||||||
| 		BattlefieldMinimap:SetScript("OnDragStart", function(selff) selff:StartMoving() end) | 		BattlefieldMinimap:SetScript("OnDragStart", function(self) self:StartMoving() end) | ||||||
| 		BattlefieldMinimap:SetScript("OnDragStop", function(selff) selff:StopMovingOrSizing() end) | 		BattlefieldMinimap:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end) | ||||||
| 		BattlefieldMinimapBackground:Hide() | 		BattlefieldMinimapBackground:Hide() | ||||||
| 		BattlefieldMinimapCloseButton:Hide() | 		BattlefieldMinimapCloseButton:Hide() | ||||||
| 		BattlefieldMinimapCorner:Hide() | 		BattlefieldMinimapCorner:Hide() | ||||||
| 		BattlefieldMinimap:HookScript("OnHide", function(selff) | 		BattlefieldMinimap:HookScript("OnHide", function(self) | ||||||
| 			for _, alertFrame in ipairs(alertFramePool) do | 			for _, alertFrame in ipairs(alertFramePool) do | ||||||
| 				alertFrame:Hide() | 				alertFrame:Hide() | ||||||
| 				---@diagnostic disable-next-line: undefined-field |  | ||||||
| 				alertFrame.custom.busy = false | 				alertFrame.custom.busy = false | ||||||
| 			end | 			end | ||||||
| 			for _, tagFrame in ipairs(tagFramePool) do | 			for _, tagFrame in ipairs(tagFramePool) do | ||||||
| 				tagFrame:Hide() | 				tagFrame:Hide() | ||||||
| 				---@diagnostic disable-next-line: undefined-field |  | ||||||
| 				tagFrame.custom.busy = false | 				tagFrame.custom.busy = false | ||||||
| 			end | 			end | ||||||
| 			-- What the fuck is this global? |  | ||||||
| 			for _, battleFrame in ipairs(battleFramePool) do | 			for _, battleFrame in ipairs(battleFramePool) do | ||||||
| 				battleFrame:Hide() | 				battleFrame:Hide() | ||||||
| 				battleFrame.custom.busy = false | 				battleFrame.custom.busy = false | ||||||
| @@ -432,14 +370,8 @@ function shared.MinimapTagger.Init() | |||||||
|  |  | ||||||
| 		if not ok then | 		if not ok then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Ignoring message from non-master channel: %s, need %s", ModuleName, channelname, | ||||||
| 					string.format( | 					Heimdall_Data.config.minimapTagger.masterChannel)) | ||||||
| 						"[%s] Ignoring message from non-master channel: %s, need %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						channelname, |  | ||||||
| 						Heimdall_Data.config.minimapTagger.masterChannel |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -455,14 +387,8 @@ function shared.MinimapTagger.Init() | |||||||
| 		local currentMapId = GetCurrentMapAreaID() | 		local currentMapId = GetCurrentMapAreaID() | ||||||
| 		if currentMapId ~= messageMapId then | 		if currentMapId ~= messageMapId then | ||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Current map ID (%d) does not match message map ID (%d), ignoring message", | ||||||
| 					string.format( | 					ModuleName, currentMapId, messageMapId)) | ||||||
| 						"[%s] Current map ID (%d) does not match message map ID (%d), ignoring message", |  | ||||||
| 						ModuleName, |  | ||||||
| 						currentMapId, |  | ||||||
| 						messageMapId |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			doTag = false | 			doTag = false | ||||||
| 		end | 		end | ||||||
| @@ -479,7 +405,9 @@ function shared.MinimapTagger.Init() | |||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print(string.format("[%s] Found alert position: %s, %s", ModuleName, tostring(x), tostring(y))) | 				print(string.format("[%s] Found alert position: %s, %s", ModuleName, tostring(x), tostring(y))) | ||||||
| 			end | 			end | ||||||
| 			if x and y then PlantTag(tonumber(x), tonumber(y), 2, doTag) end | 			if x and y then | ||||||
|  | 				PlantTag(tonumber(x), tonumber(y), 2, doTag) | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 		--endregion | 		--endregion | ||||||
| 		--region Combat | 		--region Combat | ||||||
| @@ -497,7 +425,9 @@ function shared.MinimapTagger.Init() | |||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print(string.format("[%s] Found combat position: %s, %s", ModuleName, tostring(x), tostring(y))) | 				print(string.format("[%s] Found combat position: %s, %s", ModuleName, tostring(x), tostring(y))) | ||||||
| 			end | 			end | ||||||
| 			if x and y then PlantCombat(tonumber(x), tonumber(y), 2, doTag) end | 			if x and y then | ||||||
|  | 				PlantCombat(tonumber(x), tonumber(y), 2, doTag) | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 		--endregion | 		--endregion | ||||||
| 		--region Death | 		--region Death | ||||||
| @@ -515,7 +445,9 @@ function shared.MinimapTagger.Init() | |||||||
| 			if Heimdall_Data.config.minimapTagger.debug then | 			if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 				print(string.format("[%s] Found death position: %s, %s", ModuleName, tostring(x), tostring(y))) | 				print(string.format("[%s] Found death position: %s, %s", ModuleName, tostring(x), tostring(y))) | ||||||
| 			end | 			end | ||||||
| 			if x and y then PlantAlert(tonumber(x), tonumber(y), 2, doTag) end | 			if x and y then | ||||||
|  | 				PlantAlert(tonumber(x), tonumber(y), 2, doTag) | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 		--endregion | 		--endregion | ||||||
| 		--region Help | 		--region Help | ||||||
| @@ -536,7 +468,6 @@ function shared.MinimapTagger.Init() | |||||||
| 			if x and y then | 			if x and y then | ||||||
| 				x, y = tonumber(x), tonumber(y) | 				x, y = tonumber(x), tonumber(y) | ||||||
| 				PlantHelp(x, y, 1, doTag) | 				PlantHelp(x, y, 1, doTag) | ||||||
| 				---@diagnostic disable-next-line: undefined-global |  | ||||||
| 				if TomTom then | 				if TomTom then | ||||||
| 					if Heimdall_Data.config.minimapTagger.debug then | 					if Heimdall_Data.config.minimapTagger.debug then | ||||||
| 						print(string.format("[%s] Adding help waypoint to TomTom", ModuleName)) | 						print(string.format("[%s] Adding help waypoint to TomTom", ModuleName)) | ||||||
| @@ -547,7 +478,6 @@ function shared.MinimapTagger.Init() | |||||||
| 						print(string.format("[%s] Area ID: %s", ModuleName, tostring(areaId))) | 						print(string.format("[%s] Area ID: %s", ModuleName, tostring(areaId))) | ||||||
| 					end | 					end | ||||||
|  |  | ||||||
| 					---@diagnostic disable-next-line: undefined-global |  | ||||||
| 					TomTom:AddMFWaypoint(areaId, nil, x / 100, y / 100, { | 					TomTom:AddMFWaypoint(areaId, nil, x / 100, y / 100, { | ||||||
| 						title = "Help " .. sender, | 						title = "Help " .. sender, | ||||||
| 						world = true, | 						world = true, | ||||||
| @@ -567,5 +497,7 @@ function shared.MinimapTagger.Init() | |||||||
| 	print("[Heimdall] MinimapTagger loaded") | 	print("[Heimdall] MinimapTagger loaded") | ||||||
| end | end | ||||||
|  |  | ||||||
| SlashCmdList["HEIMDALL_MINIMAPTAGGER"] = function(args) shared.MinimapTagger.Init() end | SlashCmdList["HEIMDALL_MINIMAPTAGGER"] = function(args) | ||||||
|  | 	shared.MinimapTagger.Init() | ||||||
|  | end | ||||||
| SLASH_HEIMDALL_MINIMAPTAGGER1 = "/mf" | SLASH_HEIMDALL_MINIMAPTAGGER1 = "/mf" | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Network" | local ModuleName = "Network" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -14,7 +15,7 @@ function shared.Network.Init() | |||||||
| 		---@type table<string, boolean> | 		---@type table<string, boolean> | ||||||
| 		local friends = {} | 		local friends = {} | ||||||
| 		for i = 1, GetNumFriends() do | 		for i = 1, GetNumFriends() do | ||||||
| 			local name, _, _, _, connected, _, _, _ = GetFriendInfo(i) | 			local name, level, class, area, connected, status, note, RAF = GetFriendInfo(i) | ||||||
| 			if name then | 			if name then | ||||||
| 				friends[name] = connected | 				friends[name] = connected | ||||||
| 				if Heimdall_Data.config.network.debug then | 				if Heimdall_Data.config.network.debug then | ||||||
| @@ -38,8 +39,7 @@ function shared.Network.Init() | |||||||
| 		friends[UnitName("player")] = true | 		friends[UnitName("player")] = true | ||||||
|  |  | ||||||
| 		shared.networkNodes = {} | 		shared.networkNodes = {} | ||||||
| 		-- Why are we skipping this again...? | 		if false then shared.networkNodes[#shared.networkNodes + 1] = UnitName("player") end | ||||||
| 		-- if false then shared.networkNodes[#shared.networkNodes + 1] = UnitName("player") end |  | ||||||
| 		for _, player in ipairs(Heimdall_Data.config.network.members) do | 		for _, player in ipairs(Heimdall_Data.config.network.members) do | ||||||
| 			if friends[player] then | 			if friends[player] then | ||||||
| 				shared.networkNodes[#shared.networkNodes + 1] = player | 				shared.networkNodes[#shared.networkNodes + 1] = player | ||||||
| @@ -56,10 +56,13 @@ function shared.Network.Init() | |||||||
|  |  | ||||||
| 	local friendsFrame = CreateFrame("Frame") | 	local friendsFrame = CreateFrame("Frame") | ||||||
| 	friendsFrame:RegisterEvent("FRIENDLIST_UPDATE") | 	friendsFrame:RegisterEvent("FRIENDLIST_UPDATE") | ||||||
| 	friendsFrame:SetScript("OnEvent", function(self, event, ...) end) | 	friendsFrame:SetScript("OnEvent", function(self, event, ...) | ||||||
|  | 	end) | ||||||
|  |  | ||||||
| 	local function NetworkTick() | 	local function NetworkTick() | ||||||
| 		if Heimdall_Data.config.network.debug then print("Network module is updating.") end | 		if Heimdall_Data.config.network.debug then | ||||||
|  | 			print("Network module is updating.") | ||||||
|  | 		end | ||||||
| 		ShowFriends() | 		ShowFriends() | ||||||
| 		updatePending = true | 		updatePending = true | ||||||
| 		C_Timer.After(1, function() | 		C_Timer.After(1, function() | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "NetworkMessenger" | local ModuleName = "NetworkMessenger" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -62,15 +63,9 @@ function shared.NetworkMessenger.Init() | |||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.networkMessenger.debug then | 			if Heimdall_Data.config.networkMessenger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Sending network message: '%s' to %s:%s", ModuleName, message.message, | ||||||
| 					string.format( | 					message.channel, | ||||||
| 						"[%s] Sending network message: '%s' to %s:%s", | 					message.data)) | ||||||
| 						ModuleName, |  | ||||||
| 						message.message, |  | ||||||
| 						message.channel, |  | ||||||
| 						message.data |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data) | 			local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data) | ||||||
| 			if Heimdall_Data.config.networkMessenger.debug then | 			if Heimdall_Data.config.networkMessenger.debug then | ||||||
| @@ -135,19 +130,17 @@ function shared.NetworkMessenger.Init() | |||||||
| 		end | 		end | ||||||
| 		local command = strtrim(parts[1]) | 		local command = strtrim(parts[1]) | ||||||
| 		if command == "message" then | 		if command == "message" then | ||||||
| 			local content = strtrim(tostring(parts[2])) | 			local message = strtrim(tostring(parts[2])) | ||||||
| 			local targetchannel = strtrim(tostring(parts[3])) | 			local channel = strtrim(tostring(parts[3])) | ||||||
| 			local target = strtrim(tostring(parts[4])) | 			local target = strtrim(tostring(parts[4])) | ||||||
| 			if Heimdall_Data.config.networkMessenger.debug then | 			if Heimdall_Data.config.networkMessenger.debug then | ||||||
| 				print( | 				print(string.format("[%s] Received message command: %s %s %s", ModuleName, message, channel, target)) | ||||||
| 					string.format("[%s] Received message command: %s %s %s", ModuleName, content, targetchannel, target) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local msg = { | 			local msg = { | ||||||
| 				channel = targetchannel, | 				channel = channel, | ||||||
| 				message = content, | 				message = message, | ||||||
| 				data = target, | 				data = target | ||||||
| 			} | 			} | ||||||
| 			table.insert(shared.messenger.queue, msg) | 			table.insert(shared.messenger.queue, msg) | ||||||
| 		elseif command == "dmessage" then | 		elseif command == "dmessage" then | ||||||
| @@ -155,15 +148,17 @@ function shared.NetworkMessenger.Init() | |||||||
| 				print(string.format("[%s] Received dmessage command", ModuleName)) | 				print(string.format("[%s] Received dmessage command", ModuleName)) | ||||||
| 			end | 			end | ||||||
| 			parts[1] = "message" | 			parts[1] = "message" | ||||||
| 			local content = table.concat(parts, "|") | 			local message = table.concat(parts, "|") | ||||||
|  |  | ||||||
| 			if nextIdx > #shared.networkNodes then nextIdx = 1 end | 			if nextIdx > #shared.networkNodes then | ||||||
|  | 				nextIdx = 1 | ||||||
|  | 			end | ||||||
| 			local recipient = shared.networkNodes[nextIdx] | 			local recipient = shared.networkNodes[nextIdx] | ||||||
| 			nextIdx = nextIdx + 1 | 			nextIdx = nextIdx + 1 | ||||||
| 			if Heimdall_Data.config.networkMessenger.debug then | 			if Heimdall_Data.config.networkMessenger.debug then | ||||||
| 				print(string.format("[%s] Sending message %s to %s", ModuleName, content, recipient)) | 				print(string.format("[%s] Sending message %s to %s", ModuleName, message, recipient)) | ||||||
| 			end | 			end | ||||||
| 			SendAddonMessage(Heimdall_Data.config.addonPrefix, content, "WHISPER", recipient) | 			SendAddonMessage(Heimdall_Data.config.addonPrefix, message, "WHISPER", recipient) | ||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| @@ -172,7 +167,7 @@ function shared.NetworkMessenger.Init() | |||||||
| 		local testmsg = { | 		local testmsg = { | ||||||
| 			channel = "W", | 			channel = "W", | ||||||
| 			message = "Hi, mom!", | 			message = "Hi, mom!", | ||||||
| 			data = "Secundus", | 			data = "Secundus" | ||||||
| 		} | 		} | ||||||
| 		for i = 1, 36 do | 		for i = 1, 36 do | ||||||
| 			table.insert(shared.networkMessenger.queue, testmsg) | 			table.insert(shared.networkMessenger.queue, testmsg) | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Noter" | local ModuleName = "Noter" | ||||||
|  |  | ||||||
| ---@class Note | ---@class Note | ||||||
| @@ -11,32 +12,36 @@ local ModuleName = "Noter" | |||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Noter = {} | shared.Noter = {} | ||||||
| function shared.Noter.Init() | function shared.Noter.Init() | ||||||
| 	-- ---Hopefully this will not be necessary | 	---Hopefully this will not be necessary | ||||||
| 	-- ---@param text string | 	---@param text string | ||||||
| 	-- ---@param size number | 	---@param size number | ||||||
| 	-- ---@return string[] | 	---@return string[] | ||||||
| 	-- local function Partition(text, size) | 	local function Partition(text, size) | ||||||
| 	-- 	local words = {} | 		local words = {} | ||||||
| 	-- 	for word in text:gmatch("[^,]+") do | 		for word in text:gmatch("[^,]+") do | ||||||
| 	-- 		words[#words + 1] = word | 			words[#words + 1] = word | ||||||
| 	-- 	end | 		end | ||||||
|  |  | ||||||
| 	-- 	local ret = {} | 		local ret = {} | ||||||
| 	-- 	local currentChunk = "" | 		local currentChunk = "" | ||||||
|  |  | ||||||
| 	-- 	for _, word in ipairs(words) do | 		for _, word in ipairs(words) do | ||||||
| 	-- 		if #currentChunk + #word + 1 <= size then | 			if #currentChunk + #word + 1 <= size then | ||||||
| 	-- 			currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word) | 				currentChunk = currentChunk .. (currentChunk == "" and word or " " .. word) | ||||||
| 	-- 		else | 			else | ||||||
| 	-- 			if #currentChunk > 0 then ret[#ret + 1] = currentChunk end | 				if #currentChunk > 0 then | ||||||
| 	-- 			currentChunk = word | 					ret[#ret + 1] = currentChunk | ||||||
| 	-- 		end | 				end | ||||||
| 	-- 	end | 				currentChunk = word | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 	-- 	if #currentChunk > 0 then ret[#ret + 1] = currentChunk end | 		if #currentChunk > 0 then | ||||||
|  | 			ret[#ret + 1] = currentChunk | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 	-- 	return ret | 		return ret | ||||||
| 	-- end | 	end | ||||||
| 	---@param array any[] | 	---@param array any[] | ||||||
| 	---@return any[] | 	---@return any[] | ||||||
| 	local function Compact(array) | 	local function Compact(array) | ||||||
| @@ -60,7 +65,8 @@ function shared.Noter.Init() | |||||||
| 			end | 			end | ||||||
| 			local indices = shared.Split(range, "..") | 			local indices = shared.Split(range, "..") | ||||||
| 			if Heimdall_Data.config.noter.debug then | 			if Heimdall_Data.config.noter.debug then | ||||||
| 				print(string.format("[%s] Indices for range deletion: %s", ModuleName, table.concat(indices, ", "))) | 				print(string.format("[%s] Indices for range deletion: %s", ModuleName, | ||||||
|  | 					table.concat(indices, ", "))) | ||||||
| 				shared.dumpTable(indices) | 				shared.dumpTable(indices) | ||||||
| 			end | 			end | ||||||
| 			local start = tonumber(indices[1]) | 			local start = tonumber(indices[1]) | ||||||
| @@ -68,7 +74,8 @@ function shared.Noter.Init() | |||||||
|  |  | ||||||
| 			if not start then | 			if not start then | ||||||
| 				if Heimdall_Data.config.noter.debug then | 				if Heimdall_Data.config.noter.debug then | ||||||
| 					print(string.format("[%s] Invalid start range for delete note: %s", ModuleName, tostring(start))) | 					print(string.format("[%s] Invalid start range for delete note: %s", ModuleName, | ||||||
|  | 						tostring(start))) | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
| @@ -111,7 +118,7 @@ function shared.Noter.Init() | |||||||
| 		local msg = { | 		local msg = { | ||||||
| 			channel = "C", | 			channel = "C", | ||||||
| 			data = channel, | 			data = channel, | ||||||
| 			message = string.format("[%s][%d] %s: %s", note.source, index, note.date, note.note), | 			message = string.format("[%s][%d] %s: %s", note.source, index, note.date, note.note) | ||||||
| 		} | 		} | ||||||
| 		--table.insert(shared.messenger.queue, msg) | 		--table.insert(shared.messenger.queue, msg) | ||||||
| 		table.insert(shared.networkMessenger.queue, msg) | 		table.insert(shared.networkMessenger.queue, msg) | ||||||
| @@ -125,13 +132,8 @@ function shared.Noter.Init() | |||||||
| 		local range = args[3] | 		local range = args[3] | ||||||
| 		if not range then | 		if not range then | ||||||
| 			if Heimdall_Data.config.noter.debug then | 			if Heimdall_Data.config.noter.debug then | ||||||
| 				print( | 				print(string.format("[%s] No range specified for print note, defaulting to last %d notes", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.noter.lastNotes)) | ||||||
| 						"[%s] No range specified for print note, defaulting to last %d notes", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.noter.lastNotes |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			local notes = Heimdall_Data.config.notes[name] or {} | 			local notes = Heimdall_Data.config.notes[name] or {} | ||||||
| 			local start = math.max(1, #notes - Heimdall_Data.config.noter.lastNotes + 1) | 			local start = math.max(1, #notes - Heimdall_Data.config.noter.lastNotes + 1) | ||||||
| @@ -150,7 +152,8 @@ function shared.Noter.Init() | |||||||
| 			end | 			end | ||||||
| 			local indices = shared.Split(range, "..") | 			local indices = shared.Split(range, "..") | ||||||
| 			if Heimdall_Data.config.noter.debug then | 			if Heimdall_Data.config.noter.debug then | ||||||
| 				print(string.format("[%s] Indices for range printing: %s", ModuleName, table.concat(indices, ", "))) | 				print(string.format("[%s] Indices for range printing: %s", ModuleName, | ||||||
|  | 					table.concat(indices, ", "))) | ||||||
| 				shared.dumpTable(indices) | 				shared.dumpTable(indices) | ||||||
| 			end | 			end | ||||||
| 			local start = tonumber(indices[1]) | 			local start = tonumber(indices[1]) | ||||||
| @@ -158,7 +161,8 @@ function shared.Noter.Init() | |||||||
|  |  | ||||||
| 			if not start then | 			if not start then | ||||||
| 				if Heimdall_Data.config.noter.debug then | 				if Heimdall_Data.config.noter.debug then | ||||||
| 					print(string.format("[%s] Invalid start range for print note: %s", ModuleName, tostring(start))) | 					print(string.format("[%s] Invalid start range for print note: %s", ModuleName, | ||||||
|  | 						tostring(start))) | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
| @@ -208,7 +212,7 @@ function shared.Noter.Init() | |||||||
| 		local note = { | 		local note = { | ||||||
| 			source = sender, | 			source = sender, | ||||||
| 			date = date("%Y-%m-%dT%H:%M:%S"), | 			date = date("%Y-%m-%dT%H:%M:%S"), | ||||||
| 			note = msg, | 			note = msg | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.noter.debug then | 		if Heimdall_Data.config.noter.debug then | ||||||
| @@ -280,7 +284,9 @@ function shared.Noter.Init() | |||||||
| 				print(string.format("[%s] Note command received for: %s", ModuleName, name)) | 				print(string.format("[%s] Note command received for: %s", ModuleName, name)) | ||||||
| 			end | 			end | ||||||
| 			local note = strtrim(args[3] or "") | 			local note = strtrim(args[3] or "") | ||||||
| 			if Heimdall_Data.config.noter.debug then print(string.format("[%s] Note: %s", ModuleName, note)) end | 			if Heimdall_Data.config.noter.debug then | ||||||
|  | 				print(string.format("[%s] Note: %s", ModuleName, note)) | ||||||
|  | 			end | ||||||
| 			if note == "delete" then | 			if note == "delete" then | ||||||
| 				DeleteNotes(name, args) | 				DeleteNotes(name, args) | ||||||
| 			elseif string.find(note, "^[%d%.]*$") then | 			elseif string.find(note, "^[%d%.]*$") then | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,11 +1,14 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Sniffer" | local ModuleName = "Sniffer" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.Sniffer = {} | shared.Sniffer = {} | ||||||
| function shared.Sniffer.Init() | function shared.Sniffer.Init() | ||||||
| 	if Heimdall_Data.config.sniffer.debug then print(string.format("[%s] Module initializing", ModuleName)) end | 	if Heimdall_Data.config.sniffer.debug then | ||||||
|  | 		print(string.format("[%s] Module initializing", ModuleName)) | ||||||
|  | 	end | ||||||
| 	local smellThrottle = {} | 	local smellThrottle = {} | ||||||
| 	local SmellStinky = function(stinky) | 	local SmellStinky = function(stinky) | ||||||
| 		if Heimdall_Data.config.sniffer.debug then | 		if Heimdall_Data.config.sniffer.debug then | ||||||
| @@ -13,14 +16,17 @@ function shared.Sniffer.Init() | |||||||
| 			shared.dumpTable(Heimdall_Data.config.sniffer) | 			shared.dumpTable(Heimdall_Data.config.sniffer) | ||||||
| 		end | 		end | ||||||
| 		if not Heimdall_Data.config.sniffer.enabled then return end | 		if not Heimdall_Data.config.sniffer.enabled then return end | ||||||
| 		if Heimdall_Data.config.sniffer.stinky and not shared.IsStinky(stinky) then | 		if Heimdall_Data.config.sniffer.stinky and | ||||||
|  | 			not shared.IsStinky(stinky) then | ||||||
| 			if Heimdall_Data.config.sniffer.debug then | 			if Heimdall_Data.config.sniffer.debug then | ||||||
| 				print(string.format("%s: Stinky not found in config", ModuleName)) | 				print(string.format("%s: Stinky not found in config", ModuleName)) | ||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		if smellThrottle[stinky] and GetTime() - smellThrottle[stinky] < Heimdall_Data.config.sniffer.throttleTime then | 		if smellThrottle[stinky] and GetTime() - smellThrottle[stinky] < Heimdall_Data.config.sniffer.throttleTime then | ||||||
| 			if Heimdall_Data.config.sniffer.debug then print(string.format("%s: Throttled", ModuleName)) end | 			if Heimdall_Data.config.sniffer.debug then | ||||||
|  | 				print(string.format("%s: Throttled", ModuleName)) | ||||||
|  | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		smellThrottle[stinky] = GetTime() | 		smellThrottle[stinky] = GetTime() | ||||||
| @@ -54,8 +60,7 @@ function shared.Sniffer.Init() | |||||||
| 			end | 			end | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		local source, destination, err | 		local source, err = CLEUParser.GetSourceName(...) | ||||||
| 		source, err = CLEUParser.GetSourceName(...) |  | ||||||
| 		if Heimdall_Data.config.sniffer.debug then | 		if Heimdall_Data.config.sniffer.debug then | ||||||
| 			print(string.format("[%s] Processing source: %s", ModuleName, source)) | 			print(string.format("[%s] Processing source: %s", ModuleName, source)) | ||||||
| 		end | 		end | ||||||
| @@ -66,7 +71,7 @@ function shared.Sniffer.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| 		SmellStinky(source) | 		SmellStinky(source) | ||||||
| 		destination, err = CLEUParser.GetDestName(...) | 		local destination, err = CLEUParser.GetDestName(...) | ||||||
| 		if Heimdall_Data.config.sniffer.debug then | 		if Heimdall_Data.config.sniffer.debug then | ||||||
| 			print(string.format("[%s] Processing destination: %s", ModuleName, destination)) | 			print(string.format("[%s] Processing destination: %s", ModuleName, destination)) | ||||||
| 		end | 		end | ||||||
| @@ -78,6 +83,8 @@ function shared.Sniffer.Init() | |||||||
| 		end | 		end | ||||||
| 		SmellStinky(destination) | 		SmellStinky(destination) | ||||||
| 	end) | 	end) | ||||||
| 	if Heimdall_Data.config.sniffer.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.sniffer.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] Sniffer loaded") | 	print("[Heimdall] Sniffer loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Spotter" | local ModuleName = "Spotter" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -66,13 +67,8 @@ function shared.Spotter.Init() | |||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if Heimdall_Data.config.spotter.debug then | 		if Heimdall_Data.config.spotter.debug then | ||||||
| 			print( | 			print(string.format("[%s] Using everyone setting: %s", ModuleName, | ||||||
| 				string.format( | 				tostring(Heimdall_Data.config.spotter.everyone))) | ||||||
| 					"[%s] Using everyone setting: %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					tostring(Heimdall_Data.config.spotter.everyone) |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
| 		return Heimdall_Data.config.spotter.everyone | 		return Heimdall_Data.config.spotter.everyone | ||||||
| 	end | 	end | ||||||
| @@ -162,8 +158,7 @@ function shared.Spotter.Init() | |||||||
| 				print(string.format("[%s] Processing channel: %s", ModuleName, channel)) | 				print(string.format("[%s] Processing channel: %s", ModuleName, channel)) | ||||||
| 			end | 			end | ||||||
| 			local locale = shared.GetLocaleForChannel(channel) | 			local locale = shared.GetLocaleForChannel(channel) | ||||||
| 			local text = string.format( | 			local text = string.format(shared._L("spotterSpotted", locale), | ||||||
| 				shared._L("spotterSpotted", locale), |  | ||||||
| 				hostile and shared._L("hostile", locale) or shared._L("friendly", locale), | 				hostile and shared._L("hostile", locale) or shared._L("friendly", locale), | ||||||
| 				name, | 				name, | ||||||
| 				shared._L(class, locale), | 				shared._L(class, locale), | ||||||
| @@ -173,18 +168,15 @@ function shared.Spotter.Init() | |||||||
| 				pvpOn and shared._L("pvpOn", locale) or shared._L("pvpOff", locale), | 				pvpOn and shared._L("pvpOn", locale) or shared._L("pvpOff", locale), | ||||||
| 				string.gsub(FormatHP(hp), "M", "kk"), | 				string.gsub(FormatHP(hp), "M", "kk"), | ||||||
| 				string.gsub(FormatHP(maxHp), "M", "kk"), | 				string.gsub(FormatHP(maxHp), "M", "kk"), | ||||||
| 				shared._L(zone, locale), | 				shared._L(zone, locale), shared._L(subzone, locale), | ||||||
| 				shared._L(subzone, locale), |  | ||||||
| 				areaId, | 				areaId, | ||||||
| 				x * 100, | 				x * 100, y * 100) | ||||||
| 				y * 100 |  | ||||||
| 			) |  | ||||||
|  |  | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local msg = { | 			local msg = { | ||||||
| 				channel = "C", | 				channel = "C", | ||||||
| 				data = channel, | 				data = channel, | ||||||
| 				message = text, | 				message = text | ||||||
| 			} | 			} | ||||||
| 			if Heimdall_Data.config.spotter.debug then | 			if Heimdall_Data.config.spotter.debug then | ||||||
| 				print(string.format("[%s] Queuing spotter message", ModuleName)) | 				print(string.format("[%s] Queuing spotter message", ModuleName)) | ||||||
| @@ -209,7 +201,9 @@ function shared.Spotter.Init() | |||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if event == "UNIT_TARGET" then unit = "target" end | 		if event == "UNIT_TARGET" then | ||||||
|  | 			unit = "target" | ||||||
|  | 		end | ||||||
|  |  | ||||||
| 		local err = NotifySpotted(unit) | 		local err = NotifySpotted(unit) | ||||||
| 		if err then | 		if err then | ||||||
| @@ -219,6 +213,8 @@ function shared.Spotter.Init() | |||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.spotter.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.spotter.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] Spotter loaded") | 	print("[Heimdall] Spotter loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -13,23 +13,14 @@ function shared.StinkyCache.Init() | |||||||
| 	---@param name string | 	---@param name string | ||||||
| 	local function AskCommander(name) | 	local function AskCommander(name) | ||||||
| 		if Heimdall_Data.config.stinkyCache.debug then | 		if Heimdall_Data.config.stinkyCache.debug then | ||||||
| 			print( | 			print(string.format("[%s] Asking commander %s about %s", ModuleName, | ||||||
| 				string.format( | 				Heimdall_Data.config.stinkyCache.commander, name)) | ||||||
| 					"[%s] Asking commander %s about %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					Heimdall_Data.config.stinkyCache.commander, |  | ||||||
| 					name |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
| 		local messageParts = { "isstinky", name } | 		local messageParts = { "isstinky", name } | ||||||
| 		local message = table.concat(messageParts, "|") | 		local message = table.concat(messageParts, "|") | ||||||
| 		SendAddonMessage( | 		SendAddonMessage(Heimdall_Data.config.addonPrefix, | ||||||
| 			Heimdall_Data.config.addonPrefix, | 			message, "WHISPER", | ||||||
| 			message, | 			Heimdall_Data.config.stinkyCache.commander) | ||||||
| 			"WHISPER", |  | ||||||
| 			Heimdall_Data.config.stinkyCache.commander |  | ||||||
| 		) |  | ||||||
| 		return | 		return | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| @@ -38,25 +29,20 @@ function shared.StinkyCache.Init() | |||||||
| 	addonMessageFrame:SetScript("OnEvent", function(self, event, msg, sender, ...) | 	addonMessageFrame:SetScript("OnEvent", function(self, event, msg, sender, ...) | ||||||
| 		if sender == Heimdall_Data.config.stinkyCache.commander then | 		if sender == Heimdall_Data.config.stinkyCache.commander then | ||||||
| 			if Heimdall_Data.config.stinkyCache.debug then | 			if Heimdall_Data.config.stinkyCache.debug then | ||||||
| 				print( | 				print(string.format("[%s] Received stinky from commander %s: %s", ModuleName, | ||||||
| 					string.format( | 					Heimdall_Data.config.stinkyCache.commander, msg)) | ||||||
| 						"[%s] Received stinky from commander %s: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						Heimdall_Data.config.stinkyCache.commander, |  | ||||||
| 						msg |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			local parts = { strsplit("|", msg) } | 			local name, value = {strsplit("|", msg)} | ||||||
| 			local name, value = parts[1], parts[2] |  | ||||||
| 			shared.stinkyCache.stinkies[name] = { value = value, timestamp = time() } | 			shared.stinkyCache.stinkies[name] = { value = value, timestamp = time() } | ||||||
| 		else | 		else | ||||||
| 			if Heimdall_Data.config.stinkyCache.debug then | 			if Heimdall_Data.config.stinkyCache.debug then | ||||||
| 				print(string.format("[%s] Received stinky from non-commander %s: %s", ModuleName, sender, msg)) | 				print(string.format("[%s] Received stinky from non-commander %s: %s", ModuleName, sender, msg)) | ||||||
| 			end | 			end | ||||||
| 			local parts = { strsplit("|", msg) } | 			local parts = {strsplit("|", msg)} | ||||||
| 			local command, name = parts[1], parts[2] | 			local command, name = parts[1], parts[2] | ||||||
| 			if parts[1] == "isstinky" then local res = Heimdall_Data.config.stinkies[parts[2]] end | 			if parts[1] == "isstinky" then | ||||||
|  | 				local res = Heimdall_Data.config.stinkies[parts[2]] | ||||||
|  | 			end | ||||||
| 		end | 		end | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| @@ -64,9 +50,11 @@ function shared.StinkyCache.Init() | |||||||
| 		__index = function(self, key) | 		__index = function(self, key) | ||||||
| 			local value = rawget(self, key) | 			local value = rawget(self, key) | ||||||
| 			local now = GetTime() | 			local now = GetTime() | ||||||
| 			if value == nil or now - value.timestamp > Heimdall_Data.config.stinkyCache.ttl then AskCommander(key) end | 			if value == nil or now - value.timestamp > Heimdall_Data.config.stinkyCache.ttl then | ||||||
|  | 				AskCommander(key) | ||||||
|  | 			end | ||||||
| 			return rawget(self, key) | 			return rawget(self, key) | ||||||
| 		end, | 		end | ||||||
| 	}) | 	}) | ||||||
| 	print("[Heimdall] StinkyCache module loaded") | 	print("[Heimdall] StinkyCache module loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,12 +1,13 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "StinkyTracker" | local ModuleName = "StinkyTracker" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| shared.StinkyTracker = {} | shared.StinkyTracker = {} | ||||||
| function shared.StinkyTracker.Init() | function shared.StinkyTracker.Init() | ||||||
| 	shared.stinkyTracker = { | 	shared.stinkyTracker = { | ||||||
| 		stinkies = ReactiveValue.new({}), | 		stinkies = ReactiveValue.new({}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	local whoRegex = "([^ -/]+)-?%w*/(%w+)" | 	local whoRegex = "([^ -/]+)-?%w*/(%w+)" | ||||||
| @@ -22,18 +23,11 @@ function shared.StinkyTracker.Init() | |||||||
| 				name = name, | 				name = name, | ||||||
| 				class = class, | 				class = class, | ||||||
| 				seenAt = GetTime(), | 				seenAt = GetTime(), | ||||||
| 				hostile = true, | 				hostile = true | ||||||
| 			} | 			} | ||||||
| 			if Heimdall_Data.config.stinkyTracker.debug then | 			if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 				print( | 				print(string.format("[%s] Found hostile player: %s (%s) at %s", ModuleName, name, class, | ||||||
| 					string.format( | 					date("%H:%M:%S", time()))) | ||||||
| 						"[%s] Found hostile player: %s (%s) at %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						name, |  | ||||||
| 						class, |  | ||||||
| 						date("%H:%M:%S", time()) |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 				shared.dumpTable(stinkies) | 				shared.dumpTable(stinkies) | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| @@ -59,20 +53,12 @@ function shared.StinkyTracker.Init() | |||||||
| 			name = name, | 			name = name, | ||||||
| 			class = class, | 			class = class, | ||||||
| 			seenAt = GetTime(), | 			seenAt = GetTime(), | ||||||
| 			hostile = aggression == "hostile", | 			hostile = aggression == "hostile" | ||||||
| 		} | 		} | ||||||
| 		stinkies[name] = stinky | 		stinkies[name] = stinky | ||||||
| 		if Heimdall_Data.config.stinkyTracker.debug then | 		if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 			print( | 			print(string.format("[%s] Found stinky in SEE: %s (%s) - %s at %s", ModuleName, name, class, aggression, | ||||||
| 				string.format( | 				date("%H:%M:%S", time()))) | ||||||
| 					"[%s] Found stinky in SEE: %s (%s) - %s at %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					name, |  | ||||||
| 					class, |  | ||||||
| 					aggression, |  | ||||||
| 					date("%H:%M:%S", time()) |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 			shared.dumpTable(stinkies) | 			shared.dumpTable(stinkies) | ||||||
| 		end | 		end | ||||||
| 		return stinkies | 		return stinkies | ||||||
| @@ -101,7 +87,7 @@ function shared.StinkyTracker.Init() | |||||||
| 			name = name, | 			name = name, | ||||||
| 			class = class, | 			class = class, | ||||||
| 			seenAt = GetTime(), | 			seenAt = GetTime(), | ||||||
| 			hostile = true, | 			hostile = true | ||||||
| 		} | 		} | ||||||
| 		stinkies[name] = stinky | 		stinkies[name] = stinky | ||||||
| 		if Heimdall_Data.config.stinkyTracker.debug then | 		if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| @@ -155,9 +141,8 @@ function shared.StinkyTracker.Init() | |||||||
| 				if stinky.hostile then | 				if stinky.hostile then | ||||||
| 					shared.stinkyTracker.stinkies[name] = stinky | 					shared.stinkyTracker.stinkies[name] = stinky | ||||||
| 					if Heimdall_Data.config.stinkyTracker.debug then | 					if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 						print( | 						print(string.format("[%s] Added hostile stinky from WHO: %s (%s)", ModuleName, name, stinky | ||||||
| 							string.format("[%s] Added hostile stinky from WHO: %s (%s)", ModuleName, name, stinky.class) | 							.class)) | ||||||
| 						) |  | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| @@ -174,9 +159,8 @@ function shared.StinkyTracker.Init() | |||||||
| 				if stinky.hostile then | 				if stinky.hostile then | ||||||
| 					shared.stinkyTracker.stinkies[name] = stinky | 					shared.stinkyTracker.stinkies[name] = stinky | ||||||
| 					if Heimdall_Data.config.stinkyTracker.debug then | 					if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 						print( | 						print(string.format("[%s] Added hostile stinky from SEE: %s (%s)", ModuleName, name, stinky | ||||||
| 							string.format("[%s] Added hostile stinky from SEE: %s (%s)", ModuleName, name, stinky.class) | 							.class)) | ||||||
| 						) |  | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 				if not stinky.hostile then | 				if not stinky.hostile then | ||||||
| @@ -206,9 +190,7 @@ function shared.StinkyTracker.Init() | |||||||
| 		-- Log total stinky count after processing | 		-- Log total stinky count after processing | ||||||
| 		if Heimdall_Data.config.stinkyTracker.debug then | 		if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 			local count = 0 | 			local count = 0 | ||||||
| 			for _ in pairs(shared.stinkyTracker.stinkies:get()) do | 			for _ in pairs(shared.stinkyTracker.stinkies:get()) do count = count + 1 end | ||||||
| 				count = count + 1 |  | ||||||
| 			end |  | ||||||
| 			print(string.format("[%s] Current total stinkies tracked: %d", ModuleName, count)) | 			print(string.format("[%s] Current total stinkies tracked: %d", ModuleName, count)) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| @@ -228,7 +210,7 @@ function shared.StinkyTracker.Init() | |||||||
| 		if Heimdall_Data.config.stinkyTracker.debug then | 		if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| 			print(string.format("[%s] Event received: %s for unit: %s", ModuleName, event, unit or "target")) | 			print(string.format("[%s] Event received: %s for unit: %s", ModuleName, event, unit or "target")) | ||||||
| 		end | 		end | ||||||
| 		unit = "target" | 		local unit = "target" | ||||||
|  |  | ||||||
| 		if not Heimdall_Data.config.stinkyTracker.enabled then | 		if not Heimdall_Data.config.stinkyTracker.enabled then | ||||||
| 			if Heimdall_Data.config.stinkyTracker.debug then | 			if Heimdall_Data.config.stinkyTracker.debug then | ||||||
| @@ -254,7 +236,7 @@ function shared.StinkyTracker.Init() | |||||||
| 				name = name, | 				name = name, | ||||||
| 				class = UnitClass(unit), | 				class = UnitClass(unit), | ||||||
| 				seenAt = GetTime(), | 				seenAt = GetTime(), | ||||||
| 				hostile = true, | 				hostile = true | ||||||
| 			} | 			} | ||||||
| 			return | 			return | ||||||
| 		end | 		end | ||||||
| @@ -272,6 +254,8 @@ function shared.StinkyTracker.Init() | |||||||
| 		shared.stinkyTracker.stinkies[name] = nil | 		shared.stinkyTracker.stinkies[name] = nil | ||||||
| 	end) | 	end) | ||||||
|  |  | ||||||
| 	if Heimdall_Data.config.stinkyTracker.debug then print(string.format("[%s] Module initialized", ModuleName)) end | 	if Heimdall_Data.config.stinkyTracker.debug then | ||||||
|  | 		print(string.format("[%s] Module initialized", ModuleName)) | ||||||
|  | 	end | ||||||
| 	print("[Heimdall] StinkyTracker loaded") | 	print("[Heimdall] StinkyTracker loaded") | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| local _, shared = ... | local addonname, shared = ... | ||||||
| ---@cast shared HeimdallShared | ---@cast shared HeimdallShared | ||||||
|  | ---@cast addonname string | ||||||
| local ModuleName = "Whoer" | local ModuleName = "Whoer" | ||||||
|  |  | ||||||
| ---@diagnostic disable-next-line: missing-fields | ---@diagnostic disable-next-line: missing-fields | ||||||
| @@ -31,7 +32,7 @@ function shared.Whoer.Init() | |||||||
| 		---@return Player | 		---@return Player | ||||||
| 		new = function(name, guild, race, class, zone) | 		new = function(name, guild, race, class, zone) | ||||||
| 			local self = setmetatable({}, { | 			local self = setmetatable({}, { | ||||||
| 				__index = Player, | 				__index = Player | ||||||
| 			}) | 			}) | ||||||
| 			self.name = name | 			self.name = name | ||||||
| 			self.guild = guild | 			self.guild = guild | ||||||
| @@ -46,15 +47,13 @@ function shared.Whoer.Init() | |||||||
| 		end, | 		end, | ||||||
| 		---@return string | 		---@return string | ||||||
| 		ToString = function(self) | 		ToString = function(self) | ||||||
| 			local out = string.format( | 			local out = string.format("%s %s %s\nFirst: %s Last: %s Seen: %3d", | ||||||
| 				"%s %s %s\nFirst: %s Last: %s Seen: %3d", |  | ||||||
| 				shared.padString(self.name, 16, true), | 				shared.padString(self.name, 16, true), | ||||||
| 				shared.padString(self.guild, 26, false), | 				shared.padString(self.guild, 26, false), | ||||||
| 				shared.padString(self.zone, 26, false), | 				shared.padString(self.zone, 26, false), | ||||||
| 				shared.padString(self.firstSeen, 10, true), | 				shared.padString(self.firstSeen, 10, true), | ||||||
| 				shared.padString(self.lastSeen, 10, true), | 				shared.padString(self.lastSeen, 10, true), | ||||||
| 				self.seenCount | 				self.seenCount) | ||||||
| 			) |  | ||||||
| 			return string.format("|cFF%s%s|r", shared.classColors[self.class], out) | 			return string.format("|cFF%s%s|r", shared.classColors[self.class], out) | ||||||
| 		end, | 		end, | ||||||
| 	} | 	} | ||||||
| @@ -68,12 +67,12 @@ function shared.Whoer.Init() | |||||||
| 		---@return WHOQuery | 		---@return WHOQuery | ||||||
| 		new = function(query, filters) | 		new = function(query, filters) | ||||||
| 			local self = setmetatable({}, { | 			local self = setmetatable({}, { | ||||||
| 				__index = WHOQuery, | 				__index = WHOQuery | ||||||
| 			}) | 			}) | ||||||
| 			self.query = query | 			self.query = query | ||||||
| 			self.filters = filters | 			self.filters = filters | ||||||
| 			return self | 			return self | ||||||
| 		end, | 		end | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	---@class WHOFilter | 	---@class WHOFilter | ||||||
| @@ -82,10 +81,12 @@ function shared.Whoer.Init() | |||||||
| 	---@type WHOFilter | 	---@type WHOFilter | ||||||
| 	local NotSiegeOfOrgrimmarFilter = { | 	local NotSiegeOfOrgrimmarFilter = { | ||||||
| 		Run = function(name, guild, level, race, class, zone) | 		Run = function(name, guild, level, race, class, zone) | ||||||
| 			if not zone then return false end | 			if not zone then | ||||||
|  | 				return false | ||||||
|  | 			end | ||||||
| 			return zone ~= "Siege of Orgrimmar" | 			return zone ~= "Siege of Orgrimmar" | ||||||
| 		end, | 		end, | ||||||
| 		key = "notsoo", | 		key = "notsoo" | ||||||
| 	} | 	} | ||||||
| 	---@type WHOFilter | 	---@type WHOFilter | ||||||
| 	local AllianceFilter = { | 	local AllianceFilter = { | ||||||
| @@ -94,7 +95,7 @@ function shared.Whoer.Init() | |||||||
| 			if not shared.raceMap[race] then return false end | 			if not shared.raceMap[race] then return false end | ||||||
| 			return shared.raceMap[race] == "Alliance" | 			return shared.raceMap[race] == "Alliance" | ||||||
| 		end, | 		end, | ||||||
| 		key = "ally", | 		key = "ally" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	---@class WhoQueryService | 	---@class WhoQueryService | ||||||
| @@ -109,13 +110,15 @@ function shared.Whoer.Init() | |||||||
| 		queries = {}, | 		queries = {}, | ||||||
| 		filters = { | 		filters = { | ||||||
| 			NotSiegeOfOrgrimmarFilter, | 			NotSiegeOfOrgrimmarFilter, | ||||||
| 			AllianceFilter, | 			AllianceFilter | ||||||
| 		}, | 		}, | ||||||
| 		---@param key string | 		---@param key string | ||||||
| 		---@return WHOFilter? | 		---@return WHOFilter? | ||||||
| 		getFilter = function(key) | 		getFilter = function(key) | ||||||
| 			for _, filter in pairs(shared.WhoQueryService.filters) do | 			for _, filter in pairs(shared.WhoQueryService.filters) do | ||||||
| 				if filter.key == key then return filter end | 				if filter.key == key then | ||||||
|  | 					return filter | ||||||
|  | 				end | ||||||
| 			end | 			end | ||||||
| 			return nil | 			return nil | ||||||
| 		end, | 		end, | ||||||
| @@ -164,16 +167,16 @@ function shared.Whoer.Init() | |||||||
| 			shared.dumpTable(filters) | 			shared.dumpTable(filters) | ||||||
| 			return WHOQuery.new(queryParts[1], filters) | 			return WHOQuery.new(queryParts[1], filters) | ||||||
| 		end, | 		end, | ||||||
| 		---@param queryStr string | 		---@param queries string | ||||||
| 		---@return WHOQuery[] | 		---@return WHOQuery[] | ||||||
| 		WhoQueriesFromString = function(queryStr) | 		WhoQueriesFromString = function(queries) | ||||||
| 			local queries = shared.Split(queryStr, "\n") | 			local queries = shared.Split(queries, "\n") | ||||||
| 			local ret = {} | 			local ret = {} | ||||||
| 			for _, query in pairs(queries) do | 			for _, query in pairs(queries) do | ||||||
| 				table.insert(ret, shared.WhoQueryService.WhoQueryFromString(query)) | 				table.insert(ret, shared.WhoQueryService.WhoQueryFromString(query)) | ||||||
| 			end | 			end | ||||||
| 			return ret | 			return ret | ||||||
| 		end, | 		end | ||||||
| 	} | 	} | ||||||
| 	shared.WhoQueryService.queries = shared.WhoQueryService.WhoQueriesFromString(Heimdall_Data.config.who.queries) | 	shared.WhoQueryService.queries = shared.WhoQueryService.WhoQueriesFromString(Heimdall_Data.config.who.queries) | ||||||
|  |  | ||||||
| @@ -184,13 +187,9 @@ function shared.Whoer.Init() | |||||||
| 			print(string.format("[%s] ShouldNotifyForZone %s", ModuleName, inputZone)) | 			print(string.format("[%s] ShouldNotifyForZone %s", ModuleName, inputZone)) | ||||||
| 		end | 		end | ||||||
| 		for zone, _ in pairs(Heimdall_Data.config.who.zoneNotifyFor) do | 		for zone, _ in pairs(Heimdall_Data.config.who.zoneNotifyFor) do | ||||||
| 			if Heimdall_Data.config.who.debug then print(string.format("[%s] Checking zone %s", ModuleName, zone)) end |  | ||||||
| 			if zone == "*" then return true end |  | ||||||
| 			if string.find(inputZone, zone) then | 			if string.find(inputZone, zone) then | ||||||
| 				if not Heimdall_Data.config.who.debug then | 				if not Heimdall_Data.config.who.debug then | ||||||
| 					print( | 					print(string.format("[%s] ShouldNotifyForZone %s is true thanks to %s", ModuleName, inputZone, zone)) | ||||||
| 						string.format("[%s] ShouldNotifyForZone %s is true thanks to %s", ModuleName, inputZone, zone) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 				return true | 				return true | ||||||
| 			end | 			end | ||||||
| @@ -230,25 +229,6 @@ function shared.Whoer.Init() | |||||||
| 	local function Notify(player) | 	local function Notify(player) | ||||||
| 		if Heimdall_Data.config.who.debug then | 		if Heimdall_Data.config.who.debug then | ||||||
| 			print(string.format("[%s] Processing notification for player: %s", ModuleName, player.name)) | 			print(string.format("[%s] Processing notification for player: %s", ModuleName, player.name)) | ||||||
| 			print( |  | ||||||
| 				string.format( |  | ||||||
| 					"[%s] Player details - Guild: %s, Race: %s, Class: %s, Zone: %s", |  | ||||||
| 					ModuleName, |  | ||||||
| 					player.guild, |  | ||||||
| 					player.race, |  | ||||||
| 					player.class, |  | ||||||
| 					player.zone |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 			print( |  | ||||||
| 				string.format( |  | ||||||
| 					"[%s] Player history - First seen: %s, Last seen: %s, Seen count: %d", |  | ||||||
| 					ModuleName, |  | ||||||
| 					player.firstSeen, |  | ||||||
| 					player.lastSeen, |  | ||||||
| 					player.seenCount |  | ||||||
| 				) |  | ||||||
| 			) |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not Heimdall_Data.config.who.enabled then | 		if not Heimdall_Data.config.who.enabled then | ||||||
| @@ -268,30 +248,26 @@ function shared.Whoer.Init() | |||||||
| 		if not shared.Whoer.ShouldNotifyForZone(player.zone) then | 		if not shared.Whoer.ShouldNotifyForZone(player.zone) then | ||||||
| 			--if not Heimdall_Data.config.who.zoneNotifyFor[player.zone] then | 			--if not Heimdall_Data.config.who.zoneNotifyFor[player.zone] then | ||||||
| 			if Heimdall_Data.config.who.debug then | 			if Heimdall_Data.config.who.debug then | ||||||
| 				print( | 				print(string.format("[%s] Skipping notification - Zone '%s' not in notify list", ModuleName, player.zone)) | ||||||
| 					string.format("[%s] Skipping notification - Zone '%s' not in notify list", ModuleName, player.zone) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
| 			return string.format("Not notifying for zone %s", tostring(player.zone)) | 			return string.format("Not notifying for zone %s", tostring(player.zone)) | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | ||||||
| 			local locale = shared.GetLocaleForChannel(channel) | 			local locale = shared.GetLocaleForChannel(channel) | ||||||
| 			local text = string.format( | 			local text = string.format(shared._L("whoerNew", locale), | ||||||
| 				shared._L("whoerNew", locale), |  | ||||||
| 				player.name, | 				player.name, | ||||||
| 				player.stinky and "(!!!!)" or "", | 				player.stinky and "(!!!!)" or "", | ||||||
| 				shared._L(player.class, locale), | 				shared._L(player.class, locale), | ||||||
| 				--shared._L(player.race, locale), | 				--shared._L(player.race, locale), | ||||||
| 				shared._L(shared.raceMap[player.race] or "unknown", locale), | 				shared._L(shared.raceMap[player.race] or "unknown", locale), | ||||||
| 				player.guild, | 				player.guild, | ||||||
| 				shared._L(player.zone, locale) | 				shared._L(player.zone, locale)) | ||||||
| 			) |  | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local msg = { | 			local msg = { | ||||||
| 				channel = "C", | 				channel = "C", | ||||||
| 				data = channel, | 				data = channel, | ||||||
| 				message = text, | 				message = text | ||||||
| 			} | 			} | ||||||
| 			if Heimdall_Data.config.who.debug then | 			if Heimdall_Data.config.who.debug then | ||||||
| 				print(string.format("[%s] Queuing channel notification", ModuleName)) | 				print(string.format("[%s] Queuing channel notification", ModuleName)) | ||||||
| @@ -335,22 +311,20 @@ function shared.Whoer.Init() | |||||||
| 		end | 		end | ||||||
| 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | ||||||
| 			local locale = shared.GetLocaleForChannel(channel) | 			local locale = shared.GetLocaleForChannel(channel) | ||||||
| 			local text = string.format( | 			local text = string.format(shared._L("whoerMoved", locale), | ||||||
| 				shared._L("whoerMoved", locale), |  | ||||||
| 				player.name, | 				player.name, | ||||||
| 				player.stinky and "(!!!!)" or "", | 				player.stinky and "(!!!!)" or "", | ||||||
| 				shared._L(player.class, locale), | 				shared._L(player.class, locale), | ||||||
| 				--shared._L(player.race, locale), | 				--shared._L(player.race, locale), | ||||||
| 				shared._L(shared.raceMap[player.race] or "unknown", locale), | 				shared._L(shared.raceMap[player.race] or "unknown", locale), | ||||||
| 				player.guild, | 				player.guild, | ||||||
| 				shared._L(zone, locale) | 				shared._L(zone, locale)) | ||||||
| 			) |  | ||||||
|  |  | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local msg = { | 			local msg = { | ||||||
| 				channel = "C", | 				channel = "C", | ||||||
| 				data = channel, | 				data = channel, | ||||||
| 				message = text, | 				message = text | ||||||
| 			} | 			} | ||||||
| 			if Heimdall_Data.config.who.debug then | 			if Heimdall_Data.config.who.debug then | ||||||
| 				print(string.format("[%s] Queuing channel notification", ModuleName)) | 				print(string.format("[%s] Queuing channel notification", ModuleName)) | ||||||
| @@ -386,22 +360,20 @@ function shared.Whoer.Init() | |||||||
|  |  | ||||||
| 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | 		for _, channel in pairs(Heimdall_Data.config.who.channels) do | ||||||
| 			local locale = shared.GetLocaleForChannel(channel) | 			local locale = shared.GetLocaleForChannel(channel) | ||||||
| 			local text = string.format( | 			local text = string.format(shared._L("whoerGone", locale), | ||||||
| 				shared._L("whoerGone", locale), |  | ||||||
| 				player.name, | 				player.name, | ||||||
| 				player.stinky and "(!!!!)" or "", | 				player.stinky and "(!!!!)" or "", | ||||||
| 				shared._L(player.class, locale), | 				shared._L(player.class, locale), | ||||||
| 				--shared._L(player.race, locale), | 				--shared._L(player.race, locale), | ||||||
| 				shared._L(shared.raceMap[player.race] or "unknown", locale), | 				shared._L(shared.raceMap[player.race] or "unknown", locale), | ||||||
| 				player.guild, | 				player.guild, | ||||||
| 				shared._L(player.zone, locale) | 				shared._L(player.zone, locale)) | ||||||
| 			) |  | ||||||
|  |  | ||||||
| 			---@type Message | 			---@type Message | ||||||
| 			local msg = { | 			local msg = { | ||||||
| 				channel = "C", | 				channel = "C", | ||||||
| 				data = channel, | 				data = channel, | ||||||
| 				message = text, | 				message = text | ||||||
| 			} | 			} | ||||||
| 			if Heimdall_Data.config.who.debug then | 			if Heimdall_Data.config.who.debug then | ||||||
| 				print(string.format("[%s] Queuing channel notification", ModuleName)) | 				print(string.format("[%s] Queuing channel notification", ModuleName)) | ||||||
| @@ -432,7 +404,6 @@ function shared.Whoer.Init() | |||||||
| 	frame:SetScript("OnEvent", function(self, event, ...) | 	frame:SetScript("OnEvent", function(self, event, ...) | ||||||
| 		if Heimdall_Data.config.who.debug then | 		if Heimdall_Data.config.who.debug then | ||||||
| 			print(string.format("[%s] WHO list update received", ModuleName)) | 			print(string.format("[%s] WHO list update received", ModuleName)) | ||||||
| 			print(string.format("[%s] Query index: %d/%d", ModuleName, whoQueryIdx, #shared.WhoQueryService.queries)) |  | ||||||
| 		end | 		end | ||||||
|  |  | ||||||
| 		if not Heimdall_Data.config.who.enabled then | 		if not Heimdall_Data.config.who.enabled then | ||||||
| @@ -459,9 +430,7 @@ function shared.Whoer.Init() | |||||||
| 		for i = 1, results do | 		for i = 1, results do | ||||||
| 			local name, guild, level, race, class, zone = GetWhoInfo(i) | 			local name, guild, level, race, class, zone = GetWhoInfo(i) | ||||||
| 			if Heimdall_Data.config.who.debug then | 			if Heimdall_Data.config.who.debug then | ||||||
| 				print( | 				print(string.format("[%s] Processing result %d/%d: %s/%s/%s", ModuleName, i, results, name, class, zone)) | ||||||
| 					string.format("[%s] Processing result %d/%d: %s/%s/%s", ModuleName, i, results, name, class, zone) |  | ||||||
| 				) |  | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			local continue = false | 			local continue = false | ||||||
| @@ -469,15 +438,11 @@ function shared.Whoer.Init() | |||||||
| 			local filters = query.filters | 			local filters = query.filters | ||||||
| 			for _, filter in pairs(filters) do | 			for _, filter in pairs(filters) do | ||||||
| 				if Heimdall_Data.config.who.debug then | 				if Heimdall_Data.config.who.debug then | ||||||
| 					print( | 					print(string.format("[%s] Running filter %s on %s/%s/%s", ModuleName, filter.key, name, class, zone)) | ||||||
| 						string.format("[%s] Running filter %s on %s/%s/%s", ModuleName, filter.key, name, class, zone) |  | ||||||
| 					) |  | ||||||
| 				end | 				end | ||||||
| 				if not filter.Run(name, guild, level, race, class, zone) then | 				if not filter.Run(name, guild, level, race, class, zone) then | ||||||
| 					if Heimdall_Data.config.who.debug then | 					if Heimdall_Data.config.who.debug then | ||||||
| 						print( | 						print(string.format("[%s] Player %s filtered out by WHO filter %s", ModuleName, name, filter.key)) | ||||||
| 							string.format("[%s] Player %s filtered out by WHO filter %s", ModuleName, name, filter.key) |  | ||||||
| 						) |  | ||||||
| 					end | 					end | ||||||
| 					continue = true | 					continue = true | ||||||
| 					break | 					break | ||||||
| @@ -489,15 +454,13 @@ function shared.Whoer.Init() | |||||||
| 					print(string.format("[%s] Ignoring blacklisted player: %s", ModuleName, name)) | 					print(string.format("[%s] Ignoring blacklisted player: %s", ModuleName, name)) | ||||||
| 				end | 				end | ||||||
| 				continue = true | 				continue = true | ||||||
|  | 			else | ||||||
|  | 				if Heimdall_Data.config.who.debug then | ||||||
|  | 					print(string.format("[%s] Player %s is not blacklisted", ModuleName, name)) | ||||||
|  | 				end | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.who.debug then |  | ||||||
| 				print(string.format("[%s] Player %s is not blacklisted", ModuleName, name)) |  | ||||||
| 			end |  | ||||||
| 			if not continue then | 			if not continue then | ||||||
| 				if Heimdall_Data.config.who.debug then |  | ||||||
| 					print(string.format("[%s] Player %s is not filtered out", ModuleName, name)) |  | ||||||
| 				end |  | ||||||
| 				local timestamp = date("%Y-%m-%dT%H:%M:%S") | 				local timestamp = date("%Y-%m-%dT%H:%M:%S") | ||||||
| 				local player = HeimdallStinkies[name] | 				local player = HeimdallStinkies[name] | ||||||
| 				if not player then | 				if not player then | ||||||
| @@ -512,15 +475,8 @@ function shared.Whoer.Init() | |||||||
|  |  | ||||||
| 					if existing then | 					if existing then | ||||||
| 						if Heimdall_Data.config.who.debug then | 						if Heimdall_Data.config.who.debug then | ||||||
| 							print( | 							print(string.format("[%s] Found existing data for %s - Last seen: %s, Count: %d", | ||||||
| 								string.format( | 								ModuleName, name, existing.lastSeen or "never", existing.seenCount or 0)) | ||||||
| 									"[%s] Found existing data for %s - Last seen: %s, Count: %d", |  | ||||||
| 									ModuleName, |  | ||||||
| 									name, |  | ||||||
| 									existing.lastSeen or "never", |  | ||||||
| 									existing.seenCount or 0 |  | ||||||
| 								) |  | ||||||
| 							) |  | ||||||
| 						end | 						end | ||||||
| 						player.lastSeen = existing.lastSeen or "never" | 						player.lastSeen = existing.lastSeen or "never" | ||||||
| 						player.firstSeen = existing.firstSeen or "never" | 						player.firstSeen = existing.firstSeen or "never" | ||||||
| @@ -541,15 +497,13 @@ function shared.Whoer.Init() | |||||||
| 						end | 						end | ||||||
| 						player.stinky = true | 						player.stinky = true | ||||||
| 						--PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master") | 						--PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master") | ||||||
| 						-- else | 					else | ||||||
| 						-- 	PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master") | 						--PlaySoundFile("Interface\\Sounds\\Cloak.ogg", "Master") | ||||||
| 					end | 					end | ||||||
|  |  | ||||||
| 					local err = Notify(player) | 					local err = Notify(player) | ||||||
| 					if err then | 					if err then | ||||||
| 						print( | 						print(string.format("[%s] Error notifying for %s: %s", ModuleName, tostring(name), tostring(err))) | ||||||
| 							string.format("[%s] Error notifying for %s: %s", ModuleName, tostring(name), tostring(err)) |  | ||||||
| 						) |  | ||||||
| 					end | 					end | ||||||
|  |  | ||||||
| 					player.lastSeen = timestamp | 					player.lastSeen = timestamp | ||||||
| @@ -560,18 +514,13 @@ function shared.Whoer.Init() | |||||||
| 				player.lastSeenInternal = GetTime() | 				player.lastSeenInternal = GetTime() | ||||||
| 				if player.zone ~= zone then | 				if player.zone ~= zone then | ||||||
| 					if Heimdall_Data.config.who.debug then | 					if Heimdall_Data.config.who.debug then | ||||||
| 						print( | 						print(string.format("[%s] Player %s zone changed from %s to %s", ModuleName, name, player.zone, | ||||||
| 							string.format( | 							zone)) | ||||||
| 								"[%s] Player %s zone changed from %s to %s", |  | ||||||
| 								ModuleName, |  | ||||||
| 								name, |  | ||||||
| 								player.zone, |  | ||||||
| 								zone |  | ||||||
| 							) |  | ||||||
| 						) |  | ||||||
| 					end | 					end | ||||||
| 					local err = NotifyZoneChanged(player, zone) | 					local err = NotifyZoneChanged(player, zone) | ||||||
| 					if err then print(string.format("Error notifying for %s: %s", tostring(name), tostring(err))) end | 					if err then | ||||||
|  | 						print(string.format("Error notifying for %s: %s", tostring(name), tostring(err))) | ||||||
|  | 					end | ||||||
| 				end | 				end | ||||||
| 				player.zone = zone | 				player.zone = zone | ||||||
| 				player.lastSeen = timestamp | 				player.lastSeen = timestamp | ||||||
| @@ -610,29 +559,16 @@ function shared.Whoer.Init() | |||||||
| 			local query = shared.WhoQueryService.queries[whoQueryIdx] | 			local query = shared.WhoQueryService.queries[whoQueryIdx] | ||||||
| 			if not query then | 			if not query then | ||||||
| 				if Heimdall_Data.config.who.debug then | 				if Heimdall_Data.config.who.debug then | ||||||
| 					print(string.format("[%s] Error: No WHO query found to run at index %d", ModuleName, whoQueryIdx)) | 					print(string.format("[%s] Error: No WHO query found to run", ModuleName)) | ||||||
| 				end | 				end | ||||||
| 				return | 				return | ||||||
| 			end | 			end | ||||||
|  |  | ||||||
| 			if Heimdall_Data.config.who.debug then |  | ||||||
| 				print( |  | ||||||
| 					string.format( |  | ||||||
| 						"[%s] Running WHO query %d/%d: %s", |  | ||||||
| 						ModuleName, |  | ||||||
| 						whoQueryIdx, |  | ||||||
| 						#shared.WhoQueryService.queries, |  | ||||||
| 						query.query |  | ||||||
| 					) |  | ||||||
| 				) |  | ||||||
| 				print(string.format("[%s] Query has %d filters", ModuleName, #query.filters)) |  | ||||||
| 				for i, filter in ipairs(query.filters) do |  | ||||||
| 					print(string.format("[%s] Filter %d: %s", ModuleName, i, filter.key)) |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 			whoQueryIdx = whoQueryIdx + 1 | 			whoQueryIdx = whoQueryIdx + 1 | ||||||
| 			if whoQueryIdx > #shared.WhoQueryService.queries then whoQueryIdx = 1 end | 			if whoQueryIdx > #shared.WhoQueryService.queries then | ||||||
|  | 				whoQueryIdx = 1 | ||||||
|  | 			end | ||||||
| 			lastQuery = query | 			lastQuery = query | ||||||
|  | 			--print(string.format("Running who query: %s", tostring(query.query))) | ||||||
| 			---@diagnostic disable-next-line: param-type-mismatch | 			---@diagnostic disable-next-line: param-type-mismatch | ||||||
| 			SetWhoToUI(1) | 			SetWhoToUI(1) | ||||||
| 			SendWho(query.query) | 			SendWho(query.query) | ||||||
|   | |||||||
| @@ -6,7 +6,9 @@ local function StringToMap(str, deliminer) | |||||||
| 	local parts = { strsplit(deliminer, str) } | 	local parts = { strsplit(deliminer, str) } | ||||||
| 	for _, line in ipairs(parts) do | 	for _, line in ipairs(parts) do | ||||||
| 		line = strtrim(line) | 		line = strtrim(line) | ||||||
| 		if line ~= "" then map[line] = true end | 		if line ~= "" then | ||||||
|  | 			map[line] = true | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	return map | 	return map | ||||||
| end | end | ||||||
| @@ -19,7 +21,9 @@ local function StringToArray(str, deliminer) | |||||||
| 	local array = { strsplit(deliminer, str) } | 	local array = { strsplit(deliminer, str) } | ||||||
| 	for i, line in ipairs(array) do | 	for i, line in ipairs(array) do | ||||||
| 		line = strtrim(line) | 		line = strtrim(line) | ||||||
| 		if line ~= "" then ret[i] = line end | 		if line ~= "" then | ||||||
|  | 			ret[i] = line | ||||||
|  | 		end | ||||||
| 	end | 	end | ||||||
| 	return ret | 	return ret | ||||||
| end | end | ||||||
| @@ -35,7 +39,7 @@ local config = { | |||||||
| 		stinky = aura_env.config.spotter.stinky, | 		stinky = aura_env.config.spotter.stinky, | ||||||
| 		notifyChannel = aura_env.config.spotter.notifyChannel, | 		notifyChannel = aura_env.config.spotter.notifyChannel, | ||||||
| 		zoneOverride = aura_env.config.spotter.zoneOverride, | 		zoneOverride = aura_env.config.spotter.zoneOverride, | ||||||
| 		throttleTime = aura_env.config.spotter.throttleTime, | 		throttleTime = aura_env.config.spotter.throttleTime | ||||||
| 	}, | 	}, | ||||||
| 	who = { | 	who = { | ||||||
| 		enabled = aura_env.config.who.enabled, | 		enabled = aura_env.config.who.enabled, | ||||||
|   | |||||||
							
								
								
									
										91
									
								
								release.sh
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								release.sh
									
									
									
									
									
								
							| @@ -1,62 +1,43 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| echo "Figuring out the tag..." | # Default version increment | ||||||
| TAG=$(git describe --tags --exact-match 2>/dev/null || echo "") | DEFAULT_INCREMENT="0.0.1" | ||||||
| if [ -z "$TAG" ]; then |  | ||||||
|   # Get the latest tag |  | ||||||
|   LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) |  | ||||||
|   # Increment the patch version |  | ||||||
|   IFS='.' read -r -a VERSION_PARTS <<< "$LATEST_TAG" |  | ||||||
|   VERSION_PARTS[2]=$((VERSION_PARTS[2]+1)) |  | ||||||
|   TAG="${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.${VERSION_PARTS[2]}" |  | ||||||
|   # Create a new tag |  | ||||||
|   git tag $TAG |  | ||||||
| fi |  | ||||||
| echo "Tag: $TAG" |  | ||||||
|  |  | ||||||
| echo "Building the thing..." | # Get the increment parameter or use the default | ||||||
| sed -i "s/## Version: .*/## Version: $TAG/" Heimdall.toc | INCREMENT=${1:-$DEFAULT_INCREMENT} | ||||||
| sed -i "s/local VERSION = .*/local VERSION = \"$TAG\"/" Heimdall.lua |  | ||||||
| git add Heimdall.toc Heimdall.lua |  | ||||||
| git commit -m "Release $TAG" |  | ||||||
| git tag -f $TAG |  | ||||||
| git push origin $TAG |  | ||||||
| exit 0 |  | ||||||
|  |  | ||||||
| rm Heimdall-${TAG}.zip | # Function to increment the version | ||||||
| mkdir Heimdall | increment_version() { | ||||||
| cp *.lua *.toc Heimdall |     local version=$1 | ||||||
| cp -r Modules Heimdall |     local increment=$2 | ||||||
| cp -r Sounds Heimdall |  | ||||||
| cp -r Texture Heimdall |  | ||||||
| 7z a Heimdall-${TAG}.zip Heimdall |  | ||||||
| rm -rf Heimdall |  | ||||||
|  |  | ||||||
| echo "Creating a release..." |     IFS='.' read -r -a version_parts <<< "$version" | ||||||
| TOKEN="$GITEA_API_KEY" |     IFS='.' read -r -a increment_parts <<< "$increment" | ||||||
| GITEA="https://git.site.quack-lab.dev" |  | ||||||
| REPO="dave/wow-heimdall" |  | ||||||
| # Create a release |  | ||||||
| RELEASE_RESPONSE=$(curl -s -X POST \ |  | ||||||
|   -H "Authorization: token $TOKEN" \ |  | ||||||
|   -H "Accept: application/json" \ |  | ||||||
|   -H "Content-Type: application/json" \ |  | ||||||
|   -d '{ |  | ||||||
|     "tag_name": "'"$TAG"'", |  | ||||||
|     "name": "'"$TAG"'", |  | ||||||
|     "draft": false, |  | ||||||
|     "prerelease": false |  | ||||||
|   }' \ |  | ||||||
|   $GITEA/api/v1/repos/$REPO/releases) |  | ||||||
|  |  | ||||||
| # Extract the release ID |     # Increment major, minor, and patch | ||||||
| echo $RELEASE_RESPONSE |     version_parts[0]=$((version_parts[0] + increment_parts[0])) | ||||||
| RELEASE_ID=$(echo $RELEASE_RESPONSE | awk -F'"id":' '{print $2+0; exit}') |     version_parts[1]=$((version_parts[1] + increment_parts[1])) | ||||||
| echo "Release ID: $RELEASE_ID" |     version_parts[2]=$((version_parts[2] + increment_parts[2])) | ||||||
|  |  | ||||||
| echo "Uploading the things..." |     # Reset minor and patch if major is incremented | ||||||
| curl -X POST \ |     if [ "${increment_parts[0]}" -gt 0 ]; then | ||||||
|   -H "Authorization: token $TOKEN" \ |         version_parts[1]=0 | ||||||
|   -F "attachment=@Heimdall-${TAG}.zip" \ |         version_parts[2]=0 | ||||||
|   "$GITEA/api/v1/repos/$REPO/releases/${RELEASE_ID}/assets?name=Heimdall-${TAG}.zip" |     elif [ "${increment_parts[1]}" -gt 0 ]; then | ||||||
| rm Heimdall-${TAG}.zip |         version_parts[2]=0 | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     echo "${version_parts[0]}.${version_parts[1]}.${version_parts[2]}" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | CURRENT_VERSION=$(grep -oP '## Version: \K[0-9]+\.[0-9]+\.[0-9]+' Heimdall.toc) | ||||||
|  | NEW_VERSION=$(increment_version "$CURRENT_VERSION" "$INCREMENT") | ||||||
|  | sed -i "s/## Version: $CURRENT_VERSION/## Version: $NEW_VERSION/" Heimdall.toc | ||||||
|  | sed -i "s/local VERSION = \"$CURRENT_VERSION\"/local VERSION = \"$NEW_VERSION\"/" Heimdall.lua | ||||||
|  |  | ||||||
|  | # Git operations | ||||||
|  | git add Heimdall.lua Heimdall.toc | ||||||
|  | git commit -m "Release $NEW_VERSION" | ||||||
|  | git tag "$NEW_VERSION" | ||||||
|  |  | ||||||
|  | echo "Deployment complete. New version: $NEW_VERSION" | ||||||
| @@ -1 +0,0 @@ | |||||||
| C:/Users/Administrator/Seafile/Games-WoW/Ruski/Interface/AddOns/Heimdall/Meta/stylua.toml |  | ||||||
		Reference in New Issue
	
	Block a user