Заставьте бота отправлять сообщения каждый день в определенное время - PullRequest
4 голосов
/ 06 марта 2019

Я создаю бота с Bot Framework, который должен работать в MS Teams, и я хочу, чтобы он отправлял мне сообщение каждый день в 6:30 утра.

У меня есть метод, который вызывается каждый день в 6:30 из файла Program.И у меня есть метод, который отправляет сообщение от бота.

Это код моего таймера:

private static Timer _timer;

    private static int count = 1;


    public static void Main(string[] args)
    {        
        //Initialization of _timer   
        _timer = new Timer(x => { callTimerMethod(); }, null, Timeout.Infinite, Timeout.Infinite);
        Setup_Timer();

        BuildWebHost(args).Run();
    }

    /// <summary>  
    /// This method will execute every day at 06:30.   
    /// </summary>  
    public static void callTimerMethod()
    {
        System.Diagnostics.Debug.WriteLine(string.Format("Method is called"));
        System.Diagnostics.Debug.Write(DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss"));
        count = count + 1;
    }

    /// <summary>  
    /// This method will set the timer execution time and will change the   
    /// tick time of timer.
    /// </summary>  
    private static void Setup_Timer()
    {
        DateTime currentTime = DateTime.Now;
        DateTime timerRunningTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 6, 30, 0);
        timerRunningTime = timerRunningTime.AddDays(1);

        double tickTime = (double)(timerRunningTime - DateTime.Now).TotalSeconds;

        _timer.Change(TimeSpan.FromSeconds(tickTime),
        TimeSpan.FromSeconds(tickTime));
    }

И что я хочу заархивировать, так это то, что я хочу изменить содержимоеиз callTimerMethod() для этого метода:

public async Task AlertSubscribers(ITurnContext turncontext, CancellationToken cancellationToken = default(CancellationToken))
    {
        using (var db = new DataBaseContext())
        {
            var msg = "";
            var today = DateTime.Today.ToString("dddd");
            var product = db linq code;

            foreach(var prod in product)
            {
                msg = $"Reminder! {prod.bla}";
            }

            // Get the conversation state from the turn context.
            var state = await _accessors.CounterState.GetAsync(turncontext, () => new CounterState());

            // Set the property using the accessor.
            await _accessors.CounterState.SetAsync(turncontext, state);

            // Save the new turn count into the conversation state.
            await _accessors.ConversationState.SaveChangesAsync(turncontext);

            // Echo back to the user whatever msg is.
            await turncontext.SendActivityAsync(msg);
        }
    }

Но я не могу найти способ заархивировать его ... Был бы очень признателен за помощь, я много искал, но не нашел подобной проблемы.

Проблема во всех пространствах имен (например, ITurncontext, Conversationstate и т. Д.)

Надеюсь, что описывает мою проблему ...

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Не обязательно должен быть метод AlertSubscribers(), но функция или просто код, который делает то же самое.

Я пробовал этот код, но не могу заставить его отправить сообщение пользователю бота (в данном случае это я в эмуляторе):

public static void callTimerMethod()
    {
        IMessageActivity message = Activity.CreateMessageActivity();

        message.Text = "Hello!";
        message.TextFormat = "plain";
        message.Locale = "en-Us";
        message.ChannelId = "emulator";
        message.Id = "A guid";
        message.InputHint = "acceptingInput";
        message.LocalTimestamp = DateTimeOffset.Now;
        message.ReplyToId = "A guid";
        message.ServiceUrl = "http://localhost:50265";
        message.Timestamp = DateTimeOffset.Now;
        message.Type = "ConversationUpdate";

        message.AsConversationUpdateActivity();
    }

Я новичок в ботерамки, так что мой код и мои мысли могут быть неправильными ...

1 Ответ

0 голосов
/ 15 марта 2019

Решено!

public static async void callTimerMethod()
{
    await ConversationStarter.Resume("conversationId", "emulator");
}

Мне пришлось изменить callTimerMethod() на асинхронный метод и создать класс ConversationStarter, который обрабатывает сообщение для меня.

Это ConversationStarter:

public class ConversationStarter
{
    public static string fromId;
    public static string fromName;
    public static string toId;
    public static string toName;
    public static string serviceUrl;
    public static string channelId;
    public static string conversationId;


    public static async Task Resume(string conversationId, string channelId)
    {
        conversationId = await Talk(conversationId, channelId, $"Hi there!");
        conversationId = await Talk(conversationId, channelId, $"This is a notification!");
    }

    private static async Task<string> Talk(string conversationId, string channelId, string msg)
    {
        var userAccount = new ChannelAccount(toId, toName);
        var botAccount = new ChannelAccount(fromId, fromName);
        var connector = new ConnectorClient(new Uri(serviceUrl));

        IMessageActivity message = Activity.CreateMessageActivity();
        if (!string.IsNullOrEmpty(conversationId) && !string.IsNullOrEmpty(channelId))
        {
            message.ChannelId = channelId;
        }
        else
        {
            conversationId = (await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount)).Id;
        }
        message.From = botAccount;
        message.Recipient = userAccount;
        message.Conversation = new ConversationAccount(id: conversationId);
        message.Text = msg;
        message.Locale = "en-Us";
        await connector.Conversations.SendToConversationAsync((Activity)message);
        return conversationId;
    }

}
...