예제 #1
0
파일: User.cs 프로젝트: Pyratron/PyraChat
 public void RemoveRank(Client client, string channel, UserRank rank)
 {
     if (ranks.ContainsKey(channel) && ranks[channel].Contains(rank))
     {
         ranks[channel].Remove(rank);
         if (!ranks[channel].Contains(UserRank.None))
             ranks[channel].Add(UserRank.None);
         client.OnRankChange(this, channel, ranks[channel].Min());
     }
 }
예제 #2
0
파일: User.cs 프로젝트: Pyratron/PyraChat
 internal void SetIsAway(Client client, bool away, string reason = "")
 {
     AwayMessage = away ? reason : string.Empty;
     isAway = away;
     client.OnAwayChange(this, away);
 }
예제 #3
0
파일: User.cs 프로젝트: Pyratron/PyraChat
 public void AddRank(Client client, string channel, UserRank rank)
 {
     Console.WriteLine($"Rank of {this} for {channel} on {client.Host} added: {rank}");
     if (!ranks.ContainsKey(channel))
         ranks.TryAdd(channel, new List<UserRank>());
     if (!ranks[channel].Contains(rank))
     {
         if (!ranks[channel].Contains(UserRank.None))
             ranks[channel].Add(UserRank.None);
         ranks[channel].Add(rank);
         client.OnRankChange(this, channel, ranks[channel].Min());
     }
 }
예제 #4
0
파일: User.cs 프로젝트: Pyratron/PyraChat
        public void RemoveMode(Client client, char mode)
        {
            if (Modes.Contains(mode))
                Modes.Remove(mode);

            // Invoke events
            if (mode.Equals('a'))
                client.OnAwayChange(this, false);
        }
예제 #5
0
파일: User.cs 프로젝트: Pyratron/PyraChat
        public void AddMode(Client client, char mode)
        {
            if (!Modes.Contains(mode))
                Modes.Add(mode);

            // Invoke events
            if (mode.Equals('a'))
                client.OnAwayChange(this, true);
        }
예제 #6
0
 public int AddMode(Client client, string channel, char mode, string parameter = "")
 {
     switch (mode)
     {
         case 'v':
         {
             var user = client.UserFromNick(parameter);
             user.AddRank(client, channel, UserRank.Voice);
             return 1;
         }
         case 'h':
         {
             var user = client.UserFromNick(parameter);
             user.AddRank(client, channel, UserRank.HalfOp);
             return 1;
         }
         case 'o':
         {
             var user = client.UserFromNick(parameter);
             user.AddRank(client, channel, UserRank.Op);
             return 1;
         }
         case 'a':
         {
             var user = client.UserFromNick(parameter);
             user.AddRank(client, channel, UserRank.Admin);
             return 1;
         }
         case 'q':
         {
             var user = client.UserFromNick(parameter);
             user.AddRank(client, channel, UserRank.Owner);
             return 1;
         }
         case 'b':
         {
             AddBan(parameter);
                 OnModeAdd(mode);
                 return 1;
         }
         case 'e':
         {
             AddException(parameter);
                 OnModeAdd(mode);
                 return 1;
         }
         case 'I':
         {
             AddInvite(parameter);
                 OnModeAdd(mode);
                 return 1;
         }
         case 'k':
         {
             Key = parameter;
             Modes.Add(mode);
             return 1;
         }
         case 'l':
         {
             int limit;
             if (int.TryParse(parameter, out limit))
             {
                 Userlimit = limit;
                 Modes.Add(mode);
                     OnModeAdd(mode);
                     return 1;
             }
             break;
         }
         default:
         {
             if (!Modes.Contains(mode))
                 Modes.Add(mode);
             break;
         }
     }
     OnModeAdd(mode);
     return 0;
 }
예제 #7
0
 public Channel(Client client, string name)
 {
     Client = client;
     Name = name;
     Type = ChannelType.FromPrefix(name[0]);
 }
예제 #8
0
 public int RemoveMode(Client client, string channel, char mode, string parameter = "")
 {
     switch (mode)
     {
         case 'v':
         {
             var user = client.UserFromNick(parameter);
             user.RemoveRank(client, channel, UserRank.Voice);
             return 1;
         }
         case 'h':
         {
             var user = client.UserFromNick(parameter);
             user.RemoveRank(client, channel, UserRank.HalfOp);
             return 1;
         }
         case 'o':
         {
             var user = client.UserFromNick(parameter);
             user.RemoveRank(client, channel, UserRank.Op);
             return 1;
         }
         case 'a':
         {
             var user = client.UserFromNick(parameter);
             user.RemoveRank(client, channel, UserRank.Admin);
             return 1;
         }
         case 'q':
         {
             var user = client.UserFromNick(parameter);
             user.RemoveRank(client, channel, UserRank.Owner);
             return 1;
         }
         case 'b':
         {
             RemoveBan(parameter);
             OnModeRemove(mode);
             return 1;
         }
         case 'e':
         {
             RemoveException(parameter);
             OnModeRemove(mode);
             return 1;
         }
         case 'I':
         {
             RemoveInvite(parameter);
             OnModeRemove(mode);
             return 1;
         }
         case 'k':
         {
             if (Key.Equals(parameter))
             {
                 Key = null;
                 if (Modes.Contains(mode))
                     Modes.Remove(mode);
             }
             OnModeRemove(mode);
             return 1;
         }
         case 'l':
         {
             Userlimit = -1;
             if (Modes.Contains(mode))
                 Modes.Remove(mode);
             break;
         }
         default:
         {
             if (Modes.Contains(mode))
                 Modes.Remove(mode);
             break;
         }
     }
     OnModeRemove(mode);
     return 0;
 }
예제 #9
0
        public Network(string host, int port, User userirc, string[] initialChannels)
        {
            Name = host; // By default, name is host.
            Users = new ObservableCollection<UiUser>();
            DisplayUsers = new ObservableCollection<UiUser>();
            Channels = new ObservableCollection<UiChannel>();

            Me = new UiUser(userirc, ViewModelLocator.Main.GenColor());
            Users.Add(Me);

            // Create IRC client and handle connection.
            Client = new Client(host, port, userirc);
            Client.IRCMessage += message => Console.WriteLine(message.Text);
            Client.Connect += () =>
            {
                foreach (var chan in initialChannels)
                    Client.Send(new JoinMessage(chan));
            };
            Client.ReplyISupport += message =>
            {
                // Use the NETWORK= parameter in 005 to set the server name.
                string networkName;
                if (message.TryGetParameter("Network", out networkName))
                    Name = networkName;
            };

            // Update user list on certain events.
            Client.Nick += message => { SortUsers(); };
            Client.RankChange += (user, channel, rank) => { SortUsers(); };
            Client.AwayChange += (user, away) => { SortUsers(); };

            // Subscribe to events when a channel is joined.
            Client.ChannelJoin += message =>
            {
                var channelJoined = new UiChannel(message.Channel, this);
                if (ViewModelLocator.Main.Channel == null)
                    ViewModelLocator.Main.Channel = channelJoined;
                DispatcherHelper.CheckBeginInvokeOnUI(() => Channels.Add(channelJoined));
                message.Channel.Message += privateMessage => //Subscribe to the joined channel's messages
                {
                    DispatcherHelper.CheckBeginInvokeOnUI(
                        () =>
                        {
                            var chan = Channels.FirstOrDefault(c => c.Channel == message.Channel);
                            chan?.AddLine(privateMessage);
                        });
                };
                // Show system messages (will be moved to cause/effect system eventually)
                message.Channel.UserJoin +=
                    joinMessage =>
                    {
                        AddSystemLine(
                            $"{joinMessage.User.Nick} ({joinMessage.User.Ident}@{joinMessage.User.Host}) has joined.", channelJoined.Channel);
                    };
                message.Channel.UserPart +=
                    partMessage =>
                    {
                        var reason = string.IsNullOrEmpty(partMessage.Reason) ? string.Empty : $"({partMessage.Reason})";
                        AddSystemLine($"{partMessage.User.Nick} has left. {reason}", channelJoined.Channel);
                    };

                message.Channel.UserAdd += user =>
                {
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        //Don't add duplicate users to the master list.
                        if (Users.All(u => u.User != user))
                        {
                            Users.Add(new UiUser(user, ViewModelLocator.Main.GenColor()));
                            SortUsers();
                        }
                    });
                };

                message.Channel.UserRemove += user =>
                {
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        Users.Remove(Users.FirstOrDefault(x => x.User == user));
                        SortUsers();
                    });
                };
            };
            // Show system messages (will be moved to cause/effect system eventually)
            Client.Quit +=
                message =>
                {
                    var reason = string.IsNullOrEmpty(message.Reason) ? string.Empty : $"({message.Reason})";
                    AddSystemLine($"{message.User.Nick} has quit. {reason}", message.User.Channels.ToArray());
                };
            Client.Nick += message =>
            {
                AddSystemLine($"{message.OldNick} is now known as {message.Nick}.", message.User.Channels.ToArray());
            };
            //irc.ReplyMOTDEnd += delegate(MOTDEndMessage message) { Text += message.MOTD + Environment.NewLine; };
            Client.Start();
        }