private async Task <JobResult> ProcessGetFeedCommand(string[] args) { int totalMessagesCount = 0; int from = DateTime.Now.ToIntSeconds(); int to = DateTime.Now.ToIntSeconds(); bool stopped = false; for (int i = 0; i < args.Length; i++) { if (args[i].ToLower() == "-from") { try { from = DateTime.Parse(args[i + 1]).ToIntSeconds(); } catch (Exception) { return(new JobResult("Invalid date after '-from'", JobStatus.Finished)); } } if (args[i].ToLower() == "-to") { try { to = DateTime.Parse(args[i + 1]).ToIntSeconds(); } catch (Exception) { return(new JobResult("Invalid date after '-to'", JobStatus.Finished)); } } } List <int> channelsIDs = db.GetActiveChannelsIDs(); foreach (int channelId in channelsIDs) { if (_stop) { stopped = true; break; } MongoChannel channel = db.GetChannel(channelId); if (channel.CoveredTimePeriods == null) { channel.CoveredTimePeriods = new TimePeriods(); } int currentChannelMessagesCount = 0; bool skipChannel = false; int time = to; int lastMessageTime = 0; if (channel.CoveredTimePeriods.ContainsLarger(time)) { lastMessageTime = time; } while (true) { if (_stop) { stopped = true; break; } if (time < from) { break; } time = channel.CoveredTimePeriods.LargestNonIncludedTimeFromPeriod(from, time); if (time < from || skipChannel) { break; } int addedMessagesCount = 0; List <Message> messages = new List <Message>(); TLInterfacePackage tl = new TLInterfacePackage(); tl = GetAvailableTLInterface(); try { messages = await tl.Interface.GetChannelMessagesAsync(channel.ChannelId, channel.AccessHash.Value, null, time, null); tl.LastCallTime = DateTime.Now; tl.IsAvailable = true; } catch (InvalidOperationException e) { Log("InvalidOperationException: " + e.Message); return(new JobResult(JobStatus.Stopped)); } if (messages.Count == 0) { break; } foreach (Message item in messages) { if (!db.IsMessageAdded(item.SourceChannel.ChannelId, item.MessageId)) { // extract usernames from message text foreach (string username in ExtractUsernamesHelper(item.Text)) { if (!db.IsChannelAdded(username)) { if (!db.IsUnresolvedUsernameAdded(new MongoUsername { Username = username })) { db.AddUnresolvedUsername(new MongoUsername { Username = username }); } } } // add message source channel if it's not added yet. if (!db.IsChannelAdded(item.SourceChannel.ChannelId)) { if (item.SourceChannel.AccessHash.HasValue) { await AddChannelHelper(item.SourceChannel.ChannelId, item.SourceChannel.AccessHash.Value, false); } } // add message to database MongoMessage messageToAdd = new MongoMessage { ChannelId = item.SourceChannel.ChannelId, MessageId = item.MessageId, Text = item.Text, Date = item.OriginalDate ?? item.Date, Views = new List <CountTime>() { item.Views } }; if (item.MediaContent != null) { if (string.IsNullOrEmpty(messageToAdd.Text)) { messageToAdd.Text = item.MediaContent.Caption; } messageToAdd.MediaType = item.MediaContent.Type; messageToAdd.MediaSize = item.MediaContent.Size; messageToAdd.FileName = item.MediaContent.FileName; } db.AddMessage(messageToAdd); addedMessagesCount++; } else if (messages.Count == 1) { skipChannel = true; } } if (lastMessageTime == 0) { lastMessageTime = messages.Max(m => m.Date); } time = messages.Min(m => m.Date); channel.CoveredTimePeriods.AddPeriod(new TimePeriod(time, lastMessageTime)); db.UpdateChannelCoveredTimePeriods(channel.ChannelId, channel.CoveredTimePeriods); currentChannelMessagesCount += addedMessagesCount; Log(string.Format("{0} new messages has been added from '{1}' (@{2}).", addedMessagesCount, channel.Title, channel.Username)); lastMessageTime = time; } totalMessagesCount += currentChannelMessagesCount; Log(string.Format("{0} total new messages has been added from '{1}' (@{2}).", currentChannelMessagesCount, channel.Title, channel.Username)); } if (stopped) { return(new JobResult(JobStatus.Stopped)); } string message = ""; if (totalMessagesCount == 0) { message = "No new message has been added."; } else if (totalMessagesCount == 1) { message = "1 new message has been added."; } else { message = string.Format("{0} new messages has been added.", totalMessagesCount); } return(new JobResult(message, JobStatus.Finished)); }
public void AddMessage(MongoMessage message) { var messages = _db.GetCollection <MongoMessage>("messages"); messages.InsertOne(message); }
public async Task <bool> SendMessage(MongoMessage msg) { await Messages.InsertOneAsync(msg); return(true); }