예제 #1
0
        //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();
        }
예제 #2
0
        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);
        }
예제 #3
0
 //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();
 }
예제 #4
0
        //skips the queue and joins now
        public static bool JoinChannelSync(string channel)
        {
            queueStruct cqs = new queueStruct(channel, null, null);

            return(JoinChannel(cqs));
        }