public dynamic PostStalkInfo(dynamic parameters) { var channel = this.channelConfiguration.Items.FirstOrDefault(x => x.Guid == parameters.channel); if (channel == null || !channel.Stalks.ContainsKey(parameters.stalk)) { return(new NotFoundResponse()); } if (!this.UserCanConfigureStalks(this.Context, channel)) { return(new NotFoundResponse()); } var doc = new XmlDocument(); doc.LoadXml(this.Request.Form.newsearchtree); IStalk stalk = channel.Stalks[parameters.stalk]; var newTree = this.stalkNodeFactory.NewFromXmlFragment((XmlElement)doc.FirstChild.FirstChild); stalk.SearchTree = newTree; var stalkIsEnabled = this.Request.Form.enabledSwitch; stalk.IsEnabled = stalkIsEnabled.HasValue; stalk.Description = this.Request.Form.stalkDescription; var expiry = this.Request.Form.expiry; DateTime newExpiry; var dateParseResult = DateTime.TryParse(expiry, out newExpiry); if (dateParseResult) { stalk.ExpiryTime = newExpiry.ToUniversalTime(); } else { stalk.ExpiryTime = null; } this.channelConfiguration.Save(); this.FreenodeClient.SendMessage( stalk.Channel, "The stalk " + stalk.Identifier + " was modified by " + this.Context.CurrentUser.UserName + " from the web interface."); return(this.Response.AsRedirect(string.Format("/channels/{0}/stalk/{1}", channel.Guid, stalk.Identifier))); }
public StalkInfoFormattingEventArgs(IStalk stalk) { this.Stalk = stalk; }
public IEnumerable <SubscriptionResult> GetUserSubscriptionsToStalk(IIrcChannel channel, IStalk stalk) { var userData = this.botUserConfiguration.Items.ToDictionary( x => x, y => new SubscriptionResult { Stalk = stalk, Channel = channel, BotUser = y }); foreach (var channelUser in channel.Users.Where(x => x.Subscribed)) { var botUser = this.botUserConfiguration[channelUser.Mask.ToString()]; userData[botUser].IsSubscribed = true; userData[botUser].Source = SubscriptionSource.Channel; userData[botUser].Complete = true; } foreach (var stalkUser in stalk.Subscribers) { var botUser = this.botUserConfiguration[stalkUser.Mask.ToString()]; if (stalkUser.Subscribed) { userData[botUser].IsSubscribed = true; userData[botUser].Overridden = false; userData[botUser].Source = SubscriptionSource.Stalk; userData[botUser].Complete = true; } else { // subscription exclusion for channel users userData[botUser].IsSubscribed = false; userData[botUser].Overridden = true; userData[botUser].Source = SubscriptionSource.Stalk; userData[botUser].Complete = true; } } return(userData.Where(x => x.Value.Complete).Select(x => x.Value).ToList()); }
public bool IsSubscribedToStalk(IBotUser botUser, IIrcChannel channel, IStalk stalk) { return(this.GetUserSubscriptionsToStalk(channel, stalk) .Where(x => x.IsSubscribed) .Any(x => Equals(x.BotUser, botUser))); }
public bool SubscribeStalk(IrcUserMask mask, IIrcChannel channel, IStalk stalk, out SubscriptionSource source) { if (channel.Identifier != stalk.Channel) { throw new Exception("Mismatch between stalk channel and channel!"); } var stalkSubscriber = stalk.Subscribers.FirstOrDefault(x => x.Mask.ToString() == mask.ToString()); var channelSubscriber = channel.Users.FirstOrDefault(x => x.Mask.ToString() == mask.ToString()); this.logger.DebugFormat( "Subscription request for {0} to {1} in {2}", mask, stalk.Identifier, channel.Identifier); if (stalkSubscriber != null) { if (stalkSubscriber.Subscribed) { if (channelSubscriber != null) { if (channelSubscriber.Subscribed) { // subscribed to channel // subscribed to stalk this.logger.WarnFormat( "Found subscription request from stalk- ({0}) and channel-subscribed ({1}) user ({2})", stalk.Identifier, channel.Identifier, mask); this.logger.DebugFormat( "Unsubscribing from stalk - already subscribed to stalk and channel"); stalk.Subscribers.Remove(stalkSubscriber); source = SubscriptionSource.Channel; return(false); } else { // not subscribed to channel // subscribed to stalk this.logger.DebugFormat("Not subscribing - already subscribed to stalk"); source = SubscriptionSource.Stalk; return(false); } } else { // not subscribed to channel // subscribed to stalk this.logger.DebugFormat("Not subscribing - already subscribed to stalk"); source = SubscriptionSource.Stalk; return(false); } } else { if (channelSubscriber != null) { if (channelSubscriber.Subscribed) { // forcibly unsubscribed from stalk // subscribed to channel this.logger.DebugFormat("Removing forced unsubscribe - already subscribed to channel"); stalk.Subscribers.Remove(stalkSubscriber); source = SubscriptionSource.Channel; return(true); } else { // forcibly unsubscribed from stalk // not subscribed to channel this.logger.WarnFormat( "Found subscription request from stalk-force-unsubscribed ({0}) and channel-unsubscribed ({1}) user ({2})", stalk.Identifier, channel.Identifier, mask); this.logger.DebugFormat("Converting forced unsubscribe to stalk subscription"); stalkSubscriber.Subscribed = true; source = SubscriptionSource.Stalk; return(true); } } else { // forcibly unsubscribed from stalk // not subscribed to channel this.logger.WarnFormat( "Found subscription request from stalk-force-unsubscribed ({0}) and channel-unsubscribed ({1}) user ({2})", stalk.Identifier, channel.Identifier, mask); this.logger.DebugFormat("Converting forced unsubscribe to stalk subscription"); stalkSubscriber.Subscribed = true; source = SubscriptionSource.Stalk; return(true); } } } else { if (channelSubscriber != null) { if (channelSubscriber.Subscribed) { // already subscribed to channel // not subscribed to stalk source = SubscriptionSource.Channel; return(false); } else { // not subscribed to channel // not subscribed to stalk this.logger.DebugFormat("Subscribing to stalk"); stalkSubscriber = new StalkUser(mask, true); stalk.Subscribers.Add(stalkSubscriber); source = SubscriptionSource.Stalk; return(true); } } else { // not subscribed to channel // not subscribed to stalk this.logger.DebugFormat("Subscribing to stalk"); stalkSubscriber = new StalkUser(mask, true); stalk.Subscribers.Add(stalkSubscriber); source = SubscriptionSource.Stalk; return(true); } } }
public XmlElement ToXmlElement(IStalk stalk, XmlDocument doc) { var e = doc.CreateElement("complexstalk"); e.SetAttribute("flag", stalk.Identifier); if (stalk.LastUpdateTime != null) { e.SetAttribute( "lastupdate", XmlConvert.ToString(stalk.LastUpdateTime.Value, XmlDateTimeSerializationMode.Utc)); } if (stalk.LastTriggerTime != null) { e.SetAttribute( "lasttrigger", XmlConvert.ToString(stalk.LastTriggerTime.Value, XmlDateTimeSerializationMode.Utc)); } if (stalk.CreationDate != DateTime.MinValue) { e.SetAttribute( "creation", XmlConvert.ToString(stalk.CreationDate, XmlDateTimeSerializationMode.Utc)); } if (stalk.Description != null) { e.SetAttribute("description", stalk.Description); } if (stalk.LastMessageId != null) { e.SetAttribute("lastmessageid", stalk.LastMessageId); } e.SetAttribute("enabled", XmlConvert.ToString(stalk.IsEnabled)); e.SetAttribute("watchchannel", stalk.WatchChannel); if (stalk.ExpiryTime != null) { e.SetAttribute("expiry", XmlConvert.ToString(stalk.ExpiryTime.Value, XmlDateTimeSerializationMode.Utc)); } if (stalk.DynamicExpiry != null) { e.SetAttribute("dynamicexpiry", XmlConvert.ToString(stalk.DynamicExpiry.Value)); } e.SetAttribute("triggercount", XmlConvert.ToString(stalk.TriggerCount)); var searchTreeParentElement = doc.CreateElement("searchtree"); searchTreeParentElement.AppendChild(this.StalkNodeFactory.ToXml(doc, stalk.SearchTree)); e.AppendChild(searchTreeParentElement); var subsElement = doc.CreateElement("subscribers"); e.AppendChild(subsElement); foreach (var user in stalk.Subscribers) { var u = doc.CreateElement("user"); u.SetAttribute("mask", user.Mask.ToString()); if (!user.Subscribed) { u.SetAttribute("unsubscribed", XmlConvert.ToString(true)); } subsElement.AppendChild(u); } return(e); }
public DisplayStalk(IStalk stalk, IAppConfiguration appConfiguration, IStalkNodeFactory stalkNodeFactory) { this.appConfiguration = appConfiguration; this.stalkNodeFactory = stalkNodeFactory; this.Stalk = stalk; }