-
Posted by myk3 on Sat, 28 May 2011 21:07:42
ok, ive tried to write this code 5 times now, and i keep failing..
the 2nd time i wrote it, it worked... 30%, and was not a queue, it had an error where the script was talking to itself and not on the addon channel... yes it did communicate on the addon channel but was very random in making its descions...
now... this is what im trying to accomplish.. it is a guild chat addon, so keep in mind.
Build a QUEUE that allows many people to run this addon, and who ever is LEADER in the queue shuts off all other addons by "ADDONNAME:UnregisterEvent("THISEVENT")" but at the same time, the others that arent lead, still scan the addon channel to find out when the leader logs off, using the isUnitOnline(), the main idea is to give the GuildMaster priority over Officers and give Officers priority over Veterans.. etc...
Now, The next part of the code, which i havent started ... mainly because i cant get the queue to turn off and turn on the addon on specified users the way it should, is to transmit the SAVEDVARIABLES in their database, and share them with other users running this addon, so they operate on a shared level of information... some information must allways remain unchangeable on the GuildMasters Database thou...
here is my 4th attempt at writting this code... it is severly broken, but it is because i didnt waste time putting the exact variables in, Because im not sure how it is exactly gonna operate - But this is the design and style.. (i believe?!) and format it should look like..
guildbot2 = CreateFrame("frame") local queue = 0 guildbot2:RegisterEvent("CHAT_MSG_GUILD"); guildbot2:SetScript("OnEvent", function(_, event, ...) guildbot2[event](...) end); local databaseupdate = CreateFrame("Frame", "ViewAddonMessageFrame") local function printMsg(_, _, prefix, msg2, type, sender) ChatFrame3:AddMessage("["..prefix.."]["..msg2.."]["..type.."]["..sender.."]") function QueueAdd( queue, qnewname, qnewvalue ) -- adds or creates a new value if queue == nil then -- if the queue is empty create a new one queue = { qname = qnewname, qvalue = qnewvalue } -- add this as root return queue -- return the new queue else if qnewvalue < 1 then -- if less, recursively add return QueueAdd( queue, qnewname, qnewvalue ) else -- otherwise, add same return QueueAdd( queue, qname, qvalue ) end end end function QueueMin( queue, qname) -- returns with the smallest value if queue == nil then -- if the queue is empty, return nil return nil else if queue ~= 0 then -- recursively return QueuePeek( queue, qname ) else -- if no name is found, it will be the smallest value return queue end end function QueuePeek( queue, qname ) -- returns the next value without removing it local min = QueueMin ( queue, qname ) return min.qvalue end function QueueNext( queue, name )-- returns the next value after removing it from the queue local min = QueueMin ( queue, name ) local minValue = min.qvalue if min.qvalue == nil then-- check to see if the minimum has children min = nil -- if so, remove it else -- otherwise, replace the minimum with the other value min = min.qvalue end return minValue -- return the minimum value end end SendAddonMessage("GBOT!Q", "QUEUE DATA:", "GUILD", "SENDER") end databaseupdate:SetScript("OnEvent", printMsg) databaseupdate:RegisterEvent("CHAT_MSG_ADDON") function guildbot2.CHAT_MSG_GUILD(msg, sender, ...) -- if strfind(msg, string.upper("$TEST")) then queue = queue + 1 SendAddonMessage("GBOT!Q", queue, "GUILD", "SENDER") --print("test?channel") --debugging -- end; end
and like i said, this doesnt work, its an almost perfect frame for the final code... just how it works...
-
Posted by jnwhiteh on Sat, 28 May 2011 21:40:47
You don't really ask a question, and what you are attempting to solve is a very very difficult problem. If you have a specific question, I can try to answer it for you, but I'm not sure how to respond when there's no actual question..
-
Posted by myk3 on Sat, 28 May 2011 21:43:17
the question is:
i failed 5 times, how do i make this work?
-
Posted by jnwhiteh on Sat, 28 May 2011 21:52:11
I can't tell you how to write the addon.. I barely have time enough to write my own addons, spec things out and get everything working precisely as they need to. I can answer any specific questions you have, but a bunch of code with no description of what it does or what doesn't work doesn't give me all that much to work with.
I'm a really helpful person, but I can't copy your code, put it in an addon, load up WoW, get people with the guild ready to test it, etc. You see my point, I'm sure..
You've gotta give me more to work with.. I can't just make it work for you.
-
Posted by jnwhiteh on Sat, 28 May 2011 21:54:22
The only comments I would make:
You're conflating the 'queue' and the communication portion of the addon. A queue is trivial, its just a table that you add things to the end of the queue using table.insert and pop things from the queue using table.remove. You can peek just by looking at the first element. None of that is relevant really, since that's the easy part of the addon.
You've gotta pick one. Do you want the communication working first or the queue? If it's a queue implementation, that's simple. Give me what you have and tell me what doesn't work and we'll see what we can do. If you want the communication stuff, drop the queue nonsense and just get that code working properly.
Don't try to do them both at once, that's just going to confuse both of us.
-
Posted by myk3 on Sat, 28 May 2011 22:13:04
yea... i figured the communications would be easy... easier than this...
What im trying to accomplish is this:
Share QUEDATA variable on the addonchannel and it should be formated like this:
username - Queue position - Rank
client1 - 0 - GM
client2 - 1 - officer
client3 - 2 - officer
client4 - 3 - member
basically, client1 tells all the others to addon:unregisterEvent("ThisEvent")
and client2-4 (or more..) continue to run this check
if isUserOnline() == 0 then RemoveQueuePostion0() if Queue position = 0 then addon:registerevent("thisevent") else --addon:unregisterevent("thisevent") --remarked cause it shouldnt have to dissable if it is allready dissabled - unnecessary, just for example. end --then somewhere down the code the final end would come in to close function
but the queue has to function properly (not exactly sure how to do it either, i drove myself insane with saying the word QUEUE over and over..) to add the users in the queue who are currently running the addon by once again brodcasting on the addonchannel.. it really doesnt need a peek function, just a register and remove...
maybe something like this:
SendAddonMessage("GBOT!Q", "ONLINE", "GUILD", "SENDER")
-
Posted by jnwhiteh on Sun, 29 May 2011 08:38:42
I don't know why you need a queue at all. What you're talking about is the dynamic election of a 'master' based on some criteria. Don't worry about unregistering events, just have it running all the time.
- When someone new signs on, they broadcast asking who the master is and what their rank is.
- If the new player has a higher rank than the current master, then they call for an election.
- Only those people who are higher than the current master send their rank, and one of those is chosen deterministically by some algorithm.
- The new master is broadcast to the channel so everyone knows who it is
Why doesn't something like that work.
-
Posted by myk3 on Sun, 29 May 2011 09:19:12
ok 1 more time... i have an addon i built... and it has to unregister the event on all the other users running it otherwise when you enter a command you will get double posts... spam...
ok about the 1,2,3,4... it might work,.,, but... the addon is a guild chat mod...
basically it takes commands typed into the guild chat for example:
$HELP
will give you a list of commands availible... i choose a command driven interface, because other users dont have to download this addon and install it to have functionality with it... I will add more gui later...
(reason why the addon has to have a master and dissable the others, otherwise your one command will trigger 5 responses...)
you can check the addon out on curse or curseforge.. this is one of my most technical updates... and the queue is only 10% of the update from version 1.6.25 ---> 1.7
here are some links if you need a little help understanding why it must shut the others off... trust me it will make perfect sense!
http://wow.curse.com/downloads/wow-addons/details/guildbot.aspx
http://wow.curseforge.com/addons/guildbot/
http://www.wowinterface.com/downloads/info19864-GuildBOT.html
all the same project... but this is killing me... i have some ideas to try, but... its not working the way i wanted it to...
here is the list for this planned update from 1.6.25 --> 1.7
adding this functionality, no new data just gears:
--add Guildmaster detection, give priority to GM over officers, Give officers priority over Members.
--if other users are using guildbot dissable and check queue for online update status
-- disable guildmaster $GM command if not GM
--check database --- update new users in database so officers can use guildbot and remain online when the gm isn't
--check other status's and update current values for stats
-- modify values for raidbot so when a new value is added when gm isnt online, it continually adds them to a total database
--modify lagbot - can now share data to give average of users w/ guildbot
--events - contests - website need to STAY on GM's database values at all times
(sorry for the long post... but u can see its kinda techie...)
-
Posted by jnwhiteh on Sun, 29 May 2011 09:37:47
Again, I cannot write the addon for you. If you have a question, I can answer it but I frankly just do not have the time to download your addon and then try to figure out what needs to be changed. I just cannot.