sync bot experiment

This commit is contained in:
jetsparrow 2019-08-12 21:26:36 +03:00
parent ff70cda27a
commit 41013783a4
10 changed files with 41 additions and 42 deletions

View File

@ -8,7 +8,7 @@ namespace JetHerald
{
public interface IChatCommand
{
Task<string> Execute(CommandString cmd, MessageEventArgs messageEventArgs);
string Execute(CommandString cmd, MessageEventArgs messageEventArgs);
}
public class ChatCommandRouter
@ -22,7 +22,7 @@ namespace JetHerald
Username = username;
}
public async Task<string> Execute(object sender, MessageEventArgs args)
public string Execute(object sender, MessageEventArgs args)
{
var text = args.Message.Text;
if (CommandString.TryParse(text, out var cmd))
@ -37,7 +37,7 @@ namespace JetHerald
try
{
Log.LogDebug($"Handling message via {commands[cmd.Command].GetType().Name}");
return await commands[cmd.Command].Execute(cmd, args);
return commands[cmd.Command].Execute(cmd, args);
}
catch (Exception e)
{

View File

@ -15,7 +15,7 @@ namespace JetHerald.Commands
this.db = db;
}
public async Task<string> Execute(CommandString cmd, MessageEventArgs messageEventArgs)
public string Execute(CommandString cmd, MessageEventArgs messageEventArgs)
{
if (cmd.Parameters.Length < 1)
return null;
@ -32,7 +32,7 @@ namespace JetHerald.Commands
try
{
var topic = await db.CreateTopic(msg.From.Id, name, descr);
var topic = db.CreateTopic(msg.From.Id, name, descr);
return $"created {topic.Name}\n" +
$"readToken\n{topic.ReadToken}\n" +
$"writeToken\n{topic.WriteToken}\n" +

View File

@ -13,7 +13,7 @@ namespace JetHerald.Commands
this.db = db;
}
public async Task<string> Execute(CommandString cmd, MessageEventArgs messageEventArgs)
public string Execute(CommandString cmd, MessageEventArgs messageEventArgs)
{
if (cmd.Parameters.Length < 2)
return null;
@ -26,7 +26,7 @@ namespace JetHerald.Commands
string name = cmd.Parameters[0];
string adminToken = cmd.Parameters[1];
var topic = await db.DeleteTopic(name, adminToken);
var topic = db.DeleteTopic(name, adminToken);
return $"deleted {name} and all its subscriptions";
}
}

View File

@ -13,11 +13,11 @@ namespace JetHerald
this.db = db;
}
public async Task<string> Execute(CommandString cmd, MessageEventArgs messageEventArgs)
public string Execute(CommandString cmd, MessageEventArgs messageEventArgs)
{
var msg = messageEventArgs.Message;
var chatid = msg.Chat.Id;
var topics = await db.GetTopicsForChat(chatid);
var topics = db.GetTopicsForChat(chatid);
return topics.Any()
? "Topics:\n" + string.Join("\n", topics.Select(GetTopicListing))

View File

@ -12,7 +12,7 @@ namespace JetHerald
this.db = db;
}
public async Task<string> Execute(CommandString cmd, MessageEventArgs args)
public string Execute(CommandString cmd, MessageEventArgs args)
{
if (cmd.Parameters.Length < 1)
return null;
@ -20,7 +20,7 @@ namespace JetHerald
var chatid = args.Message.Chat.Id;
var token = cmd.Parameters[0];
var topic = await db.GetTopic(token, chatid);
var topic = db.GetTopic(token, chatid);
if (topic == null)
return "topic not found";
@ -30,7 +30,7 @@ namespace JetHerald
return "token mismatch";
else
{
await db.CreateSubscription(topic.TopicId, chatid);
db.CreateSubscription(topic.TopicId, chatid);
return $"subscribed to {topic.Name}";
}
}

View File

@ -12,7 +12,7 @@ namespace JetHerald
this.db = db;
}
public async Task<string> Execute(CommandString cmd, MessageEventArgs messageEventArgs)
public string Execute(CommandString cmd, MessageEventArgs messageEventArgs)
{
if (cmd.Parameters.Length < 1)
return null;
@ -20,7 +20,7 @@ namespace JetHerald
var msg = messageEventArgs.Message;
var chatid = msg.Chat.Id;
var topicName = cmd.Parameters[0];
int affected = await db.RemoveSubscription(topicName, chatid);
int affected = db.RemoveSubscription(topicName, chatid);
if (affected >= 1)
return $"unsubscribed from {topicName}";
else

View File

@ -8,9 +8,9 @@ namespace JetHerald.Controllers
public class EchoController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> Get(string msg)
public IActionResult Get(string msg)
{
await Task.Delay(100);
Task.Delay(100);
return Ok(msg);
}

View File

@ -19,15 +19,15 @@ namespace JetHerald.Controllers
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] ReportArgs args)
public IActionResult Post([FromBody] ReportArgs args)
{
var t = await Db.GetTopic(args.Topic);
var t = Db.GetTopic(args.Topic);
if (t == null)
return new NotFoundResult();
else if (!t.WriteToken.Equals(args.WriteToken, StringComparison.OrdinalIgnoreCase))
return StatusCode(403);
await Herald.PublishMessage(t, args.Message);
Herald.PublishMessage(t, args.Message);
return new OkResult();
}

View File

@ -5,7 +5,6 @@ using Dapper;
using Microsoft.Extensions.Options;
using System;
using System.Security.Cryptography;
using System.Transactions;
namespace JetHerald
{
@ -36,30 +35,30 @@ namespace JetHerald
public long? ChatId { get; set; }
}
public async Task<int> DeleteTopic(string name, string adminToken)
public int DeleteTopic(string name, string adminToken)
{
using (var c = GetConnection())
{
return await c.ExecuteAsync("DELETE FROM topic WHERE Name = @name AND AdminToken = @adminToken", new { name, adminToken });
return c.Execute("DELETE FROM topic WHERE Name = @name AND AdminToken = @adminToken", new { name, adminToken });
}
}
public async Task<Topic> GetTopic(string name)
public Topic GetTopic(string name)
{
using (var c = GetConnection())
return await c.QuerySingleOrDefaultAsync<Topic>("SELECT * FROM topic WHERE Name = @name", new { name });
return c.QuerySingleOrDefault<Topic>("SELECT * FROM topic WHERE Name = @name", new { name });
}
public async Task<Topic> GetTopic(string token, long chatId)
public Topic GetTopic(string token, long chatId)
{
using (var c = GetConnection())
return await c.QuerySingleOrDefaultAsync<Topic>(
return c.QuerySingleOrDefault<Topic>(
"SELECT t.*, tc.ChatId " +
"FROM topic t LEFT JOIN topic_chat tc ON t.TopicId = tc.TopicId AND tc.ChatId = @chatId " +
"WHERE ReadToken = @token", new { token, chatId});
}
public async Task<Topic> CreateTopic(long userId, string name, string descr)
public Topic CreateTopic(long userId, string name, string descr)
{
var t = new Topic
{
@ -72,7 +71,7 @@ namespace JetHerald
};
using (var c = GetConnection())
{
return await c.QuerySingleOrDefaultAsync<Topic>(
return c.QuerySingleOrDefault<Topic>(
" INSERT INTO herald.topic " +
" (TopicId, CreatorId, Name, Description, ReadToken, WriteToken, AdminToken) " +
" VALUES " +
@ -81,28 +80,28 @@ namespace JetHerald
t);
}
}
public async Task<IEnumerable<long>> GetChatIdsForTopic(uint topicid)
public IEnumerable<long> GetChatIdsForTopic(uint topicid)
{
using (var c = GetConnection())
return await c.QueryAsync<long>("SELECT ChatId FROM topic_chat WHERE TopicId = @topicid", new { topicid });
return c.Query<long>("SELECT ChatId FROM topic_chat WHERE TopicId = @topicid", new { topicid });
}
public async Task<IEnumerable<Topic>> GetTopicsForChat(long chatid)
public IEnumerable<Topic> GetTopicsForChat(long chatid)
{
using (var c = GetConnection())
return await c.QueryAsync<Topic>("SELECT t.* FROM topic_chat ct JOIN topic t on t.TopicId = ct.TopicId WHERE ct.ChatId = @chatid", new { chatid });
return c.Query<Topic>("SELECT t.* FROM topic_chat ct JOIN topic t on t.TopicId = ct.TopicId WHERE ct.ChatId = @chatid", new { chatid });
}
public async Task CreateSubscription(uint topicId, long chatId)
public void CreateSubscription(uint topicId, long chatId)
{
using (var c = GetConnection())
await c.ExecuteAsync("INSERT INTO topic_chat (ChatId, TopicId ) VALUES (@chatId, @topicId)", new { topicId, chatId });
c.Execute("INSERT INTO topic_chat (ChatId, TopicId ) VALUES (@chatId, @topicId)", new { topicId, chatId });
}
public async Task<int> RemoveSubscription(string topicName, long chatId)
public int RemoveSubscription(string topicName, long chatId)
{
using (var c = GetConnection())
return await c.ExecuteAsync(
return c.Execute(
"DELETE tc " +
"FROM topic_chat tc JOIN topic t ON tc.TopicId = t.TopicId " +
"WHERE t.Name = @topicName AND tc.ChatId = @chatId;",

View File

@ -53,15 +53,15 @@ namespace JetHerald
Client.StartReceiving();
}
public async Task PublishMessage(Db.Topic topic, string message)
public void PublishMessage(Db.Topic topic, string message)
{
var chatIds = await Db.GetChatIdsForTopic(topic.TopicId);
var chatIds = Db.GetChatIdsForTopic(topic.TopicId);
var formatted = $"|{topic.Description}|:\n{message}";
foreach (var c in chatIds)
await Client.SendTextMessageAsync(c, formatted);
_ = Client.SendTextMessageAsync(c, formatted);
}
async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
{
var msg = messageEventArgs.Message;
if (msg == null || msg.Type != MessageType.Text)
@ -69,9 +69,9 @@ namespace JetHerald
try
{
var reply = await Commands.Execute(sender, messageEventArgs);
var reply = Commands.Execute(sender, messageEventArgs);
if (reply != null)
await Client.SendTextMessageAsync(
_ = Client.SendTextMessageAsync(
chatId: msg.Chat.Id,
text: reply,
replyToMessageId: msg.MessageId);