--[[ Guild Event Manager by Kiki of European Cho'gall (Alliance) Version 2.08 Home Page : http://christophe.calmejane.free.fr/wow/gem/ --- ChangeLog : ---------------- - 2.08 : - April, 11th 2006 : - You can now configure channels from the options (but cannot see members from other channels yet) - March, 31th 2006 : - Updated TOC for 1.10 - Fixed 'N' text in minimap icon flashing sometimes, while there is no new event - Increased date column width, and added date in the tooltip - Added a new color code in Admin list : Blue=Connected but not grouped, Green=Connected and grouped - 2.07 : - March, 16th 2006 : - Fixed lua error in New event if you load a template created before Auto-members additionnal code - Finally fixed channels init errors. Password protected channels should work too. - March, 15th 2006 : - Fixed lua error in Admin list popup if not leader - You can now force yourself into replacement queue - Fixed force titular button not working, if the player was not in replacement queue before - March, 13th 2006 : - Handling "Force titular" param in Sorting of members - March, 10th 2006 : - Added possibility to ignore a closed event (new button) - Fixed bug in the ignore option (a previously ignored event might reappear) - March, 9th 2006 : - Added confirmation dialog for Delete Template (New event tab) - Fixed wrong reset instance day, around midnight - Added possibility to Auto-add members to an event (NOT FINISHED YET !! NO CHECKS !) - Saving Auto-members to templates - Added possibility to move a member back and forth Replacement queue - Added possibility to force a member in titular list - 2.06 : - March, 7th 2006 : - Fixed : some events not removed from the list, when changing channel - Auto-purging players that didn't connect since 1 month - Fixed players not sending any data when they first log in the channel - Added Events Calendar view (not finished yet) - Possibility to show instances reset from the calendar view - March, 3rd 2006 : - Increased EventsList size (2 more items), needed to incoming new EventView [ Previous changes in readme.txt file ] --- Description : ---------------- This AddOn allows you to create/schedule/manage future raid instance directly in-game. Players can register (join) and reserve a room for your instance, or cancel subscription. You can setup a maximum players for your event, as well as the min/max per class. When a player wants to join and there is no room left for his class, he is put in a *substitute* queue, waiting for someone to cancel his subscription. The leader of an event does not have to be logged in for a player to subscribe. This addon has been designed to help guilds to schedule events, and its member to say *I'll be there*, and count the number of players that are ok for an instance. It does work for multiple guilds (kind of Alliance of guilds), if you want, or even with your friend list. All dates are stored in universal time, and displayed in local time, so if someone creates an event in a different timezone than yours, you will see the correct time on your side. --- Installation : --------------- 1. Extract .zip file to WorldOfWarcraft\Interface\AddOns\ 2. load up WoW check the Addon is enabled ("/gem help" should print infos) 3. Bind a key to GuildEventManager or type "/gem toggle" 4. in the options TAB set the channel to whichever you are going to use --- Notes : -------- COLOR CODE : - Events List in Events Tab, Where column : - White = Old event (already displayed) - Green = New event (never seen) - Events List in Events Tab, Leader column : - White = Leader not connected - Green = Leader connected - Events List in Events Tab, Subscribers column : - White = Not subscribed - Purple = Level of your selected character does not match event's level range - DarkGrey = Subscription sent, but not ACKed yet - Bleu = Subscription ACKed but you are in Substitute queue - Green = Subscription ACKed and you are in Titular list - Yellow = Subscription ACKed and you are in Replacement list - DarkRed = You have been kicked from event (and thus unsubscribed). You can re-subscribe - LightRed = You have been banned from event (and thus unsubscribed). You cannot re-subscribe until you are unbanned - Admin List in Events Tab, Place column : - White = Normal subscriber - Green = Leader or Assistant - Admin List in Events Tab, Name column : - White = Player not connected (or external) - Blue = Player connected but not grouped - Green = Player connected and grouped - Members list, Guild column : - Green = Guild leader - Blue = Guild officer - White = Guild member TODO : - auto kick/ban peoples - REVOIR le code de groupage (detection more raid/group), et virer le warning si je suis deja dans un grp - Faire une verif qd on set un alias, qu'il n'existe pas deja pour un autre canal GEM - Pouvoir changer de reroll dans un EditEvent - Store ServerTimeStamp and os.time() at each startup, for each Realm - WDS : Pour chaque event, envoyer os.time() et ServerTimeStamp - Add a sorting plugin : By assigning points to someone (DKP like) - Add a sorting plugin : By auto adding ppl on a list for the event (only when already created, by using AddExternal) - Find a way to *block* people we don't want to subscribe (auto ban your ignore list, for example) - Add an auto-banned list (in Create new Events tab ?) - Option to limit event creation to officers (not possible but see CanViewOfficerNote() IsGuildLeader() ) - Handle event restrictions (guild only) -- Tag event with a bit 'guild only' - Possibility to modify the subscription comment - GEM_COM_JoinChannel() -> Change DEFAULT_CHAT_FRAME:GetID(), by a value specified in config - New parameter for Events : "Can subscribe only when leader is online" - Handle guild channel as GEM channel - Add a new type of limit : Healers (priest/druid/paladin/shaman) Dps (rogue/mage/hunter) (v666.0) TODO GUI: - Mettre l'option "Notify channel join/leave" par canal - Possibility to remove offline members from the list (right clic on them) - Panel transparency KNOWN BUGS: - Impossible de rejoindre un canal si on reco a griffon (max count 100 reached) CODE TODO : *--*--*--* * To handle multiple channels : GUI -> GEM_Players.lua : GEMPlayers_GetPlayers() must handle multiple channels (and the GUI too) --- FAQ : -------- Q : I don't see events of other people, and others don't see mine A : Are you sure you are on the same channel (check GEM options) ? Are you sure you don't have joined more than 9 channels (there is a limit of 9 or 10 channels you can join) ? Are you sure your PC's clock is correctly set ? If you still don't see events, try "/gem debug 1", it will show a new TAB, look at the debug log (screenshot it) for warnings or event related messages, then contact me. Q : I see garbage on my channels, like "01..." A : Check if the channel you see garbage is the same than the one in your GEM config. Maybe you have changed the channel with a character, and changed reroll. Leave the garbaged one with a /leave ChanNum. In v2.0, channel will be saved per char, so you will not have this problem anymore. Q : I just subscribed to an event, but I don't appear in the list, nor the titulars count has changed. A : If the leader of the event is not logged, all commands (subscribe, unsubscribe, ...) are stored and broadcasted to every person in the channel (and each time someone logs in). In order to see your subscription in the list (and titulars count increased/decreased), you must wait until the leader logs. When he does, all commands are flushed and he processes them, in the order they were submitted. Look at the color codes above, they help you know in which state you are. Q : All thoses stored commands don't flood the channel when someone (or the leader) logs in ? A : No, there is an algorithm that makes people to sent commands at different time when someone joins, and if a known command has just been sent, the sent from your side is canceled. There is also a maximum of commands that can be sent per second, so you are not (less) flooded. Q : I don't like the subscribers sorting modes available. I want something else, custom. A : Well, that's where the Sorting plugin system comes in ! Look at the "GEM_sort_stamp.lua" file, there is all you need to make your own plugin (there is no need for the plugin to be installed on each player's computer, only on the leader's one). Simply make a new addon with a .toc file, that depends on GuildEventManager, and you're done. The plugin will be loaded by GEM, and you'll be able to choose your custom sorting in GEM's "Create new Event" tab. Q : I have a lua error, but I cannot tell you the file/line it occured A : Please install (even temporarily) ImprovedErrorFrame (http://www.curse-gaming.com/mod.php?addid=170), and you'll be able to see the full error text Q : When I link an item to the GEM channel, it displays the name only. A : For links to be sent, you must use the SlashCmd specified in GEM config. If you speak using /# (# being GEM's channel number), it will not work. Q : I don't see anybody in the Members list, and the list populates very slowly. Also, I always see "N/A" for people's location. A : This is to greatly reduce traffic in the channel. Each player sends his personal informations ONLY when he changes of zone, NOT when someone logs in (otherwise every single player will have to send his current info upon each login, which causes too much traffic). Because of this, the first time you come to a channel, we don't see anybody, you must wait for each player to move to another zone. When this happens, the player is saved and stored in your variables, so the next time, only it's current location will show as 'N/A' until he moves. Q : I'm using SlashCmd and alias, and when I try to send a message, I don't see anything in my chatframe, nor I see messages from others. A : Some addons are not hooking chatframe like they should. - If you have GuildAds : Get the latest version, it has been fixed - If you have flagRSP : Get the latest version, it has been fixed - If you have Guilded : Why do you need this one anymore ? oO Q : I don't like the way Dates are displayed. How can I change that ? A : Change the option "Displayed dates format" ingame, in the GEM Configuration tab with the value you want. You can find help on the parameters here : http://www.opengroup.org/onlinepubs/007908799/xsh/strftime.html Q : I don't understand the 'time offset' option A : When someone creates an event, the time/date for the event is (by default, if you don't change the offset in GEM config) relative to it's computer's clock (which uses international time). Example : My computer's clock is set at GMT+1, I play on a server where time is set to GMT. I create an event for tonight 8pm, GEM will flag (create) the event for 8pm GMT+1 (and store it using universal time value), not 8pm GMT (so not the server time). BUT the date will be displayed for eveybody, using their local time. For someone playing on a computer with clock set at GMT+2, the event will show for him at 9pm. The offset value in GEM config, is for people who want events to be shown using server time (or any other time offset), not local time. They can set an offset from local time to match server time. If you don't set anything, it will display/create events based on your computer time (local). Q : When are events removed from the list ? A : Events are auto removed (not closed, removed completly from GEM) 1 hour after event's date for non-leader players, and 10 hours after event's date for leader. Using the previous example, the event will disapear for eveybody at 9pm GMT+1 (so for the guy playing at GMT+2 time, it will disapear when his computer's clock will reachs 10pm). ]] --------------- Default values (you can set to nil, or any string) --------------- GEM_DEFAULT_CHANNEL = "GEMChannelDefault"; GEM_DEFAULT_PASSWORD = nil; GEM_DEFAULT_ALIAS = nil; GEM_DEFAULT_SLASH = nil; --------------- Saved variables --------------- GEM_Events = {}; GEM_Templates = {}; GEM_Players = {}; --------------- Shared variables --------------- GEM_MAJOR = "2"; GEM_MINOR = "08"; GEM_VERSION = GEM_MAJOR.."."..GEM_MINOR; GEM_PlayerName = nil; GEM_Realm = nil; GEM_DefaultSendChannel = nil; GEM_NewMinorVersion = false; GEM_OldVersion = false; GEM_ConnectedPlayers = {}; GEM_YouAreDrunk = false; GEM_ServerOffset = 666; --------------- Local variables --------------- local _GEM_NeedInit = true; local _GEM_MaxJoinRetry = 10; local _GEM_WrongChanNotified = {}; --------------- Internal functions --------------- local function _GEM_Commands(command) local i,j, cmd, param = string.find(command, "^([^ ]+) (.+)$"); if(not cmd) then cmd = command; end if(not cmd) then cmd = ""; end if(not param) then param = ""; end if((cmd == "") or (cmd == "help")) then GEM_ChatPrint(GEM_TEXT_USAGE); GEM_CMD_Help(); else if(not GEM_CMD_Command(cmd,param)) then GEM_ChatPrint(GEM_CHAT_CMD_UNKNOWN); end end end local function _GEM_CheckForJoined(channel) if(GEM_COM_Channels[channel].id ~= 0) then return; end -- Have we joined the channel ? GEM_COM_Channels[channel].id = GetChannelName(channel); if(GEM_COM_Channels[channel].id == 0) then if(GEM_COM_Channels[channel].retries > (_GEM_MaxJoinRetry/2)) then GEM_ChatDebug(GEM_DEBUG_CHANNEL,"_GEM_CheckForJoined : Not in channel '"..channel.."' after "..GEM_COM_Channels[channel].retries.." retries, restarting sequence"); GEM_InitChannels(false); -- Don't return, we need to reschedule elseif(GEM_COM_Channels[channel].retries > _GEM_MaxJoinRetry) then GEM_ChatDebug(GEM_DEBUG_CHANNEL,"_GEM_CheckForJoined : Not in channel '"..channel.."' after "..GEM_COM_Channels[channel].retries.." retries, aborting (channel password protected ?)"); GEM_COM_Channels[channel].retries = 0; return; end GEM_ChatDebug(GEM_DEBUG_CHANNEL,"_GEM_CheckForJoined : Not joined yet, reschedule in 0.25 sec"); GEM_COM_Channels[channel].retries = GEM_COM_Channels[channel].retries + 1; GEMSystem_Schedule(0.25,_GEM_CheckForJoined,channel); -- Re schedule in 250 msec else GEM_COM_Channels[channel].retries = 0; ListChannelByName(channel); GEM_ChatDebug(GEM_DEBUG_CHANNEL,"_GEM_CheckForJoined : Ok joined channel, time to bcast !"); GEM_COM_AliasChannel(channel,GEM_COM_Channels[channel].alias,GEM_COM_Channels[channel].slash); if(GEM_COM_Channels[channel].already_bcast == nil) then GEM_QUE_BuildBroadcastQueues(channel,GEM_PlayerName); GEM_COM_PlayerInfosSingle(channel); GEM_COM_Channels[channel].already_bcast = 1; end end end local function _GEM_CheckPlayerLeft(channel,pl_name) if(GEM_ConnectedPlayers[channel] == nil) then GEM_ConnectedPlayers[channel] = {}; end if(GEM_ConnectedPlayers[channel][pl_name] ~= nil) then local chaninfos = GEM_COM_Channels[channel]; if(chaninfos and chaninfos.notify) then local alias = channel; if(chaninfos.alias and chaninfos.alias ~= "") then alias = chaninfos.alias; end GEM_ChatMsg(alias.." : "..string.format(GEM_TEXT_PLAYER_LEFT,pl_name)); end if(GEM_Players[GEM_Realm] and GEM_Players[GEM_Realm][channel] and GEM_Players[GEM_Realm][channel][pl_name]) then GEM_Players[GEM_Realm][channel][pl_name].lastleave = time(); end GEM_ChatDebug(GEM_DEBUG_CHANNEL,"_GEM_CheckPlayerLeft : Player "..pl_name.." left channel "..channel); GEM_ConnectedPlayers[channel][pl_name] = nil; GEMList_Notify(GEM_NOTIFY_MY_SUBSCRIPTION,""); end end local function _GEM_StartupInitVars() local playerName = UnitName("player"); if((playerName) and (playerName ~= UNKNOWNOBJECT) and (playerName ~= UKNOWNBEING)) then GEM_PlayerName = playerName; GEM_Realm = GetCVar("realmName"); _GEM_NeedInit = false; if(GEM_Events.realms == nil) -- First time module init (ever) then GEM_Events = {}; -- Reset everything GEM_Events.next_event_id = 0; GEM_Events.realms = {}; GEM_Events.MinimapRadiusOffset = 77; GEM_Events.MinimapArcOffset = 296; GEM_Events.MinimapTexture = "Spell_Nature_TimeStop"; GEM_Events.DateFormat = GEM_DATE_FORMAT; --GEM_Events.debug = 1; GEM_Events.debug = nil; end GEM_Events.my_bcast_offset = 2 + math.mod(time(),85); -- Change value each login if(GEM_Events.realms[GEM_Realm] == nil) -- First time in this realm then GEM_Events.realms[GEM_Realm] = {}; GEM_Events.realms[GEM_Realm].events = {}; GEM_Events.realms[GEM_Realm].commands = {}; GEM_Events.realms[GEM_Realm].subscribed = {}; GEM_Events.realms[GEM_Realm].my_names = {}; GEM_Events.realms[GEM_Realm].ChannelPassword = nil; GEM_Events.realms[GEM_Realm].kicked = {}; GEM_Events.realms[GEM_Realm].banned = {}; GEM_Events.realms[GEM_Realm].forward = {}; end if(GEM_Events.realms[GEM_Realm].my_closed_events == nil) -- v2.02 addition then GEM_Events.realms[GEM_Realm].my_closed_events = {}; end if(GEM_Events.realms[GEM_Realm].ignore == nil) -- v2.01 addition then GEM_Events.realms[GEM_Realm].ignore = {}; GEM_Events.realms[GEM_Realm].assistant = {}; end if(GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName] == nil) -- First time with this toon in this realm then GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName] = {}; local _,class = UnitClass("player"); GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].class = class; end local playerGuild = GetGuildInfo("player"); -- Thanks to blizz 1.7 changes, this might not been initialized here GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].level = UnitLevel("player"); GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].guild = playerGuild; GEMOptions_LoadChannelsConfig(GEM_PlayerName); -- Load channels config GEM_InitChannels(true); -- And init channels GEM_COM_InitRoutines(); GEMMinimapButton_Update(); GEM_DBG_SetDebugMode(GEM_Events.debug,false); end end --------------- From XML functions --------------- function GEM_OnEvent() if(event == "VARIABLES_LOADED") then if(_GEM_NeedInit) then _GEM_StartupInitVars(); end return; end local channel = nil; if(arg9) then channel = strlower(arg9); end -- Check events if(event == "CHAT_MSG_CHANNEL" and channel and GEM_Realm) then if(GEM_IsChannelInList(channel)) -- Channel joined, process then if(strsub(arg1, strlen(arg1)-7) == " ...hic!") then arg1 = strsub(arg1, 1, strlen(arg1)-8); end if(string.find(arg1,"^ 2) -- More than 2 retries, try without a password then GEM_ChatPrint("You set a password ("..GEM_COM_Channels[channel].password..") for channel '"..channel.."' but it is not correct, retrying without password..."); GEM_ChatDebug(GEM_DEBUG_CHANNEL,"You set a password ("..GEM_COM_Channels[channel].password..") for channel '"..channel.."' but it is not correct, retrying without password..."); GEM_COM_Channels[channel].password = ""; GEMSystem_Schedule(1,GEM_InitChannels,false); -- Schedule retry in 1sec end else -- No password -> Print error GEM_COM_Channels[channel].retries = _GEM_MaxJoinRetry + 1; GEM_ChatPrint("Incorrect password for channel '"..channel.."'"); end end end elseif(event == "UNIT_NAME_UPDATE") then if((arg1) and (arg1 == "player")) then GEM_CheckPlayerGuild(); end elseif(event == "CHAT_MSG_CHANNEL_JOIN" and channel) then if(GEM_IsChannelInList(channel)) then GEM_CheckPlayerJoined(channel,arg2,true); GEM_QUE_BuildBroadcastQueues(channel,arg2); end elseif(event == "CHAT_MSG_CHANNEL_LEAVE" and channel) then if(GEM_IsChannelInList(channel)) then _GEM_CheckPlayerLeft(channel,arg2); end elseif(event == "CHAT_MSG_CHANNEL_LIST" and channel) then if(GEM_IsChannelJoined(channel)) then local users = {}; for value in string.gfind(arg1,"[^,]+") do table.insert(users, value); end for k,v in users do k2 = string.gsub(v, "%s*%@*%**([^%s]+)", "%1"); GEM_CheckPlayerJoined(channel,k2,false); end local count = 0; for n in GEM_ConnectedPlayers[channel] do count = count + 1; if(count >=2) then break; end end if(count == 1 and GEM_COM_Channels[channel].password and GEM_COM_Channels[channel].password ~= "") -- I'm alone, and there is a password for this channel then SetChannelPassword(channel,GEM_COM_Channels[channel].password); GEM_ChatDebug(GEM_DEBUG_CHANNEL,"I'm alone in channel '"..channel.."' and I must set a password... setting it to "..GEM_COM_Channels[channel].password); end end elseif(event == "PARTY_MEMBERS_CHANGED") then if(GetNumPartyMembers() == 0) then GEMList_CurrentGroupIDMustReset = true; else GEMList_CurrentGroupIDMustReset = false; end if(GEMList_CurrentGroupID ~= nil and GEMList_CurrentGroupIDMustReset ~= true) then if(GEMList_MustConvertToRaid == true) then ConvertToRaid(); GEMList_CurrentGroupIsRaid = true; GEM_ChatDebug(GEM_DEBUG_GLOBAL,"Converted to raid !"); GEMList_MustConvertToRaid = false; end if(GEMList_CurrentGroupIsRaid == false and GEM_Events.realms[GEM_Realm].events[GEMList_CurrentGroupID] and GEM_Events.realms[GEM_Realm].events[GEMList_CurrentGroupID].max_count > 5) -- A raid then GEMList_MustConvertToRaid = true; GEM_ChatDebug(GEM_DEBUG_GLOBAL,"Must convert to raid !"); end end elseif(event == "ZONE_CHANGED_NEW_AREA") then GEM_COM_PlayerInfos(); -- Send an update of my infos GEM_NotifyGUI(GEM_NOTIFY_PLAYER_INFOS); -- Check channel IDs for name,chantab in GEM_COM_Channels do local id = GetChannelName(name); if(GEM_COM_Channels[name].id ~= 0 and GEM_COM_Channels[name].id ~= id) -- If channel ID has changed then --GEM_ChatWarning("ZONE_CHANGED_NEW_AREA : ChannelID for '"..name.."' has changed from "..GEM_COM_Channels[name].id.." to "..id); GEM_COM_Channels[name].id = id; end end elseif(event == "CHAT_MSG_SYSTEM") then for i=1,GEM_DRUNK_MESSAGES_COUNT do if(arg1 == GEM_DRUNK_MESSAGES[i]) then GEM_YouAreDrunk = true; break; end end if(arg1 == GEM_DRUNK_NORMAL) then GEM_YouAreDrunk = false; end end end function GEM_OnLoad() -- Print init message GEM_ChatPrint("Version "..GEM_VERSION.." "..GEM_CHAT_MISC_LOADED); -- Register events this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("ADDON_LOADED"); this:RegisterEvent("CHAT_MSG_CHANNEL"); this:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE"); this:RegisterEvent("CHAT_MSG_CHANNEL_JOIN"); this:RegisterEvent("CHAT_MSG_CHANNEL_LEAVE"); this:RegisterEvent("CHAT_MSG_CHANNEL_LIST"); this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("UNIT_NAME_UPDATE"); this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("ZONE_CHANGED_NEW_AREA"); -- Initialize Slash commands SLASH_GEM1 = "/gem"; SlashCmdList["GEM"] = function(msg) _GEM_Commands(msg); end tinsert(UISpecialFrames, "GEMMainFrame"); tinsert(UISpecialFrames, "GEMCalendarFrame"); tinsert(UISpecialFrames, "GEMExternalFrame"); tinsert(UISpecialFrames, "GEMListBannedFrame"); tinsert(UISpecialFrames, "GEMNewAutoMembersFrame"); end --------------- Exported functions --------------- function GEM_ComputeServerOffset() if(GEM_Events.realms[GEM_Realm] and GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName] and GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].ForceHourOffset) then GEM_ServerOffset = GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].ForceHourOffset; return; end if(GEM_ServerOffset == 666) then local hour = GetGameTime(); if(hour == nil or tonumber(hour) == -1) then return; end local today = date("*t"); local offset = hour - today.hour; if(math.abs(offset) > 12) then if(offset > 0) then offset = offset - 24; else offset = offset + 24; end end GEM_ServerOffset = offset; end end function GEM_ComputeHourOffset() if(GEM_ServerOffset == 666) then GEM_ComputeServerOffset(); end if(GEM_Events == nil or GEM_Events.realms == nil or GEM_Events.realms[GEM_Realm] == nil or GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].UseServerTime ~= 1 or GEM_ServerOffset == 666) then return 0; end return GEM_ServerOffset * 60 * 60; end -- Checks if 'name' is one of my rerolls function GEM_IsMyReroll(name) if(GEM_Events.realms[GEM_Realm].my_names[name] ~= nil) then return true; end return false; end function GEM_IsChannelInList(channel) if(GEM_COM_Channels and GEM_COM_Channels[channel]) then --[[if(GEM_COM_Channels[channel].id == 0) then if(GEM_COM_Channels[channel].already_bcast) -- Channel is in my list, but was left by hand ! then return true; end GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_IsChannelInList : ChannelID for '"..tostring(channel).."' not found, calling InitChannels(false)"); GEM_InitChannels(false); end return GEM_COM_Channels[channel].id ~= 0;]] return true; end return false; end function GEM_IsChannelInRerollList(pl_name,channel) if(GEM_Events.realms[GEM_Realm].my_names[pl_name] and GEM_Events.realms[GEM_Realm].my_names[pl_name].channels) then for i,chantab in GEM_Events.realms[GEM_Realm].my_names[pl_name].channels do if(strlower(chantab.name) == channel) then return true; end end end return false; end function GEM_IsChannelJoined(channel) if(GEM_COM_Channels and GEM_COM_Channels[channel] and GEM_COM_Channels[channel].id ~= 0) then return true; end return false; end function GEM_CheckEventHasChannel(event) if(event and event.channel == nil) -- Never set, set it now then event.channel = GEM_DefaultSendChannel; end end function GEM_CheckCommandHasChannel(cmdstab) if(cmdstab.channel == nil) -- Never set, set it now then cmdstab.channel = GEM_DefaultSendChannel; end end function GEM_CheckPlayerJoined(channel,pl_name,mustprint) if(GEM_ConnectedPlayers[channel] == nil) then GEM_ConnectedPlayers[channel] = {}; end if(GEM_ConnectedPlayers[channel][pl_name] == nil) then local chaninfos = GEM_COM_Channels[channel]; if(mustprint and chaninfos and chaninfos.notify) then local alias = channel; if(chaninfos.alias and chaninfos.alias ~= "") then alias = chaninfos.alias; end GEM_ChatMsg(alias.." : "..string.format(GEM_TEXT_PLAYER_JOINED,pl_name)); end GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_CheckPlayerJoined : Player "..pl_name.." joined "..channel); if(GEM_Players[GEM_Realm] and GEM_Players[GEM_Realm][channel] and GEM_Players[GEM_Realm][channel][pl_name]) then GEM_Players[GEM_Realm][channel][pl_name].location = GEM_NA_FORMAT; -- Reset location end GEM_ConnectedPlayers[channel][pl_name] = 1; GEM_COM_LastJoinerTime = time(); GEMList_Notify(GEM_NOTIFY_MY_SUBSCRIPTION,""); end end function GEM_IsPlayerConnected(channel,pl_name) if(GEM_ConnectedPlayers[channel] and GEM_ConnectedPlayers[channel][pl_name] ~= nil) then return true; end return false; end function GEM_CheckPlayerGuild() if(GEM_Realm == nil) then GEM_ChatWarning("GEM_CheckPlayerGuild : GEM_Realm is nil. Aborting"); return; end local playerName = UnitName("player"); if((playerName) and (playerName ~= UNKNOWNOBJECT) and (playerName ~= UKNOWNBEING)) then local playerGuild = GetGuildInfo("player"); GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].level = UnitLevel("player"); GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].guild = playerGuild; GEM_ChatDebug(GEM_DEBUG_GLOBAL,"GEM_CheckPlayerGuild : Player "..playerName.." level "..GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].level.." from guild "..tostring(GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].guild)); end end local _GEM_ScheduledChannelsInitDone = false; local _GEM_InitChannelsCount = 0; function GEM_InitChannels(schedule) GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_InitChannels : Starting channel Initialization (reschedule="..tostring(schedule).." count=".._GEM_InitChannelsCount..")"); _GEM_InitChannelsCount = _GEM_InitChannelsCount + 1; if(_GEM_InitChannelsCount == 1000) then GEM_ChatWarning("GEM_InitChannels : _GEM_InitChannelsCount reached 1000, you might be in flight"); end if(schedule and _GEM_ScheduledChannelsInitDone) then GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_InitChannels : Returning, schedule="..tostring(schedule).." and _GEM_ScheduledChannelsInitDone="..tostring(_GEM_ScheduledChannelsInitDone)); return; end -- Check for general channels local firstChannelNumber = GetChannelList(); if(firstChannelNumber == nil) then if(schedule) then GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_InitChannels : Main channels not init yet, reschedule init in 2 sec"); GEMSystem_Schedule(2,GEM_InitChannels,schedule); -- Re schedule in 2 sec else GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_InitChannels : Main channels not init yet, but not rescheduling."); end return; end _GEM_InitChannelsCount = 0; GEM_EVT_CheckExpiredEvents(); GEM_CMD_CheckExpiredCommands(); -- Join our channels for name,chantab in GEM_COM_Channels do GEMPlayers_CheckExpiredPlayers(name); if(chantab.id == 0) -- If this channel is not init then GEM_COM_JoinChannel(name,chantab.password); -- Wait for our channel joined GEM_ChatDebug(GEM_DEBUG_CHANNEL,"GEM_InitChannels : Join request sent, prepare _GEM_CheckForJoined schedule ? : "..tostring(chantab.retries)); if(chantab.retries == 0) -- Not already in a schedule check then GEMSystem_Schedule(3,_GEM_CheckForJoined,name); -- Schedule in 3 sec end end end if(schedule) then _GEM_ScheduledChannelsInitDone = true; end end