//queues your channel up to join at the front of the queue public static void queueJoinChannelFront(string channel, ChannelJoinCallback cb, object callbackData) { channelQueueMutex.WaitOne(); queueStruct qs = new queueStruct(channel, cb, callbackData); joinChannelQueue.AddFirst(qs); channelQueueMutex.ReleaseMutex(); queueWaitingEvent.Set(); }
private static bool JoinChannel(queueStruct channelQueueStruct) { string channel = channelQueueStruct.channel; bool success = false; string lastJoinedDir = Path.Combine(Util.GetUserDataPath(), "Cache", "LastJoinedDate"); if (channel != null) { try { joinChannelMutex.WaitOne(); } catch (AbandonedMutexException e) { //no problem keep going } { try { FileStream lastJoinedfileStream = new FileStream(lastJoinedDir, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); StreamReader lastJoinedfileStreamReader = new StreamReader(lastJoinedfileStream); StreamWriter lastJoinedfileStreamWriter = new StreamWriter(lastJoinedfileStream); DateTime currentTime = DateTime.Now; string lastJoinTimeStr = lastJoinedfileStreamReader.ReadLine(); if (!String.IsNullOrEmpty(lastJoinTimeStr)) { lastJoinTime = DateTime.Parse(lastJoinTimeStr); } if ((currentTime - lastJoinTime).TotalMilliseconds < JOIN_INTERVAL) { Thread.Sleep(JOIN_INTERVAL); } try { IrcManager.Client?.Join("#" + channel); success = true; } catch (SocketException e) { GuiEngine.Current.log(e.ToString() + e.ErrorCode); } catch (Exception e) { GuiEngine.Current.log(e.ToString()); } lastJoinTime = DateTime.Now; lastJoinedfileStream.SetLength(0); lastJoinedfileStreamWriter.WriteLine(lastJoinTime.ToString()); lastJoinedfileStreamWriter.Flush(); lastJoinedfileStreamWriter.Close(); lastJoinedfileStreamReader.Close(); } catch (Exception e) { GuiEngine.Current.log(e.ToString()); } } joinChannelMutex.ReleaseMutex(); if (channelQueueStruct.callback != null) { channelQueueStruct.callback(success, channelQueueStruct.callbackData); } } return(success); }
//Starts a new thread with an infinite loop to handle the join channel queue. public static void runChannelLoop() { new Thread(() => { queueStruct channel = null; int channelCount = 0; channelLoop = true; while (channelLoop) { channelQueueMutex.WaitOne(); if (joinChannelQueue.Count == 0) { channelQueueMutex.ReleaseMutex(); queueWaitingEvent.WaitOne(); } else { channelQueueMutex.ReleaseMutex(); } channelCount = joinChannelQueue.Count; while (channelCount > 0 && channelLoop) { channelQueueMutex.WaitOne(); channelCount = joinChannelQueue.Count; if (channelCount > 0) { channel = joinChannelQueue.First.Value; joinChannelQueue.RemoveFirst(); channelCount = joinChannelQueue.Count; } channelQueueMutex.ReleaseMutex(); if (channel != null) { JoinChannel(channel); } channel = null; } } }).Start(); }
//skips the queue and joins now public static bool JoinChannelSync(string channel) { queueStruct cqs = new queueStruct(channel, null, null); return(JoinChannel(cqs)); }