diff --git a/JetKarmaBot/Commands/AwardCommand.cs b/JetKarmaBot/Commands/AwardCommand.cs index 178561f..0d45773 100644 --- a/JetKarmaBot/Commands/AwardCommand.cs +++ b/JetKarmaBot/Commands/AwardCommand.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Telegram.Bot; @@ -14,9 +14,10 @@ namespace JetKarmaBot.Commands public bool Execute(CommandString cmd, MessageEventArgs args) { + var currentLocale = Locale[Db.Chats[args.Message.Chat.Id].Locale]; if (args.Message.ReplyToMessage == null) { - Client.SendTextMessageAsync(args.Message.Chat.Id, Locale["jetkarmabot.award.errawardnoreply", "en-US"]); + Client.SendTextMessageAsync(args.Message.Chat.Id, currentLocale["jetkarmabot.award.errawardnoreply"]); return true; } @@ -29,7 +30,7 @@ namespace JetKarmaBot.Commands { Client.SendTextMessageAsync( args.Message.Chat.Id, - Locale["jetkarmabot.award.errawardself", "en-US"], + currentLocale["jetkarmabot.award.errawardself"], replyToMessageId: args.Message.MessageId); return true; } @@ -39,8 +40,8 @@ namespace JetKarmaBot.Commands Client.SendTextMessageAsync( args.Message.Chat.Id, awarding - ? Locale["jetkarmabot.award.errawardbot", "en-US"] - : Locale["jetkarmabot.award.errrevokebot", "en-US"], + ? currentLocale["jetkarmabot.award.errawardbot"] + : currentLocale["jetkarmabot.award.errrevokebot"], replyToMessageId: args.Message.MessageId); return true; } @@ -52,10 +53,10 @@ namespace JetKarmaBot.Commands Db.AddAward(awardTypeId, awarder.Id, recipient.Id, args.Message.Chat.Id, awarding ? 1 : -1); string message = awarding - ? string.Format(Locale["jetkarmabot.award.awardmessage", "en-US"], awardType.Name, "@" + recipient.Username) - : string.Format(Locale["jetkarmabot.award.revokemessage", "en-US"], awardType.Name, "@" + recipient.Username); + ? string.Format(currentLocale["jetkarmabot.award.awardmessage"], awardType.Name, "@" + recipient.Username) + : string.Format(currentLocale["jetkarmabot.award.revokemessage"], awardType.Name, "@" + recipient.Username); - var response = message + "\n" + String.Format(Locale["jetkarmabot.award.statustext", "en-US"], "@" + recipient.Username, Db.CountUserAwards(recipient.Id, awardTypeId), awardType.Symbol); + var response = message + "\n" + String.Format(currentLocale["jetkarmabot.award.statustext"], "@" + recipient.Username, Db.CountUserAwards(recipient.Id, awardTypeId), awardType.Symbol); Client.SendTextMessageAsync( args.Message.Chat.Id, diff --git a/JetKarmaBot/Commands/ChangeLanguageCommand.cs b/JetKarmaBot/Commands/ChangeLanguageCommand.cs new file mode 100644 index 0000000..f19165f --- /dev/null +++ b/JetKarmaBot/Commands/ChangeLanguageCommand.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Telegram.Bot; +using Telegram.Bot.Args; +using Telegram.Bot.Types; +using Perfusion; + +namespace JetKarmaBot.Commands +{ + class ChangeLanguageCommand : IChatCommand + { + public IReadOnlyCollection Names => new[] { "changelanguage", "lang" }; + + public bool Execute(CommandString cmd, MessageEventArgs args) + { + var currentLocale = Locale[Db.Chats[args.Message.Chat.Id].Locale]; + if (cmd.Parameters.Length < 1) + { + Client.SendTextMessageAsync( + args.Message.Chat.Id, + currentLocale["jetkarmabot.changelanguage.noparams"], + replyToMessageId: args.Message.MessageId); + return true; + } + Db.ChangeChatLocale(Db.Chats[args.Message.Chat.Id], cmd.Parameters[0]); + currentLocale = Locale[Db.Chats[args.Message.Chat.Id].Locale]; + Client.SendTextMessageAsync( + args.Message.Chat.Id, + currentLocale["jetkarmabot.changelanguage.justchanged"], + replyToMessageId: args.Message.MessageId); + return true; + } + + [Inject(true)] Db Db { get; set; } + [Inject(true)] TelegramBotClient Client { get; set; } + [Inject(true)] Localization Locale { get; set; } + } +} diff --git a/JetKarmaBot/Commands/StatusCommand.cs b/JetKarmaBot/Commands/StatusCommand.cs index 468cc38..8899d0b 100644 --- a/JetKarmaBot/Commands/StatusCommand.cs +++ b/JetKarmaBot/Commands/StatusCommand.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Collections.Generic; using System.Text; @@ -15,6 +15,7 @@ namespace JetKarmaBot.Commands public bool Execute(CommandString cmd, MessageEventArgs args) { + var currentLocale = Locale[Db.Chats[args.Message.Chat.Id].Locale]; var asker = args.Message.From; var awardTypeName = cmd.Parameters.FirstOrDefault(); @@ -24,7 +25,7 @@ namespace JetKarmaBot.Commands { var awards = Db.CountAllUserAwards(asker.Id); - response = Locale["jetkarmabot.status.listalltext", "en-US"] + "\n" + response = currentLocale["jetkarmabot.status.listalltext"] + "\n" + string.Join("\n", awards.Select(a => $" - {Db.AwardTypes[a.AwardTypeId].Symbol} {a.Amount}")); } @@ -33,7 +34,7 @@ namespace JetKarmaBot.Commands var awardTypeId = Db.GetAwardTypeId(cmd.Parameters.FirstOrDefault()); var awardType = Db.AwardTypes[awardTypeId]; - response = string.Format(Locale["jetkarmabot.status.listspecifictext", "en-US"], Db.CountUserAwards(asker.Id, awardTypeId), awardType.Symbol); + response = string.Format(currentLocale["jetkarmabot.status.listspecifictext"], Db.CountUserAwards(asker.Id, awardTypeId), awardType.Symbol); } Client.SendTextMessageAsync( diff --git a/JetKarmaBot/JetKarmaBot.cs b/JetKarmaBot/JetKarmaBot.cs index 9196c9e..76e06e2 100644 --- a/JetKarmaBot/JetKarmaBot.cs +++ b/JetKarmaBot/JetKarmaBot.cs @@ -1,4 +1,4 @@ -using JetKarmaBot.Commands; +using JetKarmaBot.Commands; using Perfusion; using System; using System.Net; @@ -63,6 +63,7 @@ namespace JetKarmaBot Commands.Add(c.ResolveObject(new StartCommand())); Commands.Add(c.ResolveObject(new AwardCommand(Me))); Commands.Add(c.ResolveObject(new StatusCommand())); + Commands.Add(c.ResolveObject(new ChangeLanguageCommand())); } #endregion diff --git a/JetKarmaBot/Services/Db.cs b/JetKarmaBot/Services/Db.cs index a8d4f93..d329b32 100644 --- a/JetKarmaBot/Services/Db.cs +++ b/JetKarmaBot/Services/Db.cs @@ -15,17 +15,17 @@ namespace JetKarmaBot public void AddChat(Chat chat) { lock (m_SyncRoot) - if (!m_Chats.ContainsKey(chat.ChatId)) - { - Conn.Execute(@"INSERT INTO chat - (chatid) + if (!m_Chats.ContainsKey(chat.ChatId)) + { + Conn.Execute(@"INSERT INTO chat + (chatid,locale) VALUES - (@ChatId)", - chat); - m_Chats.Add(chat.ChatId, chat); - } + (@ChatId,@Locale)", + chat); + m_Chats.Add(chat.ChatId, chat); + } } - + Dictionary m_Users; public IReadOnlyDictionary Users => m_Users; public void AddUser(User user) @@ -37,7 +37,7 @@ namespace JetKarmaBot (userid) VALUES (@UserId)", - user); + user); m_Users.Add(user.UserId, user); } } @@ -49,10 +49,22 @@ namespace JetKarmaBot public int CountUserAwards(long userId, byte awardTypeId) { return Conn.QuerySingle - ( - "SELECT SUM(amount) FROM award WHERE toid = @userId AND awardtypeid = @awardTypeId", - new { userId, awardTypeId } - ) ?? 0; + ( + "SELECT SUM(amount) FROM award WHERE toid = @userId AND awardtypeid = @awardTypeId", + new { userId, awardTypeId } + ) ?? 0; + } + + public void ChangeChatLocale(Chat chat, string locale) + { + lock (m_SyncRoot) + { + chat.Locale = locale; + Conn.Execute(@"UPDATE chat + SET locale=@Locale + WHERE chatid=@ChatID", + chat); + } } public struct UserAwardsReport @@ -64,26 +76,23 @@ namespace JetKarmaBot public IEnumerable CountAllUserAwards(long userId) { return Conn.Query - ( - @"SELECT SUM(amount) AS amount, t.awardtypeid + ( + @"SELECT SUM(amount) AS amount, t.awardtypeid FROM award a JOIN awardtype t on a.awardtypeid = t.awardtypeid WHERE toid = @userId GROUP BY awardtypeid;", - new { userId } - ); + new { userId } + ); } - - - public byte GetAwardTypeId(string name) - => AwardTypesByCommandName.GetOrDefault(name)?.AwardTypeId ?? DefaultAwardTypeId; + public byte GetAwardTypeId(string name) => AwardTypesByCommandName.GetOrDefault(name)?.AwardTypeId ?? DefaultAwardTypeId; public bool AddAward(byte awardTypeId, long fromId, long toId, long chatId, int amount) { - AddChat(new Chat() { ChatId = chatId }); - AddUser(new User() { UserId = fromId}); - AddUser(new User() { UserId = toId }); + AddChat(new Chat() { ChatId = chatId }); + AddUser(new User() { UserId = fromId }); + AddUser(new User() { UserId = toId }); int affected = Conn.ExecuteScalar( @"INSERT INTO award @@ -98,6 +107,7 @@ namespace JetKarmaBot public class Chat { public long ChatId { get; set; } + public string Locale { get; set; } } public class User @@ -151,6 +161,6 @@ namespace JetKarmaBot } #endregion - void Log (string Message) => Console.WriteLine($"[{nameof(Db)}]: {Message}"); + void Log(string Message) => Console.WriteLine($"[{nameof(Db)}]: {Message}"); } -} +} \ No newline at end of file diff --git a/JetKarmaBot/Services/Localization.cs b/JetKarmaBot/Services/Localization.cs index f5bf332..0538e31 100644 --- a/JetKarmaBot/Services/Localization.cs +++ b/JetKarmaBot/Services/Localization.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; @@ -31,24 +32,34 @@ namespace JetKarmaBot Log("Initialized!"); } - public string this[string name, string locale] + public Locale this[string locale] { - get => GetString(name, locale); - } - public string GetString(string name, string locale) - { - if (!locales[locale].ContainsKey(name)) - { - Log(name + " doesn't exist in this localization"); - locales[locale][name] = "unknown"; - File.WriteAllText("lang/" + locale + ".json", JObject.FromObject(locales[locale]).ToString()); - return "unknown"; - } - else - { - return locales[locale][name]; - } + get => new Locale(locales[locale], locale); } void Log(string Message) => Console.WriteLine($"[{nameof(Localization)}]: {Message}"); + public class Locale + { + private Dictionary locale; + private string localeName; + public Locale(Dictionary locale, string localeName) + { + this.locale = locale; + this.localeName = localeName; + } + public string this[string name] + { + get + { + if (!locale.ContainsKey(name)) + { + return "unknown"; + } + else + { + return locale[name]; + } + } + } + } } -} +} \ No newline at end of file diff --git a/JetKarmaBot/lang/en-US.json b/JetKarmaBot/lang/en-US.json index bc6a84f..d8b68e9 100644 --- a/JetKarmaBot/lang/en-US.json +++ b/JetKarmaBot/lang/en-US.json @@ -7,5 +7,7 @@ "jetkarmabot.award.revokemessage": "Revoked a {0} from {1}!", "jetkarmabot.award.statustext": "{0} is at {1}{2} now.", "jetkarmabot.status.listalltext": "Your badges report:", - "jetkarmabot.status.listspecifictext": "You are at {0}{1} now." + "jetkarmabot.status.listspecifictext": "You are at {0}{1} now.", + "jetkarmabot.changelanguage.noparams": "Sorry, but I don't speak the null language.", + "jetkarmabot.changelanguage.justchanged": "good" } \ No newline at end of file diff --git a/JetKarmaBot/lang/ru-RU.json b/JetKarmaBot/lang/ru-RU.json index 6c83e11..ec24352 100644 --- a/JetKarmaBot/lang/ru-RU.json +++ b/JetKarmaBot/lang/ru-RU.json @@ -7,5 +7,7 @@ "jetkarmabot.award.revokemessage": "Отнял \"{0}\" у {1}!", "jetkarmabot.award.statustext": "У {0} теперь {1}{2}.", "jetkarmabot.status.listalltext": "У вас :", - "jetkarmabot.status.listspecifictext": "У вас сейчас {0}{1}." + "jetkarmabot.status.listspecifictext": "У вас сейчас {0}{1}.", + "jetkarmabot.changelanguage.noparams": "Простите, но я не могу говорить на нуллевом языке.", + "jetkarmabot.changelanguage.justchanged": "хорошо" } \ No newline at end of file