Page MenuHomePhabricator (Chris)

No OneTemporary

Size
602 KB
Referenced Files
None
Subscribers
None
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/ai.sh b/ai.sh
index d43f645..4ecb6d6 100644
--- a/ai.sh
+++ b/ai.sh
@@ -1,12 +1,12 @@
#!/bin/sh
if [ ! -f ./configuration.lua ]
then
echo "Please insert the required variables into configuration.example.lua. Then, you need to rename configuration.example.lua to configuration.lua!"
else
cd helpers/
while true; do
lua ai.lua
- echo "AI has stopped!"
+ echo "AI helper has stopped!"
sleep 3s
done
fi
diff --git a/configuration.example.lua b/configuration.example.lua
index 859ae1c..c8a1c5f 100644
--- a/configuration.example.lua
+++ b/configuration.example.lua
@@ -1,389 +1,398 @@
--[[
_ _ _
_ __ ___ __ _| |_| |_ __ _| |_ __ _
| '_ ` _ \ / _` | __| __/ _` | __/ _` |
| | | | | | (_| | |_| || (_| | || (_| |
|_| |_| |_|\__,_|\__|\__\__,_|\__\__,_|
- Configuration file for mattata v1.4.1
+ Configuration file for mattata v1.5
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
Each value in an array should be comma separated, with the exception of the last value!
Make sure you always update your configuration file after pulling changes from GitHub!
]]
local configuration = { -- Rename this file to configuration.lua for the bot to work!
['bot_token'] = '', -- In order for the bot to actually work, you MUST insert the Telegram
-- bot API token you received from @BotFather.
['connected_message'] = 'Connected to the Telegram bot API!', -- The message to print when the bot is connected to the Telegram bot API
- ['version'] = '1.4.1', -- the version of mattata, don't change this!
+ ['version'] = '1.5', -- the version of mattata, don't change this!
-- The following two tokens will require you to have setup payments with @BotFather, and
-- a Stripe account with @stripe!
['stripe_live_token'] = '', -- Payment token you receive from @BotFather.
['stripe_test_token'] = '', -- Test payment token you receive from @BotFather.
['admins'] = { -- Here you need to specify the numerical ID of the users who shall have
-- FULL control over the bot, this includes access to server files via the lua and shell plugins.
221714512
},
['allowlist_plugin_exceptions'] = { -- An array of plugins that will still be used for allowlisted users.
'antispam'
},
['beta_plugins'] = { -- An array of plugins that only the configured bot admins are able to use.
'array_of_beta_plugins'
},
['permanent_plugins'] = { -- An array of plugins that can't be disabled with /plugins.
'plugins',
'help',
'administration',
'about'
},
['updates'] = {
['timeout'] = 3, -- timeout in seconds for api.get_updates()
['limit'] = 100 -- message limit for api.get_updates() - must be between 1-100
},
['language'] = 'en', -- The two character locale to set your default language to.
['log_chat'] = nil, -- This needs to be the numerical identifier of the chat you wish to log
-- errors into. If it's not a private chat it should begin with a '-' symbol.
['log_admin_actions'] = true, -- Should administrative actions be logged? [true/false]
['log_channel'] = nil, -- This needs to be the numerical identifier of the channel you wish
-- to log administrative actions in by default. It should begin with a '-' symbol.
['bug_reports_chat'] = nil, -- This needs to be the numerical identifier of the chat you wish to send
-- bug reports into. If it's not a private chat it should begin with a '-' symbol.
['counter_channel'] = nil, -- This needs to be the numerical identifier of the channel you wish
-- to forward messages into, for use with the /counter command. It should begin with a '-' symbol.
-- The following directory values should NOT have a "/" at the end!
['bot_directory'] = '/path/to/bot',
['download_location'] = '/path/to/downloads', -- The location to save all downloaded media to.
['fonts_directory'] = '/path/to/fonts', -- The location where fonts are stored for CAPTCHAs
['debug'] = true, -- Turn this on to print EVEN MORE information to the terminal.
['redis'] = { -- Configurable options for connecting the bot to redis. Do NOT modify
-- these settings if you don't know what you're doing!
['host'] = '127.0.0.1',
['port'] = 6379,
['password'] = nil,
['db'] = 2
},
['keys'] = { -- API keys needed for the full functionality of several plugins.
['cats'] = '', -- http://thecatapi.com/api-key-registration.html
['translate'] = '', -- https://tech.yandex.com/keys/get/?service=trnsl
['lyrics'] = '', -- https://developer.musixmatch.com/admin/applications
['lastfm'] = '', -- http://www.last.fm/api/account/create
['weather'] = '', -- https://darksky.net/dev/register
['youtube'] = '', -- https://console.developers.google.com/apis
['maps'] = '', -- https://console.cloud.google.com/google/maps-apis
['location'] = '', -- https://opencagedata.com/api
['bing'] = '', -- https://datamarket.azure.com/account/keys
['flickr'] = '', -- https://www.flickr.com/services/apps/create/noncommercial/
['news'] = '', -- https://newsapi.org/
['twitch'] = '', -- https://twitchapps.com/tmi/
['pastebin'] = '', -- https://pastebin.com/api
['dictionary'] = { -- https://developer.oxforddictionaries.com/
['id'] = '',
['key'] = ''
},
['adfly'] = { -- https://ay.gy/publisher/tools#tools-api
['api_key'] = '',
['user_id'] = '',
['secret_key'] = ''
},
['pasteee'] = '', -- https://paste.ee/
['google'] = { -- https://console.developers.google.com/apis
['api_key'] = '',
['cse_key'] = ''
},
['steam'] = '', -- https://steamcommunity.com/dev/apikey
['spotify'] = { -- https://developer.spotify.com/my-applications/#!/applications/create
['client_id'] = '',
['client_secret'] = '',
['redirect_uri'] = 'https://t.me/mattatabot?start='
},
['twitter'] = { -- https://apps.twitter.com/app/new
['consumer_key'] = '',
['consumer_secret'] = ''
},
['imgur'] = { -- https://api.imgur.com/oauth2/addclient
['client_id'] = '',
['client_secret'] = ''
},
['spamwatch'] = '', -- https://t.me/SpamWatchSupport
- ['wolframalpha'] = '' -- https://developer.wolframalpha.com/portal/myapps/
+ ['wolframalpha'] = '', -- https://developer.wolframalpha.com/portal/myapps/
+ ['movies'] = {
+ ['omdb'] = '', -- http://www.omdbapi.com/apikey.aspx
+ ['poster'] = '' -- https://www.myapifilms.com/token.do
+ }
},
['errors'] = { -- Messages to provide a more user-friendly approach to errors.
['connection'] = 'Connection error.',
['results'] = 'I couldn\'t find any results for that.',
['supergroup'] = 'This command can only be used in supergroups.',
['admin'] = 'You need to be a moderator or an administrator in this chat in order to use this command.',
['unknown'] = 'I don\'t recognise that user. If you would like to teach me who they are, forward a message from them to any chat that I\'m in.',
['generic'] = 'An unexpected error occured. Please report this error using /bugreport.'
},
['limits'] = {
['bing'] = {
['private'] = 15,
['public'] = 7
},
['stackoverflow'] = {
['private'] = 12,
['public'] = 8
},
['reddit'] = {
['private'] = 8,
['public'] = 4
},
['chatroulette'] = 512,
['copypasta'] = 300,
['drawtext'] = 1000,
['help'] = {
['per_page'] = 4
+ },
+ ['nick'] = 128,
+ ['plugins'] = {
+ ['per_page'] = 18,
+ ['columns'] = 2
}
},
['administration'] = { -- Values used in administrative plugins
['warnings'] = {
['maximum'] = 10,
['minimum'] = 2,
['default'] = 3
},
['captcha'] = {
['length'] = {
['min'] = 4,
['max'] = 10,
['default'] = 7
},
['size'] = {
['min'] = 20,
['max'] = 50,
['default'] = 40
},
['timeout'] = {
['min'] = 1,
['max'] = 60,
['default'] = 5
}
},
['allowed_links'] = {
'username',
'telegram',
'mattata',
'admin',
'admins'
},
['aliases'] = {
['length'] = {
['min'] = 1,
['max'] = 64
},
['total'] = 150
},
['store_chat_members'] = true,
['global_antispam'] = { -- normal antispam is processed in plugins/antispam.mattata
['ttl'] = 5, -- amount of seconds to process the messages in
['message_warning_amount'] = 10, -- amount of messages a user can send in the TTL until they're warned
['message_allowlist_amount'] = 25, -- amount of messages a user can send in the TTL until they're allowlisted
['allowlist_length'] = 86400, -- amount (in seconds) to allowlist the user for (set it to -1 if you want it forever)
['max_code_length'] = 64 -- maximum length of code or pre entities that are allowed with "remove pasted code" setting on
},
['default'] = {
['antispam'] = {
['text'] = 8,
['forwarded'] = 16,
['sticker'] = 4,
['photo'] = 4,
['video'] = 4,
['location'] = 4,
['voice'] = 4,
['game'] = 2,
['venue'] = 4,
['video_note'] = 4,
['invoice'] = 2,
['contact'] = 2,
['dice'] = 1,
['poll'] = 1
}
},
['feds'] = {
['group_limit'] = 3,
['shortened_feds'] = {
['name'] = 'uuid'
}
}
},
['join_messages'] = { -- Values used in plugins/administration.lua.
'Welcome, NAME!',
'Hello, NAME!',
'Enjoy your stay, NAME!',
'I\'m glad you joined, NAME!',
'Howdy, NAME!',
'Hi, NAME!'
},
['groups'] = {
['name'] = 't.me/username'
},
['sort_groups'] = true, -- Decides whether groups will be sorted by name in /groups.
['stickers'] = { -- Values used in mattata.lua, for administrative plugin functionality.
-- These are the file_id values for stickers which are binded to the relevant command.
['ban'] = {
'AgAD0AIAAlAYNw0',
'AgADzwIAAlAYNw0'
},
['warn'] = {
'AgAD0QIAAlAYNw0',
'AgAD0gIAAlAYNw0'
},
['kick'] = {
'AgAD0wIAAlAYNw0'
}
},
['slaps'] = {
'{THEM} was shot by {ME}.',
'{THEM} was pricked to death.',
'{THEM} walked into a cactus while trying to escape {ME}.',
'{THEM} drowned.',
'{THEM} drowned whilst trying to escape {ME}.',
'{THEM} blew up.',
'{THEM} was blown up by {ME}.',
'{THEM} hit the ground too hard.',
'{THEM} fell from a high place.',
'{THEM} fell off a ladder.',
'{THEM} fell into a patch of cacti.',
'{THEM} was doomed to fall by {ME}.',
'{THEM} was blown from a high place by {ME}.',
'{THEM} was squashed by a falling anvil.',
'{THEM} went up in flames.',
'{THEM} burned to death.',
'{THEM} was burnt to a crisp whilst fighting {ME}.',
'{THEM} walked into a fire whilst fighting {ME}.',
'{THEM} tried to swim in lava.',
'{THEM} tried to swim in lava whilst trying to escape {ME}.',
'{THEM} was struck by lightning.',
'{THEM} was slain by {ME}.',
'{THEM} got finished off by {ME}.',
'{THEM} was killed by magic.',
'{THEM} was killed by {ME} using magic.',
'{THEM} starved to death.',
'{THEM} suffocated in a wall.',
'{THEM} fell out of the world.',
'{THEM} was knocked into the void by {ME}.',
'{THEM} withered away.',
'{THEM} was pummeled by {ME}.',
'{THEM} was fragged by {ME}.',
'{THEM} was desynchronized.',
'{THEM} was wasted.',
'{THEM} was busted.',
'{THEM}\'s bones are scraped clean by the desolate wind.',
'{THEM} has died of dysentery.',
'{THEM} fainted.',
'{THEM} is out of usable Pokemon! {THEM} whited out!',
'{THEM} is out of usable Pokemon! {THEM} blacked out!',
'{THEM} whited out!',
'{THEM} blacked out!',
'{THEM} says goodbye to this cruel world.',
'{THEM} got rekt.',
'{THEM} was sawn in half by {ME}.',
'{THEM} died. I blame {ME}.',
'{THEM} was axe-murdered by {ME}.',
'{THEM}\'s melon was split by {ME}.',
'{THEM} was sliced and diced by {ME}.',
'{THEM} was split from crotch to sternum by {ME}.',
'{THEM}\'s death put another notch in {ME}\'s axe.',
'{THEM} died impossibly!',
'{THEM} died from {ME}\'s mysterious tropical disease.',
'{THEM} escaped infection by dying.',
'{THEM} played hot-potato with a grenade.',
'{THEM} was knifed by {ME}.',
'{THEM} fell on his sword.',
'{THEM} ate a grenade.',
'{THEM}\'s parents got shot by {ME}.',
'{THEM} practiced being {ME}\'s clay pigeon.',
'{THEM} is what\'s for dinner!',
'{THEM} was terminated by {ME}.',
'{THEM} was shot before being thrown out of a plane.',
'{THEM} was not invincible.',
'{THEM} has encountered an error.',
'{THEM} died and reincarnated as a goat.',
'{ME} threw {THEM} off a building.',
'{THEM} is sleeping with the fishes.',
'{THEM} got a premature burial.',
'{ME} replaced all of {THEM}\'s music with Nickelback.',
'{ME} spammed {THEM}\'s email.',
'{ME} cut {THEM}\'s genitals off with a rusty pair of scissors!',
'{ME} made {THEM} a knuckle sandwich.',
'{ME} slapped {THEM} with pure nothing.',
'{ME} hit {THEM} with a small, interstellar spaceship.',
'{THEM} was quickscoped by {ME}.',
'{ME} put {THEM} in check-mate.',
'{ME} RSA-encrypted {THEM} and deleted the private key.',
'{ME} put {THEM} in the friendzone.',
'{ME} molested {THEM} in a shed.',
'{ME} slaps {THEM} with a DMCA takedown request!',
'{THEM} became a corpse blanket for {ME}.',
'Death is when the monsters get you. Death comes for {THEM}.',
'Cowards die many times before their death. {THEM} never tasted death but once.',
'{THEM} died of hospital gangrene.',
'{THEM} got a house call from Doctor {ME}.',
'{ME} beheaded {THEM}.',
'{THEM} got stoned...by an angry mob.',
'{ME} sued the pants off {THEM}.',
'{THEM} was impeached.',
'{THEM} was beaten to a pulp by {ME}.',
'{THEM} was forced to have cheeky bum sex with {ME}!',
'{THEM} was one-hit KO\'d by {ME}.',
'{ME} sent {THEM} to /dev/null.',
'{ME} sent {THEM} down the memory hole.',
'{THEM} was a mistake.',
'{THEM} is a failed abortion.',
'{THEM}\'s birth certificate is just an apology letter from their local condom dispensary.',
'\'{THEM} was a mistake.\' - {ME}',
'{ME} checkmated {THEM} in two moves.',
'{THEM} was brutally raped by {ME}.'
}
}
local get_plugins = function(extension, directory)
extension = extension and tostring(extension) or 'lua'
if extension:match('^%.') then
extension = extension:match('^%.(.-)$')
end
directory = directory and tostring(directory) or 'plugins'
if directory:match('/$') then
directory = directory:match('^(.-)/$')
end
local plugins = {}
local list = io.popen('ls ' .. directory .. '/')
local all = list:read('*all')
list:close()
for plugin in all:gmatch('[%w_-]+%.' .. extension .. ' ?') do
plugin = plugin:match('^([%w_-]+)%.' .. extension .. ' ?$')
table.insert(plugins, plugin)
end
return plugins
end
local get_fonts = function()
local fonts = {}
local list = io.popen('ls fonts/')
local all = list:read('*all')
list:close()
for font in all:gmatch('%a+') do
table.insert(fonts, font)
end
return fonts
end
configuration.plugins = get_plugins()
configuration.administrative_plugins = get_plugins(nil, 'plugins/administration')
configuration.administration.captcha.files = get_fonts()
for _, v in pairs(configuration.administrative_plugins) do
table.insert(configuration.plugins, v)
end
return configuration
--[[
End of configuration, you're good to go.
Use `./launch.sh` to start the bot.
If you can't execute the script, try running `chmod +x launch.sh`
]]
\ No newline at end of file
diff --git a/helpers/transcribe.lua b/helpers/transcribe.lua
new file mode 100644
index 0000000..c353542
--- /dev/null
+++ b/helpers/transcribe.lua
@@ -0,0 +1,84 @@
+package.path = '/usr/local/share/lua/5.3/?.lua;/usr/local/share/lua/5.3/?/init.lua;/usr/local/lib/lua/5.3/?.lua;/usr/local/lib/lua/5.3/?/init.lua;../?.lua;./?/init.lua'
+local redis = require('libs.redis')
+local configuration = require('configuration')
+local api = require('telegram-bot-lua.core').configure(configuration.bot_token)
+local tools = require('telegram-bot-lua.tools')
+local https = require('ssl.https')
+local json = require('dkjson')
+local ltn12 = require('ltn12')
+
+while true do
+ local messages = redis:keys('transcribe:*:*')
+ if next(messages) then
+ for _, msg in pairs(messages) do
+ local message = json.decode(redis:get(msg))
+ local voice = message.voice
+ local file = api.get_file(voice.file_id)
+ if file then
+ local file_name = file.result.file_path
+ local file_path = string.format('https://api.telegram.org/file/bot%s/%s', configuration.bot_token, file_name)
+ tools.download_file(file_path, voice.file_id .. '.oga', configuration.bot_directory .. '/')
+ os.execute('ffmpeg -i ' .. configuration.bot_directory .. '/' .. voice.file_id .. '.oga -ac 1 -y ' .. configuration.bot_directory .. '/' .. voice.file_id .. '.mp3')
+ os.remove(configuration.bot_directory .. '/' .. voice.file_id .. '.oga')
+ file = io.open(configuration.bot_directory .. '/' .. voice.file_id .. '.mp3', 'r')
+ local current = file:seek()
+ local size = file:seek('end')
+ file:seek('set', current)
+ size = tonumber(size)
+ os.remove(configuration.bot_directory .. '/' .. voice.file_id .. '.mp3')
+ local response = {}
+ local _, res = https.request({
+ ['url'] = 'https://api.wit.ai/speech',
+ ['method'] = 'POST',
+ ['headers'] = {
+ ['Authorization'] = 'Bearer ' .. configuration.keys.transcribe,
+ ['Content-Type'] = 'audio/mpeg3',
+ ['Content-Length'] = size
+ },
+ ['redirect'] = false,
+ ['source'] = ltn12.source.file(file),
+ ['sink'] = ltn12.sink.table(response)
+ })
+ if res == 200 then
+ local jstr = table.concat(response)
+ local jdat = json.decode(jstr)
+ if jdat then
+ local nothing = {
+ '*bong noises*',
+ '*tumbleweed passes*',
+ '*silent noises*',
+ '*unknown sounds*'
+ }
+ local text = jdat.text or jdat._text or false
+ local output = '<pre>Transcription ' .. tools.symbols.next .. ' ' .. nothing[math.random(#nothing)] .. '</pre>'
+ if text and text ~= '' then
+ output = '<pre>Transcription ' .. tools.symbols.next .. ' ' .. tools.escape_html(text) .. '</pre>'
+ end
+ local ids = {
+ 'CQACAgQAAx0CVClmWQACHZFe-9jPBIqWiyNMnkLTBsogIZGFeQACIQcAAvNJ2VOZvtK5bU4CSBoE',
+ 'CQACAgQAAx0CVClmWQACHZZe-9og8tRI6K4ZjQaxpMxAva5gjQACIgcAAvNJ2VNwy64JjeDiwRoE'
+ }
+ if math.random(2) == 2 and (not text or text == '') then
+ if math.random(3) == 1 then
+ api.send_voice(message.chat.id, 'AwACAgEAAx0CSdNVGgABBus7XvvbfQNDreQ-ZFMedF8xYDagcjsAAt4AAx7N4UfVVxLVLBpPZxoE')
+ else
+ api.send_audio(message.chat.id, ids[math.random(#ids)], nil, nil, nil, nil, nil, false, message.message_id)
+ end
+ else
+ api.send_reply(message, output, 'html')
+ end
+ redis:del(msg)
+ else
+ error('No jdat object!')
+ end
+ else
+ print('Connection error!', '[' .. res .. ']')
+ end
+ else
+ error('No file!')
+ end
+ redis:del(msg)
+ end
+ end
+ os.execute('sleep 1.5s')
+end
\ No newline at end of file
diff --git a/languages/ar_ar.lua b/languages/ar_ar.lua
index a4d08da..82d1358 100644
--- a/languages/ar_ar.lua
+++ b/languages/ar_ar.lua
@@ -1,805 +1,805 @@
-- This is a language file for mattata
-- Language: ar_ar
-- Author: disk3
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev),
return {
['errors'] = {
['connection'] = 'خطا في الاتصال.',
['results'] = 'لا نتائج.',
['supergroup'] = 'هذا الامر فقط للمجموعات الكبيرة.',
['admin'] = 'يجب أن تكون مشرفاً أو منشئاً لإستخدام هذا الأمر',
['unknown'] = 'لا أعرف هذا الشخص. إذا أردت أن تعرفني علية، حول أيً من رسائلة إلى أي محادثة أنا فية',
['generic'] = 'حصلت مشكلة!',
['use'] = 'استخدام هذا غير مسموح!',
['private'] = 'يمكنك استعمال هذا الأمر في الخاص فقط'
},
['addcommand'] = {
['1'] = 'يرجى تحديد الأمر بالشكل <code> /command - المحتوى</code>',
['2'] = 'لم تعطني امر!',
['3'] = 'وصف الامر لا يمكن ان يكون اطول من 256 أحرف!',
['4'] = 'حدث خطأ لم يتم إضافة الأمر!',
['5'] = 'تم إضافة الأمر بنجاح!'
},
['addrule'] = {
['1'] = 'يرجى تحديد النص لقانون المجموعة!',
['2'] = 'ليس لديك أية قوانين حالية لكي تضيف له. يرجى إرسال /setrules لضبط القوانين!',
['3'] = 'لا يمكن إضافة القانون؛ النص طويل جدا أكثر من حد التليجرام 4096 احرف!',
['4'] = 'لا يمكن أضافة هذا القانون لأنه يحتوي على تحديدات خط غير مدعومة!',
['5'] = 'تم تحديث القانون بنجاح!'
},
['addslap'] = {
['1'] = 'يمكن استعماله فقط في المجموعات!',
['2'] = 'لا يمكن استعمال هذه الأقواس في أمر الصفعة بعيدا عن الثوابت!',
['3'] = 'الحد الأقصى الأحرف 256!',
['4'] = 'تم إضافة هذه الصفعة بنجاح!',
['5'] = 'يجب أن تضع هذه القوانين في الصفعة، {ME} يعني اسم الشخص الصافع، {THEM} اسم الشخص المصفوع'
},
['administration'] = {
['1'] = 'تفعيل الأدمنية',
['2'] = 'تعطيل الأدمنية',
['3'] = 'إعدادات تكرار الرسائل',
['4'] = 'إعدادات التحذير',
['5'] = 'الحظر بتصويت الأعضاء',
['6'] = 'ترحيب الأعضاء الجدد؟',
['7'] = 'ارسال القوانين عند الانضمام؟',
['8'] = 'ارسال القوانين في المجموعة؟',
['9'] = 'رجوع',
['10'] = 'التالي',
['11'] = 'فلترة الكلمة',
['12'] = 'مانع البوت',
['13'] = 'مانع الروابط',
['14'] = 'تسجيل الافعال؟',
['15'] = 'كتم العربية',
['16'] = 'عقوبة تكرار الرسائل',
['17'] = 'حظر',
['18'] = 'طرد',
['19'] = 'مسح الأوامر؟',
['20'] = 'رد الإنجليزي فقط؟',
['21'] = 'ارسال الاعدادات بالمجموعة؟',
['22'] = 'مسح الرد على الأوامر؟',
['23'] = 'طلب تحقق للمنضمين؟',
['24'] = 'تحقق inline للمنضمين؟',
['25'] = 'طرد المشبوهين تلقائياً؟',
['26'] = 'عدد التحذيرات لكي يتم %s:',
['27'] = 'عدد التصويتات المطلوبة:',
['28'] = 'عدد التصويتات الرفض للإلغاء:',
['29'] = 'تم مسح %s, من قاعدة البيانات',
['30'] = 'لا يوجد قيمة مطابقة لهذا "%s" في قاعدة البيانات!',
['31'] = 'لست مشرفاً في تلك المحادثة!',
['32'] = 'اقل عدد التصويتات للحظر بالتصويت هي %s.',
['33'] = 'أقصى عدد التصويتات للحظر بالتصويت هي %s.',
['34'] = 'اقل عدد رفض التصويت للحظر بالتصويت هي %s.',
['35'] = 'أقصى عدد رفض التصويت للحظر بالتصويت هي %s.',
['36'] = 'اقصى عدد التحذيرات هي %s.',
['37'] = 'أقل عدد التحذيرات هي %s.',
['38'] = 'يمكنك إضافة كلمات بالأمر الاتي /filter <الكلمة>',
['39'] = 'لن يتم اشعارك بأن الاضافة (الادمنية) معطلة, استعمل /administration لتفعيله.',
['40'] = 'ليست محادثة صالحة!',
['41'] = 'على ما يبدو أنك لست مشرفاً هناك!',
['42'] = 'خاصيتي (الادمنية) يمكن استعمالها في مجموعات/قنوات..اذا كنت تبحث عن المساعدة باستعمالها، اكتب /help ثم قسم "الادمنية",لو كنت تريد إدارة مجموعة لم الإشراف فيها أرسل /administration <اسم المحادثة>.',
['43'] = 'استعمل الأزرار السفلية لتضبيط اعدادات الإدارية في <b>%s</b>:',
['44'] = 'ارسل لي [رسالة خاصة](https://t.me/%s), لكي أرسل لك المعلومة.',
['45'] = 'ارسلت لك معلومتك في الخاص',
['46'] = 'ازالة تثبيتات القناة؟',
['47'] = 'ازالة باقي تثبيتات؟',
['48'] = 'مسح الكود الملصوق؟',
['49'] = 'منع بوتات inline؟',
['50'] = 'طرد مرسل الصور عند انضمام؟',
['51'] = 'اطفاء الاضافات للكل؟'
},
['afk'] = {
['1'] = 'عذرا, هذا الخاصية متاحة فقط للأشخاص، بإسم مستخدم @username!',
['2'] = 'رجع %s, بعد غياب %s!',
['3'] = 'ملاحظة',
['4'] = '%s مشغول الآن,%s'
},
['antispam'] = {
['1'] = 'تعطيل',
['2'] = 'تفعيل',
['3'] = 'تعطيل الحد',
['4'] = 'تفعيل الحد في %s',
['5'] = 'جميع إعدادات الادمنية',
['6'] = ' طردت %s [%s] %s [%s] من %s [%s] لتجاوز حد التكرار [%s] للوسائط.',
['7'] = 'طردت %s لتجاوز حد التكرار [%s] للوسائط.',
['8'] = 'الحد الأقصى هي 100.',
['9'] = 'الحد الأدنى هي 1.',
['10'] = 'ضبط حد التكرار ل %s ادناه:',
['11'] = 'مرحبا %s, إذا ترسل كود أطول من %s حرف, استعمل /paste في <a href="https://t.me/%s"> محادثة خاصة معي</a>!',
['12'] = '%s <code>[%s]</code> لديه %s %s <code>[%s]</code> من %s <code>[%s]</code> لإرسال روابط الدعوة.\n#chat%s #المستخدم%s',
['13'] = '%s %s لإرسال روابط دعوة.',
['14'] = 'مرحبا, لاحظت أنك مفعل مانع روابط، ولا تسمح المستخدمين بنشر روابط حتى الذي استعملته ,إذا أردت أن تسمح رابطك استعمل /whitelistlink <رابط>.',
['15'] = 'طردت %s <code>[%s]</code> من %s <code>[%s]</code> لارسال صورة عند أول دخول.\n#محادثة%s #مستخدم%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'عرض في ايتونز',
['2'] = 'التقييم',
['3'] = 'التقييمات'
},
['authspotify'] = {
['1'] = 'انت بالفعل مخول بهذا الحساب.',
['2'] = 'يتم التخويل، يرجى الانتضار...',
['3'] = 'حصل خطأ في الإتصال، هل الرابط صالح؟ مثال الرابط',
['4'] = 'تم التخويل بنجاح!'
},
['avatar'] = {
['1'] = 'لم أحصل على الصور الخاصة بالمستخدم, يرجى التأكد من إدخال اسم مستخدم صالح أو ID.',
['2'] = 'لا يملك المستخدم هذا أية صور.',
['3'] = 'لا يملك المستخدم هذا الكم من الصور!',
['4'] = 'هذا المستخدم رفض خاصية تجميع البيانات عنه, وعليه لست مخولا لإظهار صورهِ.',
['5'] = 'مستخدم: %s\nصورة: %s/%s\nارسل /avatar %s [رقم] الى @%s لإظهار الصورة ذات الرقم المعطى',
['6'] = 'مستخدم: %s\nصورة: %s/%s\nاستعمل /avatar %s [رقم] لإظهار صورة ذات الرقم المطلوب',
},
['ban'] = {
['1'] = 'من يجب على حظره؟ , يمكنك تحديد المستخدم مع @username او ID الرقمي..',
['2'] = ' لا أستطيع حظر المشرفين و المنشئين.',
['3'] = 'لا أستطيع حظر هذا الشخص لأنهم خارج المجموعة اصلاً.',
['4'] = 'لا يمكنني حظر هذا الشخص لأنه محظور بالفعل.',
['5'] = 'اجعلني مشرفا لكي احظر هذا المستخدم، حاول مجددا لاحقا.',
['6'] = '%s <code>[%s]</code> حظر %s <code>[%s]</code> من %s <code>[%s]</code>%s.\n%s %s',
['7'] = 'قام %s بحظر %s%s.'
},
['bash'] = {
['1'] = 'حدد أمراً لتنفيذه!',
['2'] = 'نجح!'
},
['blacklist'] = {
['1'] = 'أي مستخدم تريده في القائمة السوداء؟ حدد بوساطة @username او ID الرقمي.',
['2'] = 'لا أستطيع وضع المشرفين و المنشئين في القائمة السوداء',
['3'] = 'لا أستطيع وضعه في القائمة السوداء لأنه خارج المجموعة اصلاً.',
['4'] = 'لا أستطيع وضعه في القائمة السوداء لأنه محظور من المجموعة اصلاً.',
['5'] = 'وضع %s <code>[%s]</code> ... %s <code>[%s]</code> في القائمة السوداء، لمنع استعمال %s <code>[%s]</code> في %s <code>[%s]</code>%s.\n%s %s',
['6'] = 'وضع %s %s في القائمة السوداء من استعمال %s%s.'
},
['blacklistchat'] = {
['1'] = 'تم وضع %s بالقائمة السوداء، سوف أغادر عند انضمامي هنا.!',
['2'] = '%s مستخدم, هذا الأمر للمجموعات و ليس المستخدمين!',
['3'] = ' هذا المحادثة %s لا يبدو صالحاً'
},
['bugreport'] = {
['1'] = 'تم إرسال تقرير الأخطاء للمطور!. عنوان ID للبلاغ هي #%s.',
['2'] = 'حصلت مشكلة أثناء هذه العملية، يا لحظك!'
},
['calc'] = {
['1'] = 'اضغط لإرسال النتائج.',
['2'] = 'هذه الكلمة "%s" غير متوقعة!',
['3'] = 'لا يمكن وضع وحدة قبل الأرقام!!'
},
['captionbotai'] = {
['1'] = 'لا أستطيع وصف الصورة!'
},
['cats'] = {
['1'] = 'مياو :3!'
},
['channel'] = {
['1'] = 'غير مسموح لك القيام بهذا!',
['2'] = 'انت لست مشرفا في المحادثة!',
['3'] = 'فشلت في ارسال رسالتك، هل انت متاكد انه اذوناتي لكتابه الرسائل مفعله؟',
['4'] = 'تم ارسال رسالتك!',
['5'] = 'لا استطيع الحصول على لائحه مشرفين المحادثه!',
['6'] = 'يبدو انك لست مشرفا المحادثه!',
['7'] = 'حدد رساله المطلوبه للارسال، استعمل الصيغه /channel <القناة> <الرسالة>.',
['8'] = 'هل انت متاكد انك تريد ارسال هذه الرساله؟ سوف تبدو هكذا:',
['9'] = 'نعم انا متاكد!',
['10'] = 'الرساله تحتوي على تحديدات هن غير مدعومه ! يرجى تصحيح الصيغه والمحاوله مجددا.'
},
['chatroulette'] = {
['1'] = 'مرحبا! لا ترسل رسائل اطول من %s حرف. لكي لا تزعج المستخدم الثاني!',
['2'] = '*قال المجهول:*\n```\n%s\n```\nلإنهاء الجلسة, ارسل /endchat.',
['3'] = 'للاسف فقدت الاتصال بالمستخدم الاخر! لبدء محادثه جديده ارسل رجاءا /chatroulette!',
['4'] = 'الشخص الذي تتحدث معه انهى الجلسه. لبدء محادثه جديده ارسل /chatroulette.',
['5'] = 'تم بدء جلسة بنجاح. لبدء واحده جديده أرسل /chatroulette.',
['6'] = 'لقد ازلتك من لائحة مستخدمين المتوفرين بنجاح.',
['7'] = 'لا تملك جلسه حاليا. لبدء واحده جديده ارسل /chatroulette.',
['8'] = 'جاري البحث عن الجلسه انتضر...',
['9'] = 'لسوء الحظ لا يوجد اي مستخدمين حاليا لكني اضفتك الى لائحه المستخدمين المتوفرين! لايقاف هذا كليا ارسل /endchat.',
['10'] = 'لقد جمعتك بنجاح مع شخص اخر في الجلسه! تذكر رجاءا ان تكون لطيفا! ايقاف الجلسه ارسل /endchat.',
['11'] = 'لسوء الحظ الشخص الذي حاولت انشاء الجلسه معه محظور. ارسل رجاءا /chatroulette للمحاوله!',
['12'] = 'لقد تم جمعكبنجاح مع شخص اخر في محادثه! تذكر ان تكون لطيفا معهم! لانهاء الجلسه ارسل /endchat.'
},
['commandstats'] = {
['1'] = 'لم يتم ارسال اي اوامر في هذه المحادثه!',
['2'] = '<b> احصائيات الاوامر في:</b> %s\n\n%s\n<b> مجمل الاوامر المستعمله:</b> %s',
['3'] = 'تم مسح التفاصيل الاوامر المستعمله!',
['4'] = 'فشل مسح التفاصيل الاوامر المستعمله في هذه المحادثه على الاغلب لانها ممسوحه اصلا؟'
},
['control'] = {
['1'] = 'تهي, أنت تتمنى!',
['2'] = 'جاري تحميل %s...'
},
['copypasta'] = {
['1'] = 'النص الذي قمت بالرد عليه لا يجب ان يتجاوز %s احرف!'
},
['coronavirus'] = {
['1'] = [[* احصائيات COVID-19 عن:* %s
*الحالات الموثقه الجديده:* %s
*الحالات الموثقه الكليه:* %s
*احصائيات الموت الجديده:* %s
*اجمالي الموت:* %s
*حالات التعافي الجديده:* %s
*حالات التعافى الكليه:* %s]]
},
['counter'] = {
['1'] = 'لم استطع اضافه العداد الى تلك الرساله!'
},
['custom'] = {
['1'] = 'تم النجاح! سوف يرسل رساله في كل مره يرسل احدهم %s!',
['2'] = 'الرد "%s" غير موجود!',
['3'] = 'تم مسح الرد "%s"!',
['4'] = 'ليس لديك اي ردود خاصه محفوظه!',
['5'] = 'الاوامر الخاصه في %s:\n',
['6'] = 'لصنع امر خاص جديد استعمل الصيغه الاتيه:\n/custom new #<كلمة> <الرد>... لعرض كل الردود الحاليه استعمل الأمر /custom list. لمسح رد استعمل /custom del #<كلمة>.'
},
['delete'] = {
['1'] = 'لم أستطع مسح الرسالة. ربما لان الرساله قديمه جدا او غير موجوده؟'
},
['demote'] = {
['1'] = 'اي مستخدم تريد مني تخفيضه؟ يمكنك تحديد بوساطة @username أو ID.',
['2'] = 'لماذا تريد مني تخفيظه من هو ليس مشرفا أو منشئا.',
['3'] = 'لا يمكنني تخفيضه لانه خارج المحادثه.',
['4'] = 'لا يمكنني تخفيض هذا المستخدم لانه مطرود من المحادثه.'
},
['dice'] = {
['1'] = 'النطاق الادنى هي: %s.',
['2'] = 'النطاق الاعلى والعد هما %s.',
['3'] = 'النطاق الاقصى هي %s, والعداد الادنى هي %s.',
['4'] = 'نطاق %s هي %s:\n'
},
['doge'] = {
['1'] = 'ادخل النص الذي تريده في صورة الكلب. كل جمله يجب ان تكون مفصوله بسطر جديد او سلاش'
},
['donate'] = {
['1'] = '<b>مرحبا, %s!</b>\n\nلو تشعر بالكرم, يمكنك التبرع لمشروع mattata, بدعمنا بشكل إرادي بأي كمية. سوف تستعمل كلها لتكاليف الخوادم و تعويضاً للوقت و الموارد المستعملة في المشروع. هذا **اختياري**, على كل حال مساهمتك مشكورة و ستظهر اسمك في صفحتنا على كيت هاب\n\nإذا أردت الاستمرار, رابط الدعم المادي<a href="https://paypal.me/wrxck"> هنا</a>. شكرا جزيلا لدعمك!'
},
['duckduckgo'] = {
['1'] = 'لا أعرف ما هذا :/!'
},
['eightball'] = {
['1'] = 'نعم.',
['2'] = 'لا.',
['3'] = 'على مايبدو هي كذلك.',
['4'] = 'همممم،...حسنا، لو كنت مكانك لسألت مرة اخرى'
},
['exec'] = {
['1'] = 'حدد لغة البرمجة:',
['2'] = 'خطا في الاتصال. هل كنت تنوي صنع اضرار؟',
['3'] = 'اختيارك هي "%s" – هل استمر؟',
['4'] = 'رجوع',
['5'] = 'استمر',
['6'] = 'ادخل البرمجة لتنفيذه. لا حاجة لتحديد لغتها, سوف نهتم بها لاحقا!',
['7'] = 'حدد لغة البرمجة:'
},
['facebook'] = {
['1'] = 'حدثت مشكلة!',
['2'] = 'ادخل اسم مستخدم الفيسبوك للحصول على صوره،.',
['3'] = 'افتح @%s في الفيسبوك'
},
['fact'] = {
['1'] = 'اصنع غيرها'
},
['fban'] = {
['1'] = 'اي مستخدم علي حظره بالحظر الجماعي؟ حدد باسم @username او ID الرقمي.',
['2'] = ' لا يمكنني حظر هذا الشخص جماعيا لأنه مشرف أو منشئ هنا',
},
['flickr'] = {
['1'] = 'بحثك كانت عن:',
['2'] = 'ادخل كلمة البحث(المراد البحث عنه مثل: "لمبوركيني" سوف يظهر لك ما لا يمكنك الحصول عليه :p).',
['3'] = 'المزيد'
},
['fortune'] = {
['1'] = 'اضغط لإرسال حظك!'
},
['frombinary'] = {
['1'] = 'ادخل الرقم الثنائي لتحويله الى كلمات.',
['2'] = 'المعطيات تالفة!'
},
['game'] = {
['1'] = 'إجمالي الفوز: %s\nإجمالي الخسارة: %s\nالرصيد: %s عملة متاتا',
['2'] = 'انضمام للعبة',
['3'] = 'هذه اللعبة انتهت!',
['4'] = ' دورك الآن!',
['5'] = 'لست مشاركاً في اللعبة!',
['6'] = 'لا يمكنك الذهاب هنا!',
['7'] = 'انت مشترك باللعبة فعلا!',
['8'] = 'لقد بدأت اللعبة بالفعل!',
['9'] = 'يقوم %s [%s] باللعب ضد %s [%s]\nإنه دور%s حالياً!',
['10'] = 'فاز %s على %s!',
['11'] = 'تعادل %s مع %s!',
['12'] = 'بانتضار متحدٍ...',
['13'] = 'لعبه X O',
['14'] = 'اضغط لإرسال اللعبة لمحادثتك!',
['15'] = 'احصائيات %s:\n',
['16'] = 'إلعب X O!'
},
['gblacklist'] = {
['1'] = 'ردَ على المستخدم لوضعه في قائمة السوادء الشاملة, أو حددهم باسم المستخدم أو ID.',
['2'] = ' فشلت في تحصيل المعلومات عن "%s", رجاءا تأكد أنه اسم مستخدم أو ID صالح و حاول.',
['3'] = 'همم، هذا %s, وليس مستخدماً!'
},
['gif'] = {
['1'] = 'اعطي كلمات البحث رجاءا، (الذي تريد البحث عنه في GIPHY مثلا memes سيظهر لك متحركات الميمز :-:)'
},
['godwords'] = {
['1'] = 'ادخل قيمة عددية يتراوح بين 1 الى 64!',
['2'] = 'رقم صغيرٌ جدا, حدد واحداً بين 1 الى 64!',
['3'] = 'رقم كبيرٌ جدا, حدد واحداً بين 1 الى 64!',
},
['gwhitelist'] = {
['1'] = 'ردَ على المستخدم لازالته من قائمة السوادء الشاملة, أو حددهم باسم المستخدم أو ID.',
['2'] = ' فشلت في تحصيل المعلومات عن "%s", رجاءا تأكد أنه اسم مستخدم أو ID صالح و حاول.',
['3'] = 'همم، هذا %s, وليس مستخدماً!'
},
['hackernews'] = {
['1'] = 'ابرز العناوين Hacker News:'
},
['help'] = {
['1'] = 'لا نتائج!',
['2'] = 'لا يوجد ميزة تم الحصول عليها باسم "%s", حاول أنت تكون دقيقا أكثر!',
['3'] = '\n\nالجملة: <مطلوب> [اختياري]\n\nابحث عن المميزات أو ابحث بخاصية inline - فقط الصق هذا المعرف بمكان الكتابة @%s ثم <كلمة البحث>.',
['4'] = 'السابق',
['5'] = 'التالي',
['6'] = 'رجوع',
['7'] = 'البحث',
['8'] = 'الصفحة رقم %s من %s!',
['9'] = [[
أستطيع إدارة مجموعتك فقط اجعلني مشرفا وارسل /administration لضبط الاعدادات لمجموعتك.
الأوامر الشائعة:
• /pin <نص> - تثبيت الرسالة
• /ban - حظر المستخدمين بالرد أو /ban @username
• /kick - طرد
• /unban - إلغاء الحظر
• /setrules <نص> - ضبط قوانين المجموعه، يحصل عليها من الأمر /rules
]],
['10'] = [[
• /setwelcome - وضع ترحيب،،(يمكن استعمال أشياء مذهلة ايضا. مثل $name اكتبه بالرسالة الترحيب فيكتب اسم الشخص المرحب به او, $chat_id الكتابه ID المحادثة في الرسالة الترحيبية, $user_id لكتابة ID الشخص المرحب به, $title لادخال اسم المحادثة $username لادخال المعرف الشخص المركزي به برسالة الترحيب( إذا المستخدم لا يملك اسم المستخدم سيتم استخدام اسمه بدلا من ذلك)
• /warn - تحذير المخالفة ثم الطرد بعد تجاوز الحد الاقصى
• /mod - ترقية الناس،، لا ترقي احد الا اذا كنت تثق به
• /demod - تخفيض الرتبة
• /staff - عرض المجموعة الاشرافية
]],
['11'] = [[
• /report - تاك الادمنية
• /setlink <الرابط> - حفظ الروابط,, يحصل عليه من قبل الاعضاء بباستعمال الامر /link
• /links <نص> - عدم حظر جميع الروابط التي ترسل هذا الامر اليه ردا على رسالة الحاوية للروابط المطلوبة
]],
['12'] = 'ادناه روابط قد تكون مفيدة:',
['13'] = 'تواصل',
['14'] = 'قناتنا',
['15'] = 'دعم',
['16'] = 'الاسئلة',
['17'] = 'السورس',
['18'] = 'تبرع',
['19'] = 'تقييم',
['20'] = 'سجلات الطرد',
['21'] = 'إعدادات المشرف',
['22'] = 'الإضافات',
['23'] = [[
<b>مرحبا %s! اسمي %s, سررت بمعرفتك </b> %s
أستطيع فهم أوامر عديدة، يمكنك معرفة الأوامر بالضغط على زر "الاوامر" أدناه
%s <b>نصيحة:</b> استعمل زر "الاعدادات" لتغيير أسلوب عملي %s!
%s <b>لو استفدت مني, أو تريد المساعدة فقط؟</b> سوف تسرني بدعم مالي صغير , استعمل الأمر /donate لمزيد من المعلومات!
]],
['24'] = 'داخل'
},
['id'] = {
['1'] = 'لا أعرف هذا الشخص. إذا أردت أن تعرفني علية، حول أيً من رسائلة إلى أي محادثة أنا فية أو أخبرهم بمراسلتي',
['2'] = 'المحادثة المطلوبة:',
['3'] = 'هذه المحادثة:',
['4'] = 'اضغط لإرسال النتائج!'
},
['imdb'] = {
['1'] = 'السابق',
['2'] = 'التالي',
['3'] = 'انت في الصفحة %s من %s!'
},
['import'] = {
['1'] = 'لا أعرف هذه المحادثة!',
['2'] = 'هذه ليس مجموعه خارقة, وعليه لن أستطيع استيراد أيه الاعدادات منه!',
['3'] = 'تم الاستيراد اعدادات الاشراف و الاضافات المفعلة من %s إلى %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s ملف التفاصيل: %s
%s الوضع: %s
%s بوابة TCP: %s
%s الإصدار: %s
%s وقت التشغيل: %s days
%s تفاصيل العملية: %s
%s مفاتيح منتهيه الصلاحية: %s
%s عدد المستخدمين: %s
%s عدد المجموعات: %s
النظام:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s في الانستكرام'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 شفرة: %s\nSHA1 شفرة: %s\nحجم الملف: %s كيكا</code>\n\n<i>%s %s</i>',
['2'] = 'هذا النظام خارج عملية التسجيل!',
['3'] = 'هذا النظام يتم تسجيله!',
['4'] = 'حدد موديلك:',
['5'] = 'حدد إصدار النظام:',
['6'] = 'حدد نوع الجهاز:',
['7'] = 'iPod الملموس',
['8'] = 'ايفون',
['9'] = 'ايباد',
['10'] = 'Apple تلفاز'
},
['ispwned'] = {
['1'] = 'تم العثور على الحساب في التسريبات ادناه:'
},
['isup'] = {
['1'] = 'هذا الموقع يبدو نشطا',
['2'] = 'لا يبدو هذا موقعاً صالحا!',
['3'] = 'الموقع غير نشط عندي كذلك'
},
['itunes'] = {
['1'] = 'الاسم:',
['2'] = 'الفنان:',
['3'] = 'الالبوم:',
['4'] = 'الأغنية:',
['5'] = 'القرص:',
['6'] = 'لم يتم العثور على الطلب الأصلي , لقد مسحت رسالتك الأصلية على الأغلب.',
['7'] = 'القطعة الفنية موجودة ادناه:',
['8'] = 'ادخل كلمة البحث (ما تريد البحث عنه مثل "شيلات" ستظهر نتائج عن الشيلات (—~—).',
['9'] = 'احصل على الالبوم',
},
['kick'] = {
['1'] = 'من علي طرده؟ حدد بالمعروف خاصتهم @username or ID.',
['2'] = 'لا يمكنني طرد المشرفين و المنشئين.',
['3'] = 'لا يمكن طرد هذا الشخص لأنه خارج المجموعة اصلا.',
['4'] = 'لا يمكن طرد هذا الشخص لأنه مطرود اصلا.',
['5'] = 'اجعلني مشرفاً لكي أستطيع طردهم. وفر هذا رجاءاً, وحاول مجددا',
},
['lastfm'] = {
['1'] = 'تم تغيير اسم last.fm الخاصة في %s إلى "%s".',
['2'] = 'تم المسح!',
['3'] = 'ليست هناك أي اسم مستخدم last.fm!',
['4'] = 'حدد اسم مستخدم last.fm او اصنع واحدة بالأمر /fmset.',
['5'] = 'لم يتم العثور على سجلات لهذا المستخدم.',
['6'] = 'يقوم %s بالاستماع إلى:\n',
['7'] = 'استمع %s آخر مرة الى:\n',
['8'] = 'مجهول',
['9'] = 'اضغط لإرسال النتائج.'
},
['lmgtfy'] = {
['1'] = 'دعني ابحثها في الكوكل لك!'
},
['location'] = {
['1'] = 'لم تعيين ايه مواقع سابقة،، ماذا تود أن يكون الموقع الحالي؟'
},
['logchat'] = {
['1'] = 'ادخل المعرف ID المحادثة التي تودني أن أرسل سجلات الأفعال مثل الطرد و غيرها.',
['2'] = 'جارٍ التحقق من صلاحية المحادثة...',
['3'] = 'للاسف، أن أنه المحادثةُ غير موجودة,أو أنك نسيت اضافتي هناك، تأكد من هذا و حاول مجددا.',
['4'] = 'فقط المحادثات و القنوات، لايمكن اختبار مستخدم!',
['5'] = 'لا يبدو انك مشرف في تلك محادثه !',
['6'] = 'على ما يبدو، إنه المحادثة قيد الاستخدام من قبلي فعلا، استعمل /logchat بتحديد واحده جديده.',
['7'] = 'تبدو المحادثه جيده سوف ارسل رساله تجريبيه اليها للتاكد فحسب انني املك حقوق ارسال الرسائل!',
['8'] = 'مرحبا ايها العالم - هذه رساله تجريبيه - اذا كنت تقراها فان كل شيء على ما يرام!',
['9'] = 'تم بنجاح! من الان فصاعدا سوف يرسل الجميع السجلات الى %s - لتغيير المحادثه المرسله اليه الاحداث ارسل /logchat.',
},
['lua'] = {
['1'] = 'ادخل معطيات Lua',
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'اظهار كلمات الاغنيه',
['3'] = 'ادخل كلمه البحث(لاغنيه/الفنان الذي تريد مني إحضار كلمات اغنيت، مثال "This is america" سوف يكون رد البوت كلمات هذه الاغنيه.',
},
['minecraft'] = {
['1'] = '<b> قام المستخدم %s بتغير اسمه بمرة %s</b>',
['2'] = '<b>قام المستخدم %s بتغيير اسمه %s مرات</b>',
['3'] = 'السابق',
['4'] = 'التالي',
['5'] = 'رجوع',
['6'] = 'UUID',
['7'] = 'الصور الشخصية',
['8'] = 'تاريخ المعرف',
['9'] = 'حدد اختياراً:',
['10'] = 'ادخل اسم لاعب الماينكرافت الذي تريد عرض معلوماته،(مثال ارسال "cucumber" لعرض معلومات اللاعب المسمى cucumber).',
['11'] = 'اسماء الماينكرافت تتراوح بين 3 إلى 16 كحد أقصى.'
},
['msglink'] = {
['1'] = 'الامر المجموعات فقط و القنوات.',
['2'] = 'هذا %s يجب أن يكون عام ليس خاصا.',
['3'] = 'رد على الرسالة المطلوبة رابطه.'
},
['mute'] = {
['1'] = 'من يجب علي كتمه؟ حدد بواسطه المعرف @username او ID أو الرد.',
['2'] = 'لا استطيع كتم هذا الشخص لانه مكتوم اصلا .',
['3'] = 'لا استطيع كتم المشرفين او منشئين.',
['4'] = 'لا استطيع كتم هذا المستخدم لانه غادر المجموعه بالفعل -او قد طرد منه هو-.',
['5'] = 'احتاج أوامر الإشراف لكي احظر المستخدمين، رجاءا اصلح هذا وحاول مجددا.',
},
['myspotify'] = {
['1'] = 'الصفحه شخصيه',
['2'] = 'يتابع',
['3'] = 'المشغله مؤخرا',
['4'] = 'يتم التشغيل الان',
['5'] = 'الاغاني المشهوره',
['6'] = 'صناع الاغاني المشهورين',
['7'] = 'لست تتابع اي فنانين!',
['8'] = 'الفنانين المفضلين لديك',
['9'] = 'لاتملك اي اغاني في قائمة التشغيل!',
['10'] = 'اغانيك المفضله',
['11'] = 'لا يبدو انك تتابعوا اية فنانين',
['12'] = 'الفنانين الذين تتابعهم',
['13'] = 'لا تملك اغاني تم تشغيلها مؤخرا!',
['14'] = '<b>المشغله مؤخرا</b>\n%s %s\n%s %s\n%sتم الاستماع عند %s:%s في %s/%s/%s.',
['15'] = 'تم قبول طلب التكمله ولكن العمليه لم تكتمل.',
['16'] = 'لا يبدو انك تستمع على اية اغاني الان!',
['17'] = 'يتم تشغيلها حاليا',
['18'] = 'حدثت مشكله عند اعاده اعطاء الاذن لحسابك!',
['19'] = 'تم اعاده اعطاء الاذن بنجاح لحساب Spotify! جاري اكمال طلبك السابق...',
['20'] = 'جاري اعاده اعطاء الاذن لحسابك في Spotify, يرجى الانتظار...',
['21'] = 'يجب ان تعطي الاذن ل mattata إذن اتصال مع حسابك في. اضغط [هنا](https://accounts.spotify.com/en/authorize؟client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) اضغط على الزر الاخظر"اوكي". لربط حسابك, ارسل الرابط الذي تم تحويلك اليه (يجب ان يبدا هكذا "%s", متبوعا بكود المميز) ردا لهذه الرسالة.',
['22'] = 'قائمة تشغيل',
['23'] = 'استخدام وضع Inline',
['24'] = 'الكلمات',
['25'] = 'لم يتم العثور على الاجهزه.',
['26'] = 'ليست لديك قائمة تشغيل.',
['27'] = 'قائمة تشغيلك',
['28'] = '%s %s [%s اغاني]',
['29'] = '%s %s [%s]\nSpotify %s المستخدم\n\n<b>الاجهزة:</b>\n%s',
['30'] = 'جاري تشغيل الاغنيه السابقه...',
['31'] = 'انت الان مستخدمون مدفوع!',
['32'] = 'لم اعثر على اي اجهزه.',
['33'] = 'جاري تشغيل الاغنيه التاليه...',
['34'] = 'جاري استئناف الاغنيه...',
['35'] = 'اجهزتك غير متاحه مؤقتا...',
['36'] = 'لم احصل على الاجهزه!',
['37'] = 'جاري ايقاف الاغنيه...',
['38'] = 'مشغل حاليا',
['39'] = 'اختيار عشوائي لأغانيك...',
['40'] = 'الصوت غير مدعوم يرجى الاختيار قيمه تتراوح من 0 الى 100.',
['41'] = 'تم ضبط الصوت الى %s%%!',
['42'] = 'هذه الرساله تستخدمه اضافه من اصدار قديم، طلب واحده جديده بارسال /myspotify!'
},
['name'] = {
['1'] = 'الاسم الذي ارد عليه حاليا هي "%s" - لو اردت تغييره ارسل /name <نص> (حيث <نص> هو ما تريدني ان ارد عليه).',
['2'] = 'اسمي الجديد يجب ان يتراوح بين 2 الى 32 احرف!',
['3'] = 'اسمي يمكن هو الاحتواء وعلى الأحرف اللاتينية فقط!',
['4'] = 'سوف اجيب الى "%s", بدل امين "%s" - لتغيير هذا مجددا ارسل /name <كلمه> حيث <كلمه> هي ما تريدني ان اجيب عليه.)'
},
['netflix'] = {
['1'] = 'اقرا المزيد.'
},
['news'] = {
['1'] = '"<code>%s</code>" ليست صيغه Lua صالحة.',
['2'] = 'لم استطع الحصول على لائحه المصادر.',
['3'] = '<b> تم الحصول على موارد الاخباريه تطابق </b> "<code>%s</code>":\n\n%s',
['4'] = '<b> قائمه المصادر الاخبار </b> /news<b>. Use</b> /nsources &lt;query&gt; <b> البحث في قائمه الاخبار في نتيجه اكثر دقه،، تطابق نتائج البحث هي باستعمال اللغه Lua</b>\n\n%s',
['5'] = 'لا تملك مصدر أخبار مفظلة. ارسل /setnews <المصدر> لضبط واحدة. اظهر لائحة المصادر بإرسال /nsources, أو قلل النتائج باستعمال /nsources <المعطيات>.',
['6'] = 'مصدرك الاخباري المفظل هي %s. استعمل /setnews <المصدر> لتغييره. أعرض اللائحة من /nsources, أو قلل النتائج باستعمال /nsources <المعطيات>',
['7'] = 'مصدرك المغزى بالفعل %s! استعمل /news لعرض آخر الاحداث.',
['8'] = 'المصدر غير مدعوم، أعرض اللائحة من /nsources ,أو قلل النتائج باستعمال /nsources <المعطيات>.',
['9'] = 'مصدرك المفضل تم تحديثه إلى %s! استعمل /news لعرض آخر الأخبار.',
['10'] = 'المصدر غير مدعوم، أعرض اللائحة المصادر من /nsources. إذا لديك مصدر مفظل استعمل /setnews <المصدر> لتحصل على الأخبار منها عند إرسال /news, بدون جمل اضافيه',
['11'] = 'اقرا المزيد.'
},
['nick'] = {
['1'] = ' اسمك المستعار تم نسيانه !',
['2'] = ' اسمك المستعار تم ضبطه إلى "%s"!'
},
['ninegag'] = {
['1'] = 'اقرا المزيد'
},
['optout'] = {--dead util
['1'] = 'لقد انضممت إلى تجميع بياناتك المرسلة! ارسل /optout للخروج.',
['2'] = 'لقد خرجت من تجميع بياناتك المرسلة! ارسل /optoin للسماح.',
},
['paste'] = {
['1'] = 'حدد خدمة لرفع النص إليه:'
},
['pay'] = {
['1'] = 'لديك حاليا %s عملات Matt. حصل المزيد بالفوز في الالعاب XO, بأستعمال /game - ستربح 100 عملاتMatt لكل فوز, و ستخسر 50 لكل خسارة.',
['2'] = 'يجب استعمال الامر ردا على الشخص، لإرسال العملات له.',
['3'] = 'حدد كمية العملات لاعطائها إلى %s.',
['4'] = 'الكمية تكون رقمية فقط، واكبر من 0.',
['5'] = 'لا يمكن إرسال العملات لنفسك',
['6'] = 'لا يوجد رصيد كافي لإكمال التحويل!',
['7'] = 'لقد ارسلت%s عملات إلى %s. كمية عملتلك الآن هي %s.'
},
['pin'] = {
['1'] = 'لم تضبط رسالة مثبتة سابقاً. استعمل /pin <النص> لتثبيت واحدة. تغييرات الخط،، أي الماركداون مدعومة.',
['2'] = 'اخر رسالة تم تثبيتها بالأمر /pin.',
['3'] = 'وجدت تثبيتا جديدا في قاعدة البيانات،، ولكن رسالتي المرسولة تبدو محذوفة,فلا يمكنني إيجادها، اضبط واحدة جديدية بالأمر /pin <النص>. تغييرات الخطوط مدعومة.',
['4'] = 'فشل تجديد الرسالة المثبتة. اما ان نصك المدخل يحوي كلمات خاطئة، أو أن الرسالة المثبتة ممسوحة. سأرسل لك رسالة مثبتة جديدة- لو أردت تعديلها بعد التأكد من وجودها,استعمل /pin <النص>.',
['5'] = 'نصك المدخل يحوي كلمات ماركداون خاطئه.',
['6'] = 'اضغك هنا الرواية رسالة التثبيت المحدثة ↬.'
},
['pokedex'] = {
['1'] = 'الاسم: %s\nID: %s\nالنوع: %s\nالوصف: %s'
},
['prime'] = {
['1'] = 'ادخل رقما بين 1 إلى 99999.',
['2'] = ' الرقم %s اساسي!',
['3'] = 'الرقم %s ليس اساسياً...'
},
['promote'] = {
['1'] = ' لا أستطيع الترقية لأنه من المشرفين و المنشئين.',
['2'] = 'لا أستطيع ترقية هذا الشخص لأنه خارج المجموعة.',
['3'] = 'لا يمكنني ترقيه هذا الشخص لأنه مطرود من المجموعة.',
},
['quote'] = {
['1'] = 'هذا المستخدم رفض خاصية تجميع البيانات.',
- ['2'] = 'لا يوجد "اقتباسات" مخزونة ل(%s%s)! أصنع بوساطة /save ردا على رسالتهم .'
+ ['2'] = 'لا يوجد "اقتباسات" مخزونة ل %s! أصنع بوساطة /save ردا على رسالتهم .'
},
['randomsite'] = {
['1'] = 'اصنع غيرها'
},
['randomword'] = {
['1'] = 'تم الصنع',
['2'] = 'كلمتك العشوائية هي <b>%s</b>!'
},
['report'] = {
['1'] = 'قم بالرد على رسالته، لابلاغ الشخص للمشرفين.',
['2'] = 'لا يمكنك إبلاغ نفسك، هل تظن نفسك أضحوكة XD؟',
['3'] = '<b>يحتاج %s المساعدة في %s!</b>',
['4'] = 'اضغط لعرض الإبلاغ.',
['5'] = 'تم إبلاغ الرسالة للمشرفين بنجاح إلى %s من المشرفين!'
},
['rms'] = {
['1'] = 'يا ربتاه منك يا GNU!'
},
['save'] = {
['1'] = 'هذا المستخدم رفض خاصية تجميع البيانات.',
- ['2'] = 'خزنتها لقاعدتي البيانية, و اضفتها الى الردود المتوقعه عند استعمال /quote ردا على %s%s!'
+ ['2'] = 'خزنتها لقاعدتي البيانية, و اضفتها الى الردود المتوقعه عند استعمال /quote ردا على %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s لم ينوي قول هذا!</i>',
['2'] = '%s\n\n<i>%s اعترف بالهزيمة</i>',
['3'] = '%s\n\n<i>%s غير متأكد من خطئه ...</i>',
['4'] = 'اسكت فحسب, <i>أنا لا اخطى ابدا😌 ؟</i>',
['5'] = '"<code>%s</code>" ليس كودا صالحا.',
['6'] = '<b>مرحبا, %s, هل تعني:</b>\n<i>%s</i>',
['7'] = 'نعم',
['8'] = 'لا',
['9'] = 'ربما'
},
['setgrouplang'] = {
['1'] = 'تم تغيير لغة المجموعة إلى %s!',
['2'] = 'لغتنا الحالية هنا هي %s.\nيرجى العلم ان بعض الكلمات غير مترجمة من قبل الناس، حاليا. اضغط لاختيار لغتك المفضلة من اللوحة أدناه :',
['3'] = 'الاختيار لاجبار متاتا للرد على الانكليزي فقط معطل حاليا. فعله من الأمر /administration ولكن, لجعلها أسهل لك,وضعتها ادناه.',
['4'] = 'تفعيل',
['5'] = 'تعطيل'
},
['setlang'] = {
['1'] = 'تم ضبط لغتك إلى %s!',
['2'] = 'لغتك الحالية %s.\n ربما ليس كل الكلمات مترجمة حاليا. لو أردت تغيير اللغة, حدد من اللوحة المفاتيح:'
},
['setlink'] = {
['1'] = 'رابط غيُر صالح.',
['2'] = 'تم بنجاح!'
},
['setrules'] = {
['1'] = 'خطوط غير مدعومة.',
['2'] = 'تم ضبط القوانين!'
},
['setwelcome'] = {
['1'] = 'ضبط رسالة الترحيب؟ سيرسل الترحيب للأعضاء الجدد(يمكن تعديلها بارسال /help ثم قسم الادمنية, أو بالأمر /administration). يمكن استعمال أشياء مذهلة ايضا. مثل $name اكتبه بالرسالة الترحيب فيكتب اسم الشخص المرحب به او, $chat_id الكتابه ID المحادثة في الرسالة الترحيبية, $user_id لكتابة ID الشخص المرحب به, $title لادخال اسم المحادثة $username لادخال المعرف الشخص المركزي به برسالة الترحيب( إذا المستخدم لا يتكلم اسم المستخدم سيتم استخدام اسمه بدلا من ذلك،).',
['2'] = 'هناك مشكلة بصيغة الملف, تأكد من الماركداون أي كود الخطوط، وحاول مجددا.',
['3'] = 'تم حفظ الرسالة ل%s بنجاح!'
},
['share'] = {
['1'] = 'شارك'
},
['shorten'] = {
['1'] = 'حدد خادما من الأزرار ادناه:'
},
['shsh'] = {
['1'] = 'لم استقبل رد السيرفر لأي SHSH، لهذه ECID, تأكد من صحتها وأنك حفظته من https://tsssaver.1conan.com.',
['2'] = 'ال SHSH ، لهذا الجهاز متاح لهذه الاصدارات من Ios:\n',
['3'] = 'نزل .zip'
},
['statistics'] = {
['1'] = 'لم يرسل ايه رسائل هنا!',
['2'] = '<b>الإحصائيات لهذا:</b> %s\n\n%s\n<b>إجمالي إرسال الرسائل:</b> %s',
['3'] = 'تم المسح الإحصائيات!',
['4'] = 'فشلت في المسرح، ربما هي ممسوحة اصلا؟'
},
['steam'] = {
['1'] = 'اسم المستخدم تم ضبتها إلى "%s".',
['2'] = '"%s" ليست اسما صالحا.',
['3'] = 'المسخدم %s عضو منذ %s, عند %s. آخر تسجيل خروج عند %s, في %s. اضغط <a href="%s">هنا</a> لعرض الصفحه في ستيم.',
['4'] = '%s, AKA "%s",'
},
['synonym'] = {
['1'] = 'الكلمة <b>%s</b>, يبدو احسن من %s.'
},
['thoughts'] = {
['1'] = '%s\n\nايجابي: <code>%s%% [%s]</code>\nسلبي: <code>%s%% [%s]</code>\nمحير: <code>%s%% [%s]</code>\nإجمالي الافكار: <code>%s</code>'
},
['tobinary'] = {
['1'] = 'ادخل الكلمات لتحويلها إلى أرقام ثنائية.'
},
['trust'] = {
['1'] = 'لا أستطيع الثقة لأنه من المشرفين و المنشئين بالفعل.',
['2'] = 'لا أستطيع الثقة بهذا الشخص لأنه خارج المجموعة اصلا.',
['3'] = 'لا يمكنني الثقة بهذا الشخص لأنه مطرود من المجموعة.',
},
['unmute'] = {
['1'] = 'من يجب علي فك كتمه؟ حددهم باستخدام @username او ID.',
['2'] = 'لا يمكنني فك الكتم من هذا الشخص لأنه ليس مكتوم اصلا.',
['3'] = 'لا أستطيع فك الكتم لأنه من المشرفين و المنشئين.',
['4'] = 'لا أستطيع فك الكتم من هذا الشخص لأنه خرج من المجموعة أو انطرد.',
},
['untrust'] = {
['1'] = 'من يجب علي إلغاء الثقة به؟ حددهم باستخدام @username او ID.',
['2'] = 'لا أستطيع إلغاء الثقة لأنه من المشرفين و المنشئين بالفعل.',
['3'] = 'لا أستطيع الغاء الثقة بهذا الشخص لأنه خارج المجموعة اصلا.',
['4'] = 'لا يمكنني إلغاء الثقة بهذا الشخص لأنه مطرود من المجموعة.',
},
['upload'] = {
['1'] = 'رد على الملف، يجب أن يكون < 20 MB.',
['2'] = 'ملف كبير جدا اجعله < 20 MB.',
['3'] = 'لا يمكنني الحصول على الملفات القديمة هنا.',
['4'] = 'حصلت مشكلة أثناء التنزيل.',
['5'] = 'تم التنزيل...- أحصل عليه من هنا <code>%s</code>!'
},
['version'] = {
['1'] = '@%s AKA %s `[%s]` is running mattata %s, created by [Matthew Hesketh](https://t.me/wrxck). The source code is available on [GitHub](https://github.com/wrxck/mattata).'
},
['voteban'] = {
['1'] = 'من تريدني أن أفتح له الحظر بالتصويت؟ حددهم بواسطة @username أو ID.',
['2'] = 'لا استطيع أن أفتح له الحظر بالتصويت لأنه مدير أو مشرف.',
['3'] = 'لا استطيع أن أفتح له الحظر بالتصويت لأنه خارج المجموعة.',
['4'] = 'هل يجب حظر %s [%s] من %s؟ نحتاج %s من التصويت لحظره ,و %s من رفض التصويت لإغلاق هذا.',
['5'] = 'نعم [%s]',
['6'] = 'لا [%s]',
['7'] = 'هذا مطلب الناس لقد حظرت %s [%s] من %s لأن %s صوتوا لهذا.',
['8'] = 'تم تلبية الحظ الأدنى, على كلٍ, لا أستطيع حظر %s - ربما انطردوا أو خرجوا أو تمت ترقيتهم وقت فتح التصويت، أو اخذت مني صلاحية الحظر',
['9'] = 'هذا مطلب الناس. لم احظر %s [%s] من %s لأن الناس المطلوبين %s رفضوا الحظر.',
['10'] = 'لقد اخترت حظر %s [%s]!',
['11'] = ' لقد تراجعت عن اختيارك, اختر من جديد.',
['12'] = 'لقد رفضت حظر %s [%s]!',
['13'] = 'الحظر بالتصويت مفتوح فعلا لهذا الشخص..!'
},
['weather'] = {
['1'] = 'لا موقع لديك. استخدم /setloc <الموقع> لضبط واحدة.',
['2'] = 'الان %s (يبدو مثل %s) في %s. %s'
},
['welcome'] = {
['1'] = 'قوانين المجموعة'
},
['whitelist'] = {
['1'] = 'من علي اعفاءه؟ حدد باستخدام المعرف أو ID.',
['2'] = 'لا أستطيع وضعه في القائمة البيضاء لأنه مدير أو مشرف فلا داعي لهذا.',
['3'] = 'لا أستطيع وضعه في القائمة البيضاء لأنه خارج المجموعة.',
['4'] = 'لا أستطيع وضعه في القائمة البيضاء لأنه محظور.',
},
['wikipedia'] = {
['1'] = 'اقرأ المزيد.'
},
['youtube'] = {
['1'] = 'السابق',
['2'] = 'التالي',
['3'] = 'انت في الصفحة %s من %s!'
}
}
\ No newline at end of file
diff --git a/languages/de_de.lua b/languages/de_de.lua
index a0e0b89..baf3250 100644
--- a/languages/de_de.lua
+++ b/languages/de_de.lua
@@ -1,782 +1,782 @@
-- This is a language file for mattata
-- Language: de-de
-- Author: LKD70, CodeNameT1M
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
- ['connection'] = 'Verbindungs Fehler.',
+ ['connection'] = 'Verbindungs-fehler.',
['results'] = 'Kein Ergebnis gefunden.',
['supergroup'] = 'Dieser Befehl kann nur in Supergruppen benutzt werden.',
['admin'] = 'Für diesen Befehl musst du ein Moderator oder Administrator in dieser Gruppe sein.',
['unknown'] = 'Ich kann den Benutzer nicht erkennen. Wenn du mich lehren möchtest wer dieser Benutzer ist, dann leite einfach eine Nachricht von diesem Benutzer in eine Gruppe in der ich auch bin .',
['generic'] = 'Ein Fehler ist passiert!',
['use'] = 'Du hast keine Benutzungserlaubnis!',
- ['private'] = 'You can only use this command in private chat!'
+ ['private'] = 'Du kannst diesen Command nur im Privatchat nutzen!'
},
['addcommand'] = {
- ['1'] = 'Please specify the command in the format <code>/command - description</code>',
- ['2'] = 'I couldn\'t retrieve my commands!',
- ['3'] = 'The command description can\'t be longer than 256 characters!',
- ['4'] = 'An unknown error occurred! I couldn\'t add your command!',
- ['5'] = 'Success! Command added.'
+ ['1'] = 'Bitte Spezifiziere den Command so: <code>/command - description</code>',
+ ['2'] = 'Ich konnte meine Befehle nicht abrufen!',
+ ['3'] = 'Die Beschreibung des Comands darf nicht länger als 256 Zeichen sein!',
+ ['4'] = 'Ein unbekannter fehler ist passiert, ich war nicht in der Lage den Command hinzuzufügen!',
+ ['5'] = 'Command wurde erfolgreich hinzugefügt.'
},
['addrule'] = {
- ['1'] = 'Please specify the rule you would like to add!',
- ['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
- ['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
- ['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
- ['5'] = 'Successfully updated the rules!'
+ ['1'] = 'Bitte spezifiziere die Regel die du hinzufügen willst!',
+ ['2'] = 'Du hast keine Regeln zum hinzufügen! Bitte erstelle Regeln mit dem Befehl /setrules!',
+ ['3'] = 'Ich konnte diese Regel nicht hinzufügen, da so die Länge der Regel zu lang wäre und Telegram\'s 4096 Zeichen limit überschreiten würde!',
+ ['4'] = 'Ich konnte diese Regel nicht hinzufügen, es scheint so als würde es nicht zulässige Markdown-Formatierungen beinhalten!',
+ ['5'] = 'Regeln wurden erfolgreich aktualisiert!'
},
['addslap'] = {
- ['1'] = 'You can only use this command in groups!',
- ['2'] = 'The slap cannot contain curly braces apart from placeholders!',
- ['3'] = 'The slap cannot be any longer than 256 characters in length!',
- ['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
- ['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
+ ['1'] = 'Du kannst diesen Befehl nur in Gruppen benutzen!',
+ ['2'] = 'Der slap darf keine { oder } außerhalb der Platzhalter haben!',
+ ['3'] = 'Der slap darf nicht länger als 256 Zeichen sein!',
+ ['4'] = 'Ich habe erfolgreich diesen slap hinzugefügt als eine Möglichkeit für /slap in dieser Gruppe!',
+ ['5'] = 'Du musst Platzhalter benutzen im slap. Benutze {ME} für die Person die den Befehl benutzt und {THEM} für das Opfer.'
},
['administration'] = {
- ['1'] = 'Enable Administration',
- ['2'] = 'Disable Administration',
- ['3'] = 'Anti-Spam Settings',
- ['4'] = 'Warning Settings',
- ['5'] = 'Vote-Ban Settings',
- ['6'] = 'Welcome New Users?',
- ['7'] = 'Send Rules On Join?',
- ['8'] = 'Send Rules In Group?',
- ['9'] = 'Back',
- ['10'] = 'Next',
- ['11'] = 'Word Filter',
+ ['1'] = 'Aktiviere Administration',
+ ['2'] = 'Deaktiviere Administration',
+ ['3'] = 'Anti-Spam Einstellungen',
+ ['4'] = 'Warn-Einstellungen',
+ ['5'] = 'Vote-Bann Eintellungen',
+ ['6'] = 'Neue User begrüßen?',
+ ['7'] = 'Regeln senden bei Beitritt?',
+ ['8'] = 'Regeln in Gruppe senden?',
+ ['9'] = 'Zurück',
+ ['10'] = 'Weiter',
+ ['11'] = 'Wort Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
- ['14'] = 'Log Actions?',
+ ['14'] = 'Aktionen loggen?',
['15'] = 'Anti-RTL',
- ['16'] = 'Anti-Spam Action',
- ['17'] = 'Ban',
+ ['16'] = 'Anti-Spam Aktion',
+ ['17'] = 'Bann',
['18'] = 'Kick',
- ['19'] = 'Delete Commands?',
- ['20'] = 'Force Group Language?',
- ['21'] = 'Send Settings In Group?',
- ['22'] = 'Delete Reply On Action?',
- ['23'] = 'Require Captcha?',
- ['24'] = 'Use Inline Captcha?',
- ['25'] = 'Ban SpamWatch-flagged users?',
- ['26'] = 'Number of warnings until %s:',
- ['27'] = 'Upvotes needed to ban:',
- ['28'] = 'Downvotes needed to dismiss:',
- ['29'] = 'Deleted %s, and its matching link from the database!',
- ['30'] = 'There were no entries found in the database matching "%s"!',
- ['31'] = 'You\'re not an administrator in that chat!',
- ['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
- ['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
- ['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
- ['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
- ['36'] = 'The maximum number of warnings is %s.',
- ['37'] = 'The minimum number of warnings is %s.',
- ['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
- ['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
- ['40'] = 'That\'s not a valid chat!',
- ['41'] = 'You don\'t appear to be an administrator in that chat!',
- ['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
- ['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
- ['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
- ['45'] = 'I have sent you the information you requested via private chat.',
- ['46'] = 'Remove Channel Pins?',
- ['47'] = 'Remove Other Pins?',
- ['48'] = 'Remove Pasted Code?',
- ['49'] = 'Prevent Inline Bots?',
- ['50'] = 'Kick Media On Join?',
- ['51'] = 'Enable Plugins For Admins?',
- ['52'] = 'Kick URLs On Join?'
+ ['19'] = 'Commands löschen?',
+ ['20'] = 'Gruppen-Sprache erzwingen?',
+ ['21'] = 'Einstellungen in Gruppe senden?',
+ ['22'] = 'Antwort löschen bei Aktion?',
+ ['23'] = 'Captcha benötigt?',
+ ['24'] = 'Inline Captcha benutzen?',
+ ['25'] = 'Banne SpamWatch-markierte Benutzer?',
+ ['26'] = 'Anzahl der Warunungen bis %s:',
+ ['27'] = 'Upvotes benötigt für Bann:',
+ ['28'] = 'Downvotes benötigt für ignorieren:',
+ ['29'] = 'Löschte %s, war ein passender Link von der Database!',
+ ['30'] = 'Keine Einträge vorhanden in der database passend zu "%s"!',
+ ['31'] = 'Du bist kein Administrator in dieser Gruppe!',
+ ['32'] = 'Die minimale Anzahl von upvotes benötigt für einen vote-bann ist %s.',
+ ['33'] = 'Die maximale Anzahl von upvotes benötigt für einen vote-bann ist %s.',
+ ['34'] = 'Die minimale Anzahl von downvotes benötigt für einen vote-bann ist %s.',
+ ['35'] = 'Die maximale Anzahl von downvotes benötigt für einen vote-bann ist %s.',
+ ['36'] = 'Die maximale Anzahl von Warnungen ist %s.',
+ ['37'] = 'Die minimale Anzahl von Warnungen ist %s.',
+ ['38'] = 'Du kannst ein oder mehrere Wörter hinzufügen zum Wort Filter mit /filter <Wort>',
+ ['39'] = 'Du wirst nicht länger dran erinnert, das das Administrations-Plugin abgeschaltet ist. Um es anzuschalten, benutze /administration.',
+ ['40'] = 'Das ist kein zulässiger Chat!',
+ ['41'] = 'Es sieht nicht so aus, als wärst du Administrator in diesem Chat!',
+ ['42'] = 'Meine Administrativen funktionen können nur in Gruppen benutzt werden! Wenn du Hilfe brauchst meine administrativen Funktionen zu nutzen, schau mal in den "Administration" Bereich bei /help! Alternativ, wenn du die Winstellungen einer Gruppe ändern willst die du Administrierst, du kannst das Hier tun mit dem Befehl /administration <chat>.',
+ ['43'] = 'Benutze die Knöpfe unten um die Administrativen Einstellungen zu ändern von <b>%s</b>:',
+ ['44'] = 'Bitte sende mir eine [private message](https://t.me/%s), damit ich dir diese Information schicken kann.',
+ ['45'] = 'Ich habe dir die angefragten Informationen privat zugeschickt.',
+ ['46'] = 'Entferne Channel Pins?',
+ ['47'] = 'Entferne Other Pins?',
+ ['48'] = 'Entferne Code?',
+ ['49'] = 'Blockiere Inline Bots?',
+ ['50'] = 'Kick Medien bei Beitritt?',
+ ['51'] = 'Aktiviere Plugins für Admins?',
+ ['52'] = 'Kick URLs bei Beitritt?'
},
['afk'] = {
['1'] = 'Tut mir leid. Dieses Feature ist nur dann verfügbar, wenn der Benutzer einen öffentlichen @Benutzername hat!',
['2'] = '%s ist wieder zurück nachdem er/sie nicht anwesend war für %s!',
['3'] = 'Notiz',
['4'] = '%s ist nicht anwesend.%s'
},
['antispam'] = {
- ['1'] = 'Disable',
- ['2'] = 'Enable',
- ['3'] = 'Disable limit',
- ['4'] = 'Enable limits on %s',
- ['5'] = 'All Administration Settings',
- ['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
- ['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
- ['8'] = 'The maximum limit is 100.',
- ['9'] = 'The minimum limit is 1.',
- ['10'] = 'Modify the anti-spam settings for %s below:',
- ['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
- ['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
- ['13'] = '%s %s for sending Telegram invite link(s).',
- ['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
- ['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
- ['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
+ ['1'] = 'Abschalten',
+ ['2'] = 'Anschalten',
+ ['3'] = 'Deaktiviere Limit',
+ ['4'] = 'Aktiviere limits von %s',
+ ['5'] = 'Alle Administrations-Einstellungen',
+ ['6'] = '%s [%s] hat %s [%s] gekickt von %s [%s] für überschreiten des eingestellten anti-spam limits für [%s] Medien.',
+ ['7'] = 'Kickte %s für Überschreitung des eingesellten antispam limits für [%s] Medien.',
+ ['8'] = 'Das maximale Limit ist 100.',
+ ['9'] = 'Das minimale Limit ist 1.',
+ ['10'] = 'Ändere die Anti-Spam Einstellungen für %s unten:',
+ ['11'] = 'Hey %s, wenn du Code sendest der länger ist als %s Zeichen, bitte nutze stattdessen /paste im <a href="https://t.me/%s">privatem Chat mit mir</a>!',
+ ['12'] = '%s <code>[%s]</code> hat %s %s <code>[%s]</code> von %s <code>[%s]</code> für das verschicken von Telegram-Einladungslinks.\n#chat%s #user%s',
+ ['13'] = '%s %s für das verschicken von Telegram-Einladungslinks.',
+ ['14'] = 'Hey, Ich habe gemerkt das du anti-link aktiviert hast und du deinen Nutzern nicht erlaubst einen Chat zu erwähnen den du gerade erwähnt hast,wenn du das erlauben willst, nutze /allowlink <links>.',
+ ['15'] = 'Kickte %s <code>[%s]</code> von %s <code>[%s]</code> für das Senden von Medien in den ersten paar Nachrichten.\n#chat%s #user%s',
+ ['16'] = 'Kickte %s <code>[%s]</code> von %s <code>[%s]</code> für das Senden von URLs in den ersten paar Nachrichten.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'Ansehen in iTunes',
- ['2'] = 'rating',
- ['3'] = 'ratings'
+ ['2'] = 'Bewertung',
+ ['3'] = 'Bewertungen'
},
['authspotify'] = {
- ['1'] = 'You are already authorised using that account.',
- ['2'] = 'Authorising, please wait...',
- ['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
- ['4'] = 'Successfully authorised your Spotify account!'
+ ['1'] = 'Du bist schon authorisiert mit diesem Account.',
+ ['2'] = 'Authorisierung, bitte warten...',
+ ['3'] = 'Ein verbindungs-Fehler ist passiert. Bist du dir sicher das der Link Korrekt war? Es sollte aussehen wie',
+ ['4'] = 'Erfolgreich authorisiert mit deinem Spotify-Account!'
},
['avatar'] = {
['1'] = 'Ich konnte kein Profilbild für den Benutzer abrufen. Bitte sorge dafür, dass du einen gültigen Benutzername oder eine gültige Identifikationsnummer angegeben hast.',
['2'] = 'Dieser Benutzer hat keine Profilbilder.',
['3'] = 'Dieser Benutzer hat nicht viele Profilbilder!',
['4'] = 'Dieser Benutzer ist opted out(ausgetreten) von der Datensammlung funktionalität, deswegen ist es mir nicht möglich die Profil Bilder anzuzeigen.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Welchen Benutzer soll ich sperren? Du kannst den Benutzer mit dem Benutzernamen oder mit der Identifikationsnummer angeben.',
['2'] = 'Ich kann diesen Benutzer nicht sperren, weil er/sie ein Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann diesen Benutzer nicht sperren, weil er/sie die Gruppe schon verlassen hat.',
['4'] = 'Ich kann diesen Benutzer nicht sperren, weil er/sie für die Gruppe schon gesperrt ist.',
['5'] = 'Ich muss Administrationsberechtigung haben damit ich den Benutzer sperren kann. Bitte kümmer dich um das Problem und versuche es noch einmal.',
- ['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
- ['7'] = '%s has banned %s%s.'
+ ['6'] = '%s <code>[%s]</code> hat %s <code>[%s]</code> gebannt von %s <code>[%s]</code>%s.\n%s %s',
+ ['7'] = '%s hat %s%s gebannt.'
},
['bash'] = {
- ['1'] = 'Zum durchführen gebe ein Befehl an bitte!',
+ ['1'] = 'Zum durchführen gebe bitte einen Befehl an!',
['2'] = 'Erfolg!'
},
['blocklist'] = {
- ['1'] = 'Welchen Benutzer soll ich auf die schwarze Liste setzen? Du kannst den Benutzer mit dem Benutzernamen oder mit der Identifikationsnummer angeben.',
- ['2'] = 'Ich kann diesen Benutzer nicht auf die schwarze Liste setzen, weil er/sie ein Moderator oder Administrator in dieser Gruppe ist.',
- ['3'] = 'Ich kann diesen Benutzer nicht auf die schwarze Liste setzen, weil er/sie die Gruppe schon verlassen hat.',
- ['4'] = 'Ich kann diesen Benutzer nicht auf die schwarze Liste setzen, weil er/sie für die gruppe schon gesperrt ist.',
+ ['1'] = 'Welchen Benutzer soll ich auf die Block-Liste setzen? Du kannst den Benutzer mit dem Benutzernamen oder mit der Identifikationsnummer angeben.',
+ ['2'] = 'Ich kann diesen Benutzer nicht auf die Block-Liste setzen, weil er/sie ein Moderator oder Administrator in dieser Gruppe ist.',
+ ['3'] = 'Ich kann diesen Benutzer nicht auf die Block-Liste setzen, weil er/sie die Gruppe schon verlassen hat.',
+ ['4'] = 'Ich kann diesen Benutzer nicht auf die Block-Liste setzen, weil er/sie für die gruppe schon gesperrt ist.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
- ['1'] = '%s ist nun auf der schwarzen Liste. Ich will euch auch verlassen wenn ich hinzugefügt werde!',
- ['2'] = '%s ist ein Benutzer. Dieser Befehl ist für die schwarze Liste von Unterhaltungen wie Gruppen und Kanäle!',
- ['3'] = '%s ist keine gültige Unterhaltung!'
+ ['1'] = '%s ist nun auf der Block-Liste. Ich will euch auch verlassen wenn ich hinzugefügt werde!',
+ ['2'] = '%s ist ein Benutzer. Dieser Befehl ist für die Block-Liste von Unterhaltungen wie Gruppen und Kanäle!',
+ ['3'] = '%s ist keine gültige Gruppe!'
},
['bugreport'] = {
['1'] = 'Erfolg! Dein Fehlerbericht wurde gesendet. Die Identifikationsnummer für diesen Bericht ist #%s.',
['2'] = 'Es ist ein Fehler aufgetreten mit dem Fehlerbericht!'
},
['calc'] = {
['1'] = 'Zum senden des Ergebnis klicken.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'Ich kann das Bild wirklich nicht beschreiben!'
},
['cats'] = {
['1'] = 'Miau!'
},
['channel'] = {
['1'] = 'Du bist nicht berechtigt zum benutzen!',
['2'] = 'Es sieht so aus als wärst du nicht mehr ein Administrator dieser Gruppe!',
['3'] = 'Ich konnte deine Nachricht nicht senden. Bist du sicher, dass ich immer noch befugt bin zum senden von Nachrichten in dieser Gruppe?',
['4'] = 'Deine Nachricht ist gesendet!',
['5'] = 'Es war mir nicht möglich eine List mit Administratoren von dieser Gruppe zu bekommen!',
['6'] = 'Es sieht so aus als wärst kein Administrator dieser Gruppe!',
['7'] = 'Bitte spezifiere die Nachricht und benutze den Syntax /channel <Kanal> <Nachricht>.',
['8'] = 'Bist du dir sicher, dass du die nachricht senden möchtest? Das ist wie es ausehen wird:',
['9'] = 'Ja, ich bin sicher!',
['10'] = 'Diese Nachricht hat ein falsches Format! Bitte korigiere den Syntax und versuche es noch einmal.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'Es wurden keine Befehle in dieser Unterhaltung gesendet!',
['2'] = '<b>Befehl Statistiken für:</b> %s\n\n%s\n<b>Summe der gesendeten Befehle:</b> %s',
['3'] = 'Die Befehl Statistiken für diese Unterhaltung wurden gelöscht!',
['4'] = 'Ich konnte die Befehl Statistiken für diese Unterhaltung nicht löschen. Wurden sie vielleicht schon gelöscht?'
},
['control'] = {
['1'] = 'Pfft, wie du willst!',
['2'] = '%s ist am Neuladen...'
},
['copypasta'] = {
['1'] = 'Der Antowrten-zu text kann nicht länger sein als %s Zeichen!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['custom'] = {
['1'] = 'Erfolg! Die Nachricht wird nun jedesmal gesendet wen jemand %s benutzt!',
['2'] = 'Der Auslöser "%s" existiert nicht!',
['3'] = 'Der Auslöser "%s" ist gelöscht!',
['4'] = 'Du hast keine eigene Auslöser angegeben!',
['5'] = 'Eigene Befehle für %s:\n',
['6'] = 'Zum machen von eigenen Befehlen, benutze diesen Syntax:\n/custom new #Auslöser <Wert>. Zum listen aller bestehenden Auslöser, benutze /custom list. Zum löschen eines Auslösers, benutze /custom del #Auslöser.'
},
['delete'] = {
['1'] = 'Ich konnte die Nachricht nicht löschen. Ist die Nachricht vielleicht zu alt oder existiert nicht?'
},
['demote'] = {
['1'] = 'Welchen Benutzer soll ich degradieren? Du kannst den Benutzer mit dem Benutzernamen oder mit der Identifikationsnummer angeben.',
['2'] = 'Ich kann den Benutzer nicht degradieren, weil er/sie ein Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann den Benutzer nicht degradieren, weil er/sie die Gruppe schon verlassen hat.',
['4'] = 'Ich kann den Benutzer nicht degradieren, weil er/sie von der Gruppe entfernt wurde.'
},
['dice'] = {
['1'] = 'Die mindest Spannweite ist %s.',
['2'] = 'Die maximal Spannweite und Zählung ist beides %s.',
['3'] = 'Die maximal Spannweite ist %s, die maximal Zählung ist %s.',
['4'] = '%s rollt mit einer Spannweite von %s:\n'
},
['doge'] = {
['1'] = 'Bitte gebe den text ein welchen du in Doge-ify sehen willst. Jeder Satz sollte getrennt sein mit Schrägstrich oder neue Zeile..'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['duckduckgo'] = {
['1'] = 'Ich bin nicht sicher was das ist!'
},
['eightball'] = {
['1'] = 'Ja.',
['2'] = 'Nein.',
['3'] = 'Es ist warscheinlich so.',
['4'] = 'Also... Wenn ich du wäre würde ich später noch mal fragen.'
},
['exec'] = {
['1'] = 'Bitte wähle die Sprache in der dein Code ausgeführt werden soll:',
['2'] = 'Ein Fehler ist aufgetreten! Die Verbindung ist unterbrochen. Hast du versucht mich langsamer zu machen?',
['3'] = 'Du hast ausgewählt: "%s" – bist du sicher?',
['4'] = 'Zurück',
['5'] = 'Ich bin sicher',
['6'] = 'Bitte gebe den Schnipsel Code ein, welchen du durchführen willst. Du must keine Sprache wählen, wir machen das später!',
['7'] = 'Bitte wähle die Sprache in der dein Code ausgeführt werden soll:'
},
['facebook'] = {
['1'] = 'Ein Fehler ist aufgetreten!',
['2'] = 'Bitte gebe den Namen von dem Facebook Benutzer ein, von welchem du ein Profilbild bekommen willst.',
['3'] = 'Schaue @%s in Facebook an'
},
['fact'] = {
['1'] = 'Generiere nochmal'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Du hast gesucht für:',
['2'] = 'Bitte gebe einen Suchbegriff ein (das ist, was ich in flickr für dich suchen soll, d.h. "Big Ben" will ein Bild vom Big Ben in London senden).',
['3'] = 'Mehr Ergebnisse.'
},
['game'] = {
['1'] = 'Total gewonnen: %s\nTotal verloren: %s\nGuthaben: %s mattacoins',
['2'] = 'Dem Spiel beitreten',
['3'] = 'Dieses Spiel hat schon geendet!',
['4'] = 'Du bist nicht an der reihe!',
['5'] = 'Du bist kein Mitspieler von diesem Spiel!',
['6'] = 'Du kannst da nicht hingehen!',
['7'] = 'Du bist schon ein Mitspieler von diesem Spiel!',
['8'] = 'Dieses Spiel hat schon angefangen!',
['9'] = '%s [%s] spielt gegen %s [%s]\nEs ist %s an der reihe!',
['10'] = '%s hat das Spiel gewonnen gegen %s!',
['11'] = '%s hat das spiel gezogen gegen %s!',
['12'] = 'Warte für einen Gegenspieler...',
['13'] = 'Tic-Tac-Toe',
['14'] = 'Klick zum senden des Spiels in die Unterhaltung!',
['15'] = 'Statistik für %s:\n',
['16'] = 'Spiel Tic-Tac-Toe!'
},
['gblocklist'] = {
['1'] = 'Bitte Antworte-zu dem Benutzer, welchen du global auf der schwarzen Liste haben möchtest, oder gebe ihn/sie mit Benutzername/Identifikationsnummer an.',
['2'] = 'Ich kann keine Information über "%s" finden, bitte prüfe nach ob der Benutzername/Identifikationsnummer gültig ist und versuche es noch einmal.',
['3'] = 'Das ist ein/e %s, aber kein Benutzer!'
},
['gif'] = {
['1'] = 'Bitte gebe einen Suchbegriff ein (das ist, was ich in GIPHY für dich suchen soll, d.h. "Katze" will ein GIF von einer Katze senden).'
},
['gallowlist'] = {
['1'] = 'Bitte Antworte-zu dem Benutzer, welchen du global auf der weißen Liste haben möchtest, oder gebe ihn/sie mit Benutzername/Identifikationsnummer an.',
['2'] = 'Ich kann keine Information über "%s" finden, bitte prüfe nach ob der Benutzername/Identifikationsnummer gültig ist und versuche es noch einmal.',
['3'] = 'Das ist ein/e %s, aber kein Benutzer!'
},
['hackernews'] = {
['1'] = 'Top Stories von Hacker News:'
},
['help'] = {
['1'] = 'Kein Ergebnis gefunden!',
['2'] = 'Keine Eigenschaften gefunden, welche übereinstimmen mit "%s". Bitte versuche ein bischen spezifischer zu sein!',
['3'] = '\n\nArguments: <erforderlich> [optional]\n\nSuche für Eigenschaften oder bekomme Hilfe mit der Benutzung von einem Befehl meiner inline Search Funktionalität - erwähne mich in irgendeiner Unterhaltung mit dem Syntax @%s <Suchbegriff>.',
['4'] = 'Vorherige',
['5'] = 'Nächste',
['6'] = 'Zurück',
['7'] = 'Suche',
['8'] = 'Du bist auf Seite %s von %s!',
['9'] = [[
Ich kann viele administrative Handlungen in deinen Gruppen machen. Du brauchst mich nur als Administrator hinzufügen und sende /administration zum anpassen der Einstellungen für deine Gruppe.
Hier sind einige administrative Befehle und ein kurzer Kommentar bezüglich was sie tun:
• /pin <text> - Sende einen formatierten Text, welcher auch bearbeitet werden kann mit dem selben Befehl und anderem Text, zum ersparen vom anheften eines textes den du nicht bearbeiten kannst to save you from having to re-pin a message if you can't edit it (was passieren kann, wenn der Text älter als 48 Stunden ist).
• /ban - Sperre einen Benutzer mit einer Antwort zu deren Text, oder mit spezifizieren mit deren Benutzername/Identifikationsnummer.
• /kick - Kick (sperren und dann sperre aufheben) einen Benutzer mit einer Antwort zu deren Text, oder mit spezifizieren mit deren Benutzername/Identifikationsnummer.
• /unban - Die Sperre eines Benutzer aufheben mit einer Antwort zu deren Text, oder mit spezifizieren mit deren Benutzername/Identifikationsnummer.
• /setrules <text> - Mache einen formatierten Text als Gruppenregel, welcher gesendet wird, wenn jemand /rules benutzt.
]],
['10'] = [[
• /setwelcome - Mache einen formatierten Text als Wilkommens Text, welcher jedesmal gesendet wird, wenn ein neuer Benutzer der Gruppe beitritt (der Willkommens Text kann ausgeschalted werden im Administration Menü, erreichbar durch /administration). Du kannst Platzhalter benutzen für einen individuellen Willkommens Text für jeden Benutzer. Benutze $user_id zum einfügen des Benutzers Identifikationsnummer, $chat_id zum einfügen der Gruppen Identifikationsnummer, $name zum einfügen des Benutzers name, $title zum einfügen des Gruppennamen und $username zum einfügen des Benutzers Benutzername (wenn der Benutzer keinen @Benutzernamen hat, wird deren Name benutzt, also ist es das beste, dieses zu vermeiden mit der Benutzung von $name).
• /warn - Warne einen Benutzer und sperre ihn/sie, wenn mehr als das Maximum der Warnungen ausgesprochen wurden.
• /mod - Befördere den Antworten-zu Benutzer. Gib im zugriff zu administrative Befehle wie /ban, /kick, /warn usw. (das ist sinnvoll wenn du nicht möchtest, dass jemand Nachrichten löschen kann)
• /demod - Degradiere den Antworten-zu Benutzer. Nehme deren Moderationstatus weg und die Möglichkeit zum benutzen administrativen Befehlen.
• /staff - Sehe den Gruppenerschaffer, Administratoren und Moderatoren in einer schön formatierten Liste.
]],
['11'] = [[
• /report - Sendet den Antworten-zu Text zu allen Administratoren und warnt sie vor der aktuellen Situation.
• /setlink <URL> - Ändert den Gruppen Link zu der gegebenen URL, welcher gesendet wird wenn jemand /link benutzt.
• /links <text> - Weiße Liste von allen gefundenen Telegram Links im angegebenen Text (einschließlich @Benutzername links)
]],
['12'] = 'Nachfolgend sind einige Links die du vielleicht nützlich findest:',
['13'] = 'Development',
['14'] = 'Channel',
['15'] = 'Support',
['16'] = 'FAQ',
['17'] = 'Source',
['18'] = 'Donate',
['19'] = 'Rate',
['20'] = 'Administration Log',
['21'] = 'Admin Settings',
['22'] = 'Plugins',
['23'] = [[
<b>Hallo %s! Mein Name ist %s, schön dich zu treffen.</b> %s
Ich verstehe viele Befehle, welche du lernen kannst wenn du den "Commands" Knopf drückst in der angehängten Tastatur.
%s <b>Tip:</b> Benutze den "Settings" Knopf zum verändern wie ich arbeite%s!
%s <b>Wenn du mich für sinnvoll hälst, oder vielleicht nur helfen willst?</b> Spenden sind willkommen, benutze /donate für mehr Information!
]],
['24'] = 'in'
},
['id'] = {
['1'] = 'Ich kann den Benutzer nicht erkennen. Wenn du mich lehren möchtest wer dieser Benutzer ist, dann leite einfach eine Nachricht von diesem Benutzer in eine Gruppe in der ich auch bin .',
['2'] = 'Abgefragte Unterhaltung:',
['3'] = 'Diese Unterhaltung:',
['4'] = 'Klick zum senden des Ergebnis!'
},
['imdb'] = {
['1'] = 'Vorherige',
['2'] = 'Nächste',
['3'] = 'Du bist auf Seite %s von %s!'
},
['import'] = {
['1'] = 'Ich kann die Unterhaltung nicht erkennen!',
['2'] = 'Dies ist keine Supergruppe, des wegen kann ich keine Einstellungen von da importieren!',
['3'] = 'Administrative Einstellungen erfolgreich importiert und ich habe die Plugins umgeschaltet von %s zu %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s Konfigurationsdatei: %s
%s Modus: %s
%s TCP Port: %s
%s Version: %s
%s Betriebszeit: %s Tage
%s Verarbeitete Identifikationsnummern: %s
%s Abgelaufene Schlüssel: %s
%s Benutzeranzahl: %s
%s Gruppenanzahl: %s
System:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s in Instagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 sum: %s\nSHA1 sum: %s\nFile size: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'Diese Firmware ist nicht mehr signiert!',
['3'] = 'Diese Firmware ist noch signiert!',
['4'] = 'Bitte wähle dein Model:',
['5'] = 'Bitte wähle deine Firmware Version:',
['6'] = 'Bitte wähle deinen Geräte Typ:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'Dieses Konto wurde in folgenden undichten Stellen gefunden:'
},
['itunes'] = {
['1'] = 'Name:',
['2'] = 'Artist:',
['3'] = 'Album:',
['4'] = 'Track:',
['5'] = 'Disc:',
['6'] = 'Die orginale Frage kann nicht gefunden werden. Du hast wahrscheinlich den orginalen Text gelöscht.',
['7'] = 'Das Kunstwerk kann weiter unten gefunden werden:',
['8'] = 'Bitte gebe einen Suchbegriff ein (das ist, was ich in iTunes für dich suchen soll, d.h. "Green Day American Idiot" gibt dir das erste Ergebnis von American Idiot von Green Day).',
['9'] = 'Bekomme Album Kunstwerke'
},
['kick'] = {
['1'] = 'Welchen Benutzer soll ich raus werfen? Du kannst ihn/sie mit dem @Benutzernamen oder mit der Identifikationsnummer angeben.',
['2'] = 'Ich kann den Benutzer nicht raus werfen, weil er/sie Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann den Benutzer nicht raus werfen, weil er/sie hat die Gruppe schon verlassen hat.',
['4'] = 'Ich kann den Benutzer nicht raus werfen, weil er/sie schon von der Gruppe entfernt wurde.',
['5'] = 'Ich brauche administrative Berechtigung zum raus werfen des Benutzers. Bitte behebe das Problem und versuche es noch einmal.'
},
['lastfm'] = {
['1'] = '%s\'s last.fm Benutzername wurde zu "%s" gesendet.',
['2'] = 'Dein last.fm Benutzername wurde vergessen!',
['3'] = 'Im Moment hast du keinen last.fm Benutzernamen!',
['4'] = 'Bitte gebe deinen letzten last.fm Benutzernamen an oder richte ihn mit /fmset ein.',
['5'] = 'Keine Vergangenheit für diesen Benutzer gefunden.',
['6'] = '%s hört im Moment:\n',
['7'] = '%s hörte zuletzt:\n',
['8'] = 'Unbekannt',
['9'] = 'Klick zum senden des Ergebnis.'
},
['location'] = {
['1'] = 'Du hast keinen Standort angegeben. Welchen Standort möchtest du haben?'
},
['logchat'] = {
['1'] = 'Bitte gebe den Benutzernamen oder die Identifikationsnummer der Unterhaltung an, in welche du alle administrativen Handlungen senden möchtest.',
['2'] = 'Überprüfe ob die Unterhaltungen gültig ist...',
['3'] = 'Tut mir leid aber es sieht so aus, also ob du eine ungültige Unterhaltung, oder eine Unterhaltung in der ich nicht drin bin, angegeben hast. Bitte behebe das Problem und versuche es noch einmal.',
['4'] = 'Du kannst keinen Benutzer als logchat angeben!',
['5'] = 'Es sieht so aus, also ob du kein Administrator der Unterhaltung bistt!',
['6'] = 'Es sieht so aus, als ob ich schon administrative Handlungsrechte in dieser Gruppe besitze. Wenn du mir administrative Handlungsrechte in einer anderen Gruppe geben willst benutze /logchat.',
['7'] = 'Diese Unterhaltung ist gültig. Ich werde nun einen Testtext zu der Unterhaltung schicken, um zu sehen ob ich die Genehmigung zum schreiben habe!',
['8'] = 'Hallo, Welt - dies ist ein Testext zum herausfinden ob ich die Gehnemigung zum schreiben habe - wenn du das liest, dann ist alles OK!',
['9'] = 'Alles fertig! Von nun an alle administrativen Handlungen werden auch zu %s gesendet - zum ändern der Unterhaltung, in die du administrative Handlungen senden möchtest, sende /logchat.'
},
['lua'] = {
['1'] = 'bitte gebe eine Reihe von Lua ein zum ausführen!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Zeige Liedtext',
['3'] = 'Bitte gebe einen Suchbegriff ein (das ist, zu welchem Lied/Sänger/Gruppe ich den Liedtext suchen soll, d.h. "Green Day Basket Case" gibt dir den Liedtext zu dem Lied song Basket Case von Green Day).'
},
['minecraft'] = {
['1'] = '<b>%s hat den Benutzernamen %s mal gewechselt</b>',
['2'] = '<b>%s hat den Benutzernamen %s mal gewechselt</b>',
['3'] = 'Vorherige',
['4'] = 'Nächste',
['5'] = 'Zurück',
['6'] = 'UUID',
['7'] = 'BenutzerBild',
['8'] = 'Benutzername Vergangenheit',
['9'] = 'Bitte wähle eine Option:',
['10'] = 'Bitte gebe den Benutzernamen des Minecraft Spielers an, für welchen du Informationen sehen möchtest (d.h. wen du "Notch" sendest kannst du die Informationen von dem Spieler Notch einsehen).',
['11'] = 'Minecraft Benutzernamen sind zwischen 3 und 16 Zeichen lang.'
},
['mute'] = {
['1'] = 'Welchen Benutzer soll ich stumm schalten? Du kannst den Benutzer mit dem @Benutzername oder mit der Indetifikationsnummer angeben.',
['2'] = 'Ich kann den Benutzer nich stumm schalten, weil der Benutzer in dieser Unterhaltung schon stumm geschaltet ist.',
['3'] = 'Ich kann den Benutzer nich stumm schalten, weil der Benutzer in dieser Unterhaltung Moderator oder Administrator ist.',
['4'] = 'Ich kann den Benutzer nich stumm schalten, weil der Benutzer diese Unterhaltung schon verlassen hat oder rausgeworfen wurde.',
['5'] = 'Zum stumm schalten des Benutzers muss ich Administrationsrechte haben. Bitte ändere meine Rechte und versuche es noch einmal.'
},
['myspotify'] = {
['1'] = 'Profil',
['2'] = 'Folgende',
['3'] = 'Vor kurzem gespielt',
['4'] = 'Derzeit spielen',
['5'] = 'Top Lieder',
['6'] = 'Top Künstler',
['7'] = 'Es sieht nicht so aus, als würdest du einem Künstler folgen!',
['8'] = 'Dein Top Künstler',
['9'] = 'Es sieht so aus, als würdest du keine Lieder in deiner Sammlung haben!',
['10'] = 'Deine Top Lieder',
['11'] = 'Es sieht nicht so aus, als würdest du einem Künstler folgen!',
['12'] = 'Künstler denen du folgst',
['13'] = 'Es sieht nicht so aus als hättest du vor kurzem irgendwelche lieder gespielt!',
['14'] = '<b>Vor kurzem gespielt</b>\n%s %s\n%s %s\n%s Gehört um %s:%s am %s/%s/%s.',
['15'] = 'Deine Anfrage wurde akzeptiert aber die Bearbeitung wurde noch nicht beendet.',
['16'] = 'Es sieht nicht so aus als würdest du dir im moment etwas anhören!',
['17'] = 'Derzeit spielen',
['18'] = 'Beim erneuten Autorisieren deines Spotify Accounts ist ein Fehler aufgetreten!',
['19'] = 'Dein Spotify Account wurde erneut erfolgreich Autorisiert! Deine orginal Anfrage wird bearbeitet...',
['20'] = 'Erneutes Autorisieren deines Spotify Accounts, bitte warten...',
['21'] = 'Zum verbinden deines Spotify Accounts musst du mattata autorisieren. Klick [hier](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) and press the green "OKAY" button to link mattata to your Spotify account. After you\'ve done that, send the link you were redirected to (it should begin with "%s", followed by a unique code) in reply to this message.',
['22'] = 'Wiedergabeliste',
['23'] = 'Benutze Inline Mode',
['24'] = 'Lyrics',
['25'] = 'Keine Geräte gefunden.',
['26'] = 'Es sieht so aus, als wenn du keine Wiedergabeliste hast.',
['27'] = 'Deine Wiedergabeliste',
['28'] = '%s %s [%s Lieder]',
['29'] = '%s %s [%s]\nSpotify %s Benutzer\n\n<b>Gerät:</b>\n%s',
['30'] = 'Spiele vorheriges Lied...',
['31'] = 'Du bist kein Premium Benutzer!',
['32'] = 'Ich kann keine Geräte finden.',
['33'] = 'Spiele nächstes Lied...',
['34'] = 'Lied wird fortgesetzt...',
['35'] = 'Dein Gerät ist im moment nicht erreichbar...',
['36'] = 'Keine Geräte gefunden!',
['37'] = 'Pause Lied...',
['38'] = 'Jetzt spielen',
['39'] = 'Mixe deine Musik...',
['40'] = 'Das ist keine gültig Lautstärke. Gebe bitte eine Nummer zwischen 0 und 100 an.',
['41'] = 'Die Lautstärke wurde auf %s%% eingestellt!',
['42'] = 'Dies Nachricht benutzt ein altes Plugin, zum anfragen eines neues bitte sende /myspotify!'
},
['name'] = {
['1'] = 'Der Name auf den ich im moment antworte ist "%s" - zum ändern, benutze /name <text> ( <text> ist der Name auf den du willst, dass ich andworte).',
['2'] = 'Mein neuer Name muss zwischen 2 und 32 Buchstaben lang sein!',
['3'] = 'Mein Name kann nur aus Buchstaben bestehen!',
['4'] = 'Ich antworten nun auf "%s", und nicht mehr auf "%s" - zum ändern, benutze /name <text> ( <text> ist der Name auf den du willst, dass ich andworte).'
},
['netflix'] = {
['1'] = 'Mehr lesen.'
},
['news'] = {
['1'] = '"<code>%s</code>" ist kein gültiges Lua Muster.',
['2'] = 'Ich konnte keine Quellenliste bekommen.',
['3'] = '<b>Nachrichtenquelle gefunden zu</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Hier sind die aktuellen verfügbaren Nachrichtenquellen, welche du mit</b> /news<b> benutzen kannst. Benutze</b> /nsources &lt;query&gt; <b>zum durchsuchen der Liste von Nachrichtenquellen für ein besseres Ergebnis. Die suche wird abgestimmt mit den Lua Mustern</b>\n\n%s',
['5'] = 'Du hast keine bevorzugte Nachrichtenquelle. Benutze /setnews <Quelle>. Zum ansehen einer Quellenliste benutze /nsources, oder beschränke das Ergebnis mit /nsources <Abfrage>.',
['6'] = 'Deine derzeit bevorzugte Nachrichtenquelle ist %s. Zum ändern benutze /setnews <Quelle>.Zum ansehen einer Quellenliste benutze /nsources, oder beschränke das Ergebnis mit /nsources <Abfrage>.',
['7'] = 'Deine derzeit bevorzugte Nachrichtenquelle ist %s! Zum ansehen der derzeiting Top Story benutze /news.',
['8'] = 'Dies ist keine gültige Nachrichtenquelle. Zum ansehen einer Quellenliste benutze /nsources, oder beschränke das Ergebnis mit /nsources <Abfrage>.',
['9'] = 'Deine bevorzugte Nachrichtenquelle wurde zu %s aktualisiert! Zum ansehen der derzeiting Top Story benutze /news.',
['10'] = 'Dies ist keine gültige Nachrichtenquelle. Zum ansehen einer Quellenliste benutze /nsources. Wenn du eine bevorzugte Nachrichtenquelle hast benutze /setnews <Quelle> und do bekommst automatisch von dieser Quelle Nachrichten geschickt wenn du /news sendest.',
['11'] = 'Mehr lesen.'
},
['nick'] = {
['1'] = 'Dein Spitzname is vergessen!',
['2'] = 'Dein Spitzname wurde geändert zu "%s"!'
},
['optout'] = {
['1'] = 'Du bist opted-in(beigetreten), dass die Daten, welche du sendest, gesammelt werden! Benutze /optout zum opt-out(austreten).',
['2'] = 'Du bist opted-out(ausgetreten), dass die Daten, welche du sendest, gesammelt werden! Benutze /optin zum opt-in(beitreten).'
},
['paste'] = {
['1'] = 'Bitte suche einen Service aus zum hochladen und einfügen deines Textes:'
},
['pay'] = {
['1'] = 'Du hast im Moment %s mattacoins. Verdiene mehr wenn du das Spiel Tic-Tac-Toe gewinnst. Benutze /game - Du gewinnst 100 mattacoins für jedes gewonnene Spiel und du verlierst 50 für jedes verlorene Spiel.',
['2'] = 'Du musst diesen Befehl benutzen als Antwort zu dem Benutzer dem du mattacoins senden willst.',
['3'] = 'Bitte gebe die Menge der mattacoins an, welche du zu %s senden möchtest.',
['4'] = 'Die Menge sollte in einer Zahl angegeben sein, welche nicht kleiner als 0 sein kann.',
['5'] = 'Du kannst kein Geld zu dir selbst schicken!',
['6'] = 'Du hast nicht genug Guthaben zum durchführen der Transaktion!',
['7'] = '%s mattacoins wurden gesendet zu %s. Dein neues Guthaben ist %s mattacoins.'
},
['pin'] = {
['1'] = 'Du hast noch keinen pin gesetzt. Benutze /pin <dein Text> um deinen Text zu pinnen. Markdown formatierung ist verfügbar.',
['2'] = 'Hier ist die letzte nachricht die mit /pin generiert wurde',
['3'] = 'Ich habe einen bereits existierenden pin in meiner Datenbank gefunden, aber die nachricht, die ich bereits gesendet habe, aber sie wurde gelöscht, und ich finde sie nicht mehr. Benutze /pin <dein Text> um deinen Text zu pinnen. Markdown formatierung ist verfügbar.',
['4'] = 'Es ist ein fehler bei der aktualisierung deines pins aufgetreten. Vielleicht hat dein Text eine ungültige Markdown formatierung, oder sie wurde gelöscht. Ich versuche dir einen neuen pin zu senden, welchen du unten findest - falls du es ändern möchtest, wenn die nachricht noch existiert, benutze /pin <dein text>.',
['5'] = 'Ich kann den text nicht senden weil er eine ungültige Markdown formatierung hat.',
['6'] = 'Klick hier um den pin zu sehen, aktualisiert mit dem Text den du mir gegeben hast.'
},
['pokedex'] = {
['1'] = 'Name: %s\nID: %s\nArt: %s\nBeschreibung: %s'
},
['prime'] = {
['1'] = 'Bitte gebe eine Zahl zwischen 1 und 99999 ein.',
['2'] = '%s ist eine Primzahl!',
['3'] = '%s ist KEINE Primzahl...'
},
['promote'] = {
['1'] = 'Ich kann diesen Benutzer nicht beförderen, weil er/sie Moderator oder Administrator in dieser Gruppe ist.',
['2'] = 'Ich kann diesen Benutzer nicht beförderen, weil er/sie hat die Gruppe schon verlassen hat.',
['3'] = 'Ich kann diesen Benutzer nicht beförderen, weil er/sie schon von der Gruppe entfernt wurde.'
},
['quote'] = {
['1'] = 'Dieser Benutzer ist opted out(ausgetreten) von der Datensammlung funktionalität.',
['2'] = 'Da sind keine Zitate von %s%s! Du kannst Zitate speichern wenn du /save als Antwort zu dem gesendeten text(welchen du als Zitat speichern willst).'
},
['randomsite'] = {
['1'] = 'Generiere nochmal'
},
['randomword'] = {
['1'] = 'Generiere nochmal',
['2'] = 'Dein zufälliges Wort ist <b>%s</b>!'
},
['report'] = {
['1'] = 'Bitte Antworte zu der Nachricht die du einem GruppenAdminsitrator melden möchtest.',
['2'] = 'Du kannst deine eigenen Nachrichten nicht melden, machst du vielleicht Witze?',
['3'] = '<b>%s braucht Hilfe in %s!</b>',
['4'] = 'Klicke hier zum ansehen der gemeldeten Nachricht.',
['5'] = 'Ich habe die Nachricht erfolgreich gemeldet zu %s admin(s)!'
},
['rms'] = {
['1'] = 'Heiliges GNU!'
},
['save'] = {
['1'] = 'Dieser Benutzer ist opted out(ausgetreten) von der Datensammlung funktionalität.',
['2'] = 'Dieser Text ist gespeichert in meiner Datei und wird zu der List möglicher Antworten hinzugefügt, wenn /quote benutzt wird als Antwort zu %s%s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s wollte das nicht sagen!</i>',
['2'] = '%s\n\n<i>%s hat zugegeben verloren zu haben.</i>',
['3'] = '%s\n\n<i>%s ist sich nicht sicher obe er/sie missverstanden ist...</i>',
['4'] = 'Ach halt die Klappe, <i>wann habe ich jemals nicht recht?</i>',
['5'] = '"<code>%s</code>" ist kein gültiges Lua Muster.',
['6'] = '<b>Hallo, %s, meintest du:</b>\n<i>%s</i>',
['7'] = 'Ja',
['8'] = 'Nein',
['9'] = 'Bin nicht sicher'
},
['setgrouplang'] = {
['1'] = 'Die Sprache in dieser Gruppe wurde eingstellet zu %s!',
['2'] = 'Die Sprache in dieser Gruppe ist im moment %s.\nBitte nehme zur Kenntnis, dass vielleicht noch nicht alles vollständig Übersetzt ist. Wenn du die Sprache ändern möchtest, wähle unten auf der Tastatur eine aus:',
['3'] = 'Die Möglichkeit, dass alle Benutzer in dieser Gruppe die selbe Sprache benutzent müssen, ist im moment ausgeschaltet. Diese Einstellung sollte von /administration eingestellet werden, damit es einfacher ist für dich, habe ich unten Knöpfe zum einstellen hinzugefügt.',
['4'] = 'Einschalten',
['5'] = 'Ausschalten'
},
['setlang'] = {
['1'] = 'Deine Sprache wurde eingestellt zu %s!',
['2'] = 'Deine Sprache ist im Moment eingestellt zu %s.\nBitte beachte, dass manche Wörter oder Sätze noch nicht übersetzet sind. Wenn du deine Sprache ändern möchtest, suche dir eine aus in der Tastatur unten:'
},
['setlink'] = {
['1'] = 'Das ist keine gültige URL.',
['2'] = 'Link erfolgreich gesetzt!'
},
['setrules'] = {
['1'] = 'Ungültige Markdown-Formatierung.',
['2'] = 'Neue Regeln erfolgreich eingestellt!'
},
['setwelcome'] = {
['1'] = 'Was möchtest als Willkommens Text haben? Den angegebenen Text wird formatiert und jedesmal gesendet, wenn ein Benutzer der Gruppe beitritt (Der Willkommens Text kann ausgeschaltet werden im Administrations Menue, erreichbar mit /administration). Du kannst Platzhalter benutzen für einen individuellen Willkommens Text für jeden Benutzer. Benutze $user_id zum einfügen des Benutzers Identifikationsnummer, $chat_id zum einfügen der Gruppen Identifikationsnummer, $name zum einfügen des Benutzers name, $title zum einfügen des Gruppennamen und $username zum einfügen des Benutzers Benutzername (wenn der Benutzer keinen @Benutzernamen hat, wird deren Name benutzt, also ist es das beste, dieses zu vermeiden mit der Benutzung von $name).',
['2'] = 'Da ist ein Fehler mit dem Format deines Textes aufgetreten. Bitte Überprüfe die Syntax und versuche es noch einmal.',
['3'] = 'Der Willkommens Text für %s wurde erfolgreich aktualisiert!'
},
['share'] = {
['1'] = 'Teilen'
},
['shorten'] = {
['1'] = 'Bitte wähle einen URL Verkürzer aus mit den Buttons unten:'
},
['shsh'] = {
['1'] = 'Für den ECID konnte ich keine SHSH blobs holen. Bitte mache sicher, dass sie gültig sind und das to sie gespeichert hast auf https://tsssaver.1conan.com.',
['2'] = 'SHSH blobs sind verfügbar für das Gerät mit der folgenden Version von iOS:\n',
['3'] = 'Download .zip'
},
['statistics'] = {
['1'] = 'Es wurden keine Nachrichten in dieser Unterhaltung gesendet!',
['2'] = '<b>Statistiken für:</b> %s\n\n%s\n<b>Summe der gesendeten Nachrichten:</b> %s',
['3'] = 'Die Statistiken für diese Unterhaltung wurde gelöscht!',
['4'] = 'Ich konnte die Statistiken für dies Unterhaltung nicht löschen. Vielleicht wurde sie schon gelöscht?'
},
['steam'] = {
['1'] = 'Dein Steam Benutzername wurde gespeichert mit "%s".',
['2'] = '"%s" ist kein gültiger Steam Benutzername.',
['3'] = '%s ist ein Steam Benutzer seit %s, in %s. Er/Sie hat sich das letzte mal ausgelogt am %s, in %s. Klick <a href="%s">here</a> zum ansehen von deren Steam Profil.',
['4'] = '%s, alias "%s",'
},
['synonym'] = {
['1'] = 'Du könntest das Wort <b>%s</b> benutzen, wäre besser als %s.'
},
['thoughts'] = {
['1'] = '%s\n\nPositive: <code>%s%% [%s]</code>\nNegative: <code>%s%% [%s]</code>\nGleichgültige: <code>%s%% [%s]</code>\nSumme Gedanken: <code>%s</code>'
},
['tobinary'] = {
['1'] = 'Bitte gebe ein Wort oder Satz ein, welchen du umwandeln willst zu Binary.'
},
['trust'] = {
['1'] = 'Ich kann den Benutzer nicht zu trust(vertrauen) einstellen, weil er Moderator oder Administrator in dieser Gruppe ist.',
['2'] = 'Ich kann den Benutzer nicht zu trust(vertrauen) einstellen, weil er die Gruppe schon verlassen hat.',
['3'] = 'Ich kann den Benutzer nicht zu trust(vertrauen) einstellen, weil er von dieser Gruppe entfernt wurde.'
},
['unmute'] = {
['1'] = 'Welchen Benutzer soll ich zu Stören einstellen? Gebe den Benutzer mit dem @Benutzername oder der Identifikationsnummer an.',
['2'] = 'Ich kann den Benutzer nicht zu Stören einstellen, weil er im moment nicht stumm geschalted ist..',
['3'] = 'Ich kann den Benutzer nicht zu Stören einstellen, weil er Moderator oder Administrator dieser Gruppe ist.',
['4'] = 'Ich kann den Benutzer nicht zu Stören einstellen, weil er die Gruppe schon verlassen hat oder von der Gruppe entfernt wurde.'
},
['untrust'] = {
['1'] = 'Welchen Benutzer soll ich zu untrust(nicht vertrauen) einstellen? Gebe den Benutzer mit dem @Benutzername oder der Identifikationsnummer an.',
['2'] = 'Ich kann den Benutzer nicht zu untrust(nicht vertrauen) einstellen, weil er Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann den Benutzer nicht zu untrust(nicht vertrauen) einstellen, weil er die Gruppe schon verlassen hat.',
['4'] = 'Ich kann den Benutzer nicht zu untrust(nicht vertrauen) einstellen, weil er von dieser Gruppe entfernt wurde.'
},
['upload'] = {
['1'] = 'Bitte antworte zu der Datei, welche du hochlanden willst zum Server. Sie muss <= 20 MB sein.',
['2'] = 'Die Datei ist zu groß. Sie muss <= 20 MB sein.',
['3'] = 'Ich konnte die Datei nicht bekommen, wahrscheinlich ist sie zu alt.',
['4'] = 'Es ist ein Fehler aufgetreten beim abrufen der Datei.',
['5'] = 'Die Datei wurde erfolgreich hochgelanden zum Server - sie kan gefunden werden mit <code>%s</code>!'
},
['version'] = {
['1'] = '@%s alias %s `[%s]` läuft mit mattata %s, kreiert von [Matthew Hesketh](https://t.me/wrxck). Der Quellcode ist auf [GitHub](https://github.com/wrxck/mattata) zu bekommen.'
},
['voteban'] = {
['1'] = 'Für welchen Benutzer möchtest einen vote-ban(Wahl zur Sperre) eröffnen? Gebe den Benutzer mit dem @Benutzername oder der Identifikationsnummer an.',
['2'] = 'Ich kann keinen vote-ban(Wahl zur Sperre) für diesen Benutzer aufsetzen, weil er Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann keinen vote-ban(Wahl zur Sperre) für diesen Benutzer aufsetzen, weil er die Gruppe schon verlassen hat oder von der Gruppe entfernt wurde.',
['4'] = 'Soll %s [%s] gesperrt werden von %s? %s dafür(Yes) werden gebraucht für eine sofortige Sperre und %s dagegen(No) werden gebraucht zum sofortigen schliessen der Wahl.',
['5'] = 'Ja [%s]',
['6'] = 'Nein [%s]',
['7'] = 'Die Leute haben gesprochen. Ich have %s [%s] von %s gesperrt, weil %s Leute dafür gewählt haben.',
['8'] = 'Der erfordliche Anzahl dafür wurde erreicht, aber es war mir nicht möglich %s zu sperren - vielleicht hat er/sie die Gruppe schon verlassen oder wurde befördert seit die Wahl eröffnet wurde? Es ist entweder das, oder ich habe keine Administrationsrechte mehr.',
['9'] = 'Die Leute haben gesprochen. Ich habe %s [%s] nicht von %s gesperrt, weil %s Leute dagegen gewählt haben.',
['10'] = 'Du hast dafür gewählt %s [%s] zu sperren!',
['11'] = 'Deine Wahl wurde zurückgezogen,zum eingeben einer neuen Wahl benutze die Knöpfe nocheinmal.',
['12'] = 'Du hast dagegen gewählt %s [%s] zu sperren!',
['13'] = 'Eine Wahl zum bannen des Benutzers wurde schon eröffnet!'
},
['weather'] = {
['1'] = 'Du hast keinen Standort ausgewählt. Zum auswählen benutze /setloc <Standort>.',
['2'] = 'Im Moment ist es %s (fühlt sich an wie %s) in %s. %s'
},
['welcome'] = {
['1'] = 'Group Rules'
},
['allowlist'] = {
['1'] = 'Welchen Benutzer soll ich auf die Weiße Liste setzen? Gebe den Benutzer mit dem @Benutzername oder der Identifikationsnummer an.',
['2'] = 'Ich kann den Benutzer nicht auf die Weiße Liste setzen, weil er Moderator oder Administrator in dieser Gruppe ist.',
['3'] = 'Ich kann den Benutzer nicht auf die Weiße Liste setzen, weil er die Gruppe schon verlassen hat.',
['4'] = 'Ich kann den Benutzer nicht auf die Weiße Liste setzen, weil er von der Gruppe entfernt wurde.'
},
['wikipedia'] = {
['1'] = 'Mehr lesen.'
},
['youtube'] = {
['1'] = 'Vorherige',
['2'] = 'Nächste',
['3'] = 'Du bist auf Seite %s von %s!'
}
-}
+}
\ No newline at end of file
diff --git a/languages/en_us.lua b/languages/en_us.lua
index 351d724..97a85f9 100644
--- a/languages/en_us.lua
+++ b/languages/en_us.lua
@@ -1,813 +1,813 @@
-- This is a language file for mattata
-- Language: en-us
-- Author: wrxck
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Connection error.',
['results'] = 'I couldn\'t find any results for that.',
['supergroup'] = 'This command can only be used in supergroups.',
['admin'] = 'You need to be a moderator or an administrator in this chat in order to use this command.',
['unknown'] = 'I don\'t recognize that user. If you would like to teach me who they are, forward a message from them to any chat that I\'m in.',
['generic'] = 'An error occured!',
['use'] = 'You are not allowed to use this!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Sorry, I\'m afraid this feature is only available to users with a public @username!',
['2'] = '%s has returned after being AFK for %s!',
['3'] = 'Note',
['4'] = '%s is now AFK.%s'
},
['antispam'] = {
['1'] = 'Disable',
['2'] = 'Enable',
['3'] = 'Disable limit',
['4'] = 'Enable limits on %s',
['5'] = 'All Administration Settings',
['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
['8'] = 'The maximum limit is 100.',
['9'] = 'The minimum limit is 1.',
['10'] = 'Modify the anti-spam settings for %s below:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'View on iTunes',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'I couldn\'t retrieve the profile photos for that user, please ensure you specified a valid username or numerical ID.',
['2'] = 'That user doesn\'t have any profile photos.',
['3'] = 'That user doesn\'t have that many profile photos!',
['4'] = 'That user has opted-out of data-collecting functionality, therefore I am not able to show you any of their profile photos.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Which user would you like me to ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot ban this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot ban this user because they have already left this chat.',
['4'] = 'I cannot ban this user because they have already been banned from this chat.',
['5'] = 'I need to have administrative permissions in order to ban this user. Please amend this issue, and try again.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Please specify a command to run!',
['2'] = 'Success!'
},
['blocklist'] = {
['1'] = 'Which user would you like me to blocklist? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot blocklist this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot blocklist this user because they have already left this chat.',
['4'] = 'I cannot blocklist this user because they have already been banned from this chat.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s has now been blocklisted, and I will leave whenever I am added there!',
['2'] = '%s is a user, this command is only for blocklisting chats such as groups and channels!',
['3'] = '%s doesn\'t appear to be a valid chat!'
},
['bugreport'] = {
['1'] = 'Success! Your bug report has been sent. The ID of this report is #%s.',
['2'] = 'There was a problem whilst reporting that bug! Ha, the irony!'
},
['calc'] = {
['1'] = 'Click to send the result.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'I really cannot describe that picture!'
},
['cats'] = {
['1'] = 'Meow!'
},
['channel'] = {
['1'] = 'You are not allowed to use this!',
['2'] = 'You don\'t appear to be an administrator in that chat anymore!',
['3'] = 'I couldn\'t send your message, are you sure I still have permission to send messages in that chat?',
['4'] = 'Your message has been sent!',
['5'] = 'I was unable to retrieve a list of administrators for that chat!',
['6'] = 'You don\'t appear to be an administrator in that chat!',
['7'] = 'Please specify the message to send, using the syntax /channel <channel> <message>.',
['8'] = 'Are you sure you want to send this message? This is how it will look:',
['9'] = 'Yes, I\'m sure!',
['10'] = 'That message contains invalid Markdown formatting! Please correct your syntax and try again.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'No commands have been sent in this chat!',
['2'] = '<b>Command statistics for:</b> %s\n\n%s\n<b>Total commands sent:</b> %s',
['3'] = 'The command statistics for this chat have been reset!',
['4'] = 'I could not reset the command statistics for this chat. Perhaps they have already been reset?'
},
['control'] = {
['1'] = 'Pfft, you wish!',
['2'] = '%s is reloading...'
},
['copypasta'] = {
['1'] = 'The replied-to text musn\'t be any longer than %s characters!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'I couldn\'t add a counter to that message!'
},
['custom'] = {
['1'] = 'Success! That message will now be sent every time somebody uses %s!',
['2'] = 'The trigger "%s" does not exist!',
['3'] = 'The trigger "%s" has been deleted!',
['4'] = 'You don\'t have any custom triggers set!',
['5'] = 'Custom commands for %s:\n',
['6'] = 'To create a new, custom command, use the following syntax:\n/custom new #trigger <value>. To list all current triggers, use /custom list. To delete a trigger, use /custom del #trigger.'
},
['delete'] = {
['1'] = 'I could not delete that message. Perhaps the message is too old or non-existent?'
},
['demote'] = {
['1'] = 'Which user would you like me to demote? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot demote this user because they are not a moderator or an administrator in this chat.',
['3'] = 'I cannot demote this user because they have already left this chat.',
['4'] = 'I cannot demote this user because they have already been kicked from this chat.'
},
['dice'] = {
['1'] = 'The minimum range is %s.',
['2'] = 'The maximum range and count are both %s.',
['3'] = 'The maximum range is %s, and the maximum count is %s.',
['4'] = '%s rolls with a range of %s:\n'
},
['doge'] = {
['1'] = 'Please enter the text you want to Doge-ify. Each sentence should be separated using slashes or new lines.'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['duckduckgo'] = {
['1'] = 'I\'m not sure what that is!'
},
['eightball'] = {
['1'] = 'Yes.',
['2'] = 'No.',
['3'] = 'It is likely so.',
['4'] = 'Well, uh... I\'d ask again later, if I were you.'
},
['exec'] = {
['1'] = 'Please select the language you would like to execute your code in:',
['2'] = 'An error occured! The connection timed-out. Were you trying to make me lag?',
['3'] = 'You have selected "%s" – are you sure?',
['4'] = 'Back',
['5'] = 'I\'m sure',
['6'] = 'Please enter a snippet of code that you would like to run. You don\'t need to specify the language, we will do that afterwards!',
['7'] = 'Please select the language you would like to execute your code in:'
},
['facebook'] = {
['1'] = 'An error occured!',
['2'] = 'Please enter the name of the Facebook user you would like to get the profile picture of.',
['3'] = 'View @%s on Facebook'
},
['fact'] = {
['1'] = 'Generate Another'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'You searched for:',
['2'] = 'Please enter a search query (that is, what you want me to search Flickr for, i.e. "Big Ben" will return a photograph of Big Ben in London).',
['3'] = 'More Results'
},
['fortune'] = {
['1'] = 'Click to send your fortune!'
},
['frombinary'] = {
['1'] = 'Please enter the binary value you would like to convert to a string.',
['2'] = 'Malformed binary!'
},
['game'] = {
['1'] = 'Total wins: %s\nTotal losses: %s\nBalance: %s mattacoins',
['2'] = 'Join Game',
['3'] = 'This game has already ended!',
['4'] = 'It\'s not your turn!',
['5'] = 'You are not part of this game!',
['6'] = 'You cannot go here!',
['7'] = 'You are already part of this game!',
['8'] = 'This game has already started!',
['9'] = '%s [%s] is playing against %s [%s]\nIt is currently %s\'s turn!',
['10'] = '%s won the game against %s!',
['11'] = '%s drew the game against %s!',
['12'] = 'Waiting for opponent...',
['13'] = 'Tic-Tac-Toe',
['14'] = 'Click to send the game to your chat!',
['15'] = 'Statistics for %s:\n',
['16'] = 'Play Tic-Tac-Toe!'
},
['gblocklist'] = {
['1'] = 'Please reply-to the user you\'d like to globally blocklist, or specify them by username/ID.',
['2'] = 'I couldn\'t get information about "%s", please check it\'s a valid username/ID and try again.',
['3'] = 'That\'s a %s, not a user!'
},
['gif'] = {
['1'] = 'Please enter a search query (that is, what you want me to search GIPHY for, i.e. "cat" will return a GIF of a cat).'
},
['godwords'] = {
['1'] = 'Please enter a numerical value, between 1 and 64!',
['2'] = 'That number is too small, please specify one between 1 and 64!',
['3'] = 'That number is too large, please specify one between 1 and 64!'
},
['gallowlist'] = {
['1'] = 'Please reply-to the user you\'d like to globally allowlist, or specify them by username/ID.',
['2'] = 'I couldn\'t get information about "%s", please check it\'s a valid username/ID and try again.',
['3'] = 'That\'s a %s, not a user!'
},
['hackernews'] = {
['1'] = 'Top Stories from Hacker News:'
},
['help'] = {
['1'] = 'No results found!',
['2'] = 'There were no features found matching "%s", please try and be more specific!',
['3'] = '\n\nArguments: <required> [optional]\n\nSearch for a feature or get help with a command by using my inline search functionality - just mention me in any chat using the syntax @%s <search query>.',
['4'] = 'Previous',
['5'] = 'Next',
['6'] = 'Back',
['7'] = 'Search',
['8'] = 'You are on page %s of %s!',
['9'] = [[
I can perform many administrative actions in your groups, just add me as an administrator and send /administration to adjust the settings for your group.
Here are some administrative commands and a brief comment regarding what they do:
• /pin <text> - Send a Markdown-formatted message which can be edited by using the same command with different text, to save you from having to re-pin a message if you can't edit it (which happens if the message is older than 48 hours)
• /ban - Ban a user by replying to one of their messages, or by specifying them by username/ID
• /kick - Kick (ban and then unban) a user by replying to one of their messages, or by specifying them by username/ID
• /unban - Unban a user by replying to one of their messages, or by specifying them by username/ID
• /setrules <text> - Set the given Markdown-formatted text as the group rules, which will be sent whenever somebody uses /rules
]],
['10'] = [[
• /setwelcome - Set the given Markdown-formatted text as a welcome message that will be sent every time a user joins your group (the welcome message can be disabled in the administration menu, accessible via /administration). You can use placeholders to automatically customise the welcome message for each user. Use $user\_id to insert the user's numerical ID, $chat\_id to insert the chat's numerical ID, $name to insert the user's name, $title to insert the chat title and $username to insert the user's username (if the user doesn't have an @username, their name will be used instead, so it is best to avoid using this with $name)
• /warn - Warn a user, and ban them when they hit the maximum number of warnings
• /mod - Promote the replied-to user, giving them access to administrative commands such as /ban, /kick, /warn etc. (this is useful when you don't want somebody to have the ability to delete messages!)
• /demod - Demote the replied-to user, stripping them from their moderation status and revoking their ability to use administrative commands
• /staff - View the group's creator, administrators, and moderators in a neatly-formatted list
]],
['11'] = [[
• /report - Forwards the replied-to message to all administrators and alerts them of the current situation
• /setlink <URL> - Set the group's link to the given URL, which will be sent whenever somebody uses /link
• /links <text> - Allowlists all of the Telegram links found in the given text (includes @username links)
]],
['12'] = 'Below are some links you might find useful:',
['13'] = 'Development',
['14'] = 'Channel',
['15'] = 'Support',
['16'] = 'FAQ',
['17'] = 'Source',
['18'] = 'Donate',
['19'] = 'Rate',
['20'] = 'Administration Log',
['21'] = 'Admin Settings',
['22'] = 'Plugins',
['23'] = [[
<b>Hi %s! My name's %s, it's a pleasure to meet you</b> %s
I understand many commands, which you can learn more about by pressing the "Commands" button using the attached keyboard.
%s <b>Tip:</b> Use the "Settings" button to change how I work%s!
%s <b>Find me useful, or just want to help?</b> Donations are very much appreciated, use /donate for more information!
]],
['24'] = 'in'
},
['id'] = {
['1'] = 'I\'m sorry, but I don\'t recognize that user. To teach me who they are, forward a message from them to me or get them to send me a message.',
['2'] = 'Queried Chat:',
['3'] = 'This Chat:',
['4'] = 'Click to send the result!'
},
['imdb'] = {
['1'] = 'Previous',
['2'] = 'Next',
['3'] = 'You are on page %s of %s!'
},
['import'] = {
['1'] = 'I don\'t recognize that chat!',
['2'] = 'That\'s not a supergroup, therefore I cannot import any settings from it!',
['3'] = 'Successfully imported administrative settings & toggled plugins from %s to %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s Config File: %s
%s Mode: %s
%s TCP Port: %s
%s Version: %s
%s Uptime: %s days
%s Process ID: %s
%s Expired Keys: %s
%s User Count: %s
%s Group Count: %s
System:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s on Instagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 sum: %s\nSHA1 sum: %s\nFile size: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'This firmware is no longer being signed!',
['3'] = 'This firmware is still being signed!',
['4'] = 'Please select your model:',
['5'] = 'Please select your firmware version:',
['6'] = 'Please select your device type:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'That account was found in the following leaks:'
},
['isup'] = {
['1'] = 'This website appears to be up, maybe it\'s just you?',
['2'] = 'That doesn\'t appear to be a valid site!',
['3'] = 'It\'s not just you, this website looks down from here.'
},
['itunes'] = {
['1'] = 'Name:',
['2'] = 'Artist:',
['3'] = 'Album:',
['4'] = 'Track:',
['5'] = 'Disc:',
['6'] = 'The original query could not be found, you\'ve probably deleted the original message.',
['7'] = 'The artwork can be found below:',
['8'] = 'Please enter a search query (that is, what you want me to search iTunes for, i.e. "Green Day American Idiot" will return information about the first result for American Idiot by Green Day).',
['9'] = 'Get Album Artwork'
},
['kick'] = {
['1'] = 'Which user would you like me to kick? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot kick this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot kick this user because they have already left this chat.',
['4'] = 'I cannot kick this user because they have already been kicked from this chat.',
['5'] = 'I need to have administrative permissions in order to kick this user. Please amend this issue, and try again.'
},
['lastfm'] = {
['1'] = '%s\'s last.fm username has been set to "%s".',
['2'] = 'Your last.fm username has been forgotten!',
['3'] = 'You don\'t currently have a last.fm username set!',
['4'] = 'Please specify your last.fm username or set it with /fmset.',
['5'] = 'No history was found for this user.',
['6'] = '%s is currently listening to:\n',
['7'] = '%s last listened to:\n',
['8'] = 'Unknown',
['9'] = 'Click to send the result.'
},
['lmgtfy'] = {
['1'] = 'Let me Google that for you!'
},
['location'] = {
['1'] = 'You don\'t have a location set. What would you like your new location to be?'
},
['logchat'] = {
['1'] = 'Please enter the username or numerical ID of the chat you wish to log all administrative actions into.',
['2'] = 'Checking to see whether that chat is valid...',
['3'] = 'I\'m sorry, it appears you\'ve either specified an invalid chat, or you\'ve specified a chat I haven\'t been added to yet. Please rectify this and try again.',
['4'] = 'You can\'t set a user as your log chat!',
['5'] = 'You don\'t appear to be an administrator in that chat!',
['6'] = 'It seems I\'m already logging administrative actions into that chat! Use /logchat to specify a new one.',
['7'] = 'That chat is valid, I\'m now going to try and send a test message to it, just to ensure I have permission to post!',
['8'] = 'Hello, World - this is a test message to check my posting permissions - if you\'re reading this, then everything went OK!',
['9'] = 'All done! From now on, any administrative actions in this chat will be logged into %s - to change the chat you want me to log administrative actions into, just send /logchat.'
},
['lua'] = {
['1'] = 'Please enter a string of Lua to execute!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Show Lyrics',
['3'] = 'Please enter a search query (that is, what song/artist/lyrics you want me to get lyrics for, i.e. "Green Day Basket Case" will return the lyrics for the song Basket Case by Green Day).'
},
['minecraft'] = {
['1'] = '<b>%s has changed his/her username %s time</b>',
['2'] = '<b>%s has changed his/her username %s times</b>',
['3'] = 'Previous',
['4'] = 'Next',
['5'] = 'Back',
['6'] = 'UUID',
['7'] = 'Avatar',
['8'] = 'Username History',
['9'] = 'Please select an option:',
['10'] = 'Please enter the username of the Minecraft player you would like to view information about (i.e. sending "Notch" will view information about the player Notch).',
['11'] = 'Minecraft usernames are between 3 and 16 characters long.'
},
['msglink'] = {
['1'] = 'You can only use this command in supergroups and channels.',
['2'] = 'This %s must be public, with a @username.',
['3'] = 'Please reply to the message you\'d like to get a link for.'
},
['mute'] = {
['1'] = 'Which user would you like me to mute? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot mute this user because they are already muted in this chat.',
['3'] = 'I cannot mute this user because they are a moderator or an administrator in this chat.',
['4'] = 'I cannot mute this user because they have already left (or been kicked from) this chat.',
['5'] = 'I need to have administrative permissions in order to mute this user. Please amend this issue, and try again.'
},
['myspotify'] = {
['1'] = 'Profile',
['2'] = 'Following',
['3'] = 'Recently Played',
['4'] = 'Currently Playing',
['5'] = 'Top Tracks',
['6'] = 'Top Artists',
['7'] = 'You don\'t appear to be following any artists!',
['8'] = 'Your Top Artists',
['9'] = 'You don\'t appear to have any tracks in your library!',
['10'] = 'Your Top Tracks',
['11'] = 'You don\'t appear to be following any artists!',
['12'] = 'Artists You Follow',
['13'] = 'You don\'t appear to have recently played any tracks!',
['14'] = '<b>Recently Played</b>\n%s %s\n%s %s\n%s Listened to at %s:%s on %s/%s/%s.',
['15'] = 'The request has been accepted for processing, but the processing has not been completed.',
['16'] = 'You don\'t appear to be listening to anything right now!',
['17'] = 'Currently Playing',
['18'] = 'An error occured whilst re-authorising your Spotify account!',
['19'] = 'Successfully re-authorised your Spotify account! Processing your original request...',
['20'] = 'Re-authorising your Spotify account, please wait...',
['21'] = 'You need to authorise mattata in order to connect your Spotify account. Click [here](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) and press the green "OKAY" button to link mattata to your Spotify account. After you\'ve done that, send the link you were redirected to (it should begin with "%s", followed by a unique code) in reply to this message.',
['22'] = 'Playlists',
['23'] = 'Use Inline Mode',
['24'] = 'Lyrics',
['25'] = 'No devices were found.',
['26'] = 'You don\'t appear to have any playlists.',
['27'] = 'Your Playlists',
['28'] = '%s %s [%s tracks]',
['29'] = '%s %s [%s]\nSpotify %s user\n\n<b>Devices:</b>\n%s',
['30'] = 'Playing previous track...',
['31'] = 'You are not a premium user!',
['32'] = 'I could not find any devices.',
['33'] = 'Playing next track...',
['34'] = 'Resuming track...',
['35'] = 'Your device is temporarily unavailable...',
['36'] = 'No devices were found!',
['37'] = 'Pausing track...',
['38'] = 'Now playing',
['39'] = 'Shuffling your music...',
['40'] = 'That\'s not a valid volume. Please specify a number between 0 and 100.',
['41'] = 'The volume has been set to %s%%!',
['42'] = 'This message is using an old version of this plugin, please request a new one by sending /myspotify!'
},
['name'] = {
['1'] = 'The name I currently respond to is "%s" - to change this, use /name <text> (where <text> is what you want me to respond to).',
['2'] = 'My new name needs to be between 2 and 32 characters long!',
['3'] = 'My name may only contain alphanumeric characters!',
['4'] = 'I will now respond to "%s", instead of "%s" - to change this, use /name <text> (where <text> is what you want me to respond to).'
},
['netflix'] = {
['1'] = 'Read more.'
},
['news'] = {
['1'] = '"<code>%s</code>" isn\'t a valid Lua pattern.',
['2'] = 'I couldn\'t retrieve a list of sources.',
['3'] = '<b>News sources found matching</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Here are the current available news sources you can use with</b> /news<b>. Use</b> /nsources &lt;query&gt; <b>to search the list of news sources for a more specific set of results. Searches are matched using Lua patterns</b>\n\n%s',
['5'] = 'You don\'t have a preferred news source. Use /setnews <source> to set one. View a list of sources using /nsources, or narrow down the results by using /nsources <query>.',
['6'] = 'Your current preferred news source is %s. Use /setnews <source> to change it. View a list of sources using /nsources, or narrow down the results by using /nsources <query>.',
['7'] = 'Your preferred source is already set to %s! Use /news to view the current top story.',
['8'] = 'That\'s not a valid news source. View a list of sources using /nsources, or narrow down the results by using /nsources <query>.',
['9'] = 'Your preferred news source has been updated to %s! Use /news to view the current top story.',
['10'] = 'That\'s not a valid source, use /nsources to view a list of available sources. If you have a preferred source, use /setnews <source> to automatically have news from that source sent when you send /news, without any arguments needed.',
['11'] = 'Read more.'
},
['nick'] = {
['1'] = 'Your nickname has now been forgotten!',
['2'] = 'Your nickname has been set to "%s"!'
},
['ninegag'] = {
['1'] = 'Read More'
},
['optout'] = {
['1'] = 'You have opted-in to having data you send collected! Use /optout to opt-out.',
['2'] = 'You have opted-out of having data you send collected! Use /optin to opt-in.'
},
['paste'] = {
['1'] = 'Please select a service to upload your paste to:'
},
['pay'] = {
['1'] = 'You currently have %s mattacoins. Earn more by winning games of Tic-Tac-Toe, using /game - You will win 100 mattacoins for every game you win, and you will lose 50 for every game you lose.',
['2'] = 'You must use this command in reply to the user you\'d like to send mattacoins to.',
['3'] = 'Please specify the amount of mattacoins you\'d like to give %s.',
['4'] = 'The amount specified should be a numerical value, of which can be no less than 0.',
['5'] = 'You can\'t send money to yourself!',
['6'] = 'You don\'t have enough funds to complete that transaction!',
['7'] = '%s mattacoins have been sent to %s. Your new balance is %s mattacoins.'
},
['pin'] = {
['1'] = 'You haven\'t set a pin before. Use /pin <text> to set one. Markdown formatting is supported.',
['2'] = 'Here is the last message generated using /pin.',
['3'] = 'I found an existing pin in the database, but the message I sent it in seems to have been deleted, and I can\'t find it anymore. You can set a new one with /pin <text>. Markdown formatting is supported.',
['4'] = 'There was an error whilst updating your pin. Either the text you entered contained invalid Markdown syntax, or the pin has been deleted. I\'m now going to try and send you a new pin, which you\'ll be able to find below - if you need to modify it then, after ensuring the message still exists, use /pin <text>.',
['5'] = 'I couldn\'t send that text because it contains invalid Markdown syntax.',
['6'] = 'Click here to see the pin, updated to contain the text you gave me.'
},
['pokedex'] = {
['1'] = 'Name: %s\nID: %s\nType: %s\nDescription: %s'
},
['prime'] = {
['1'] = 'Please enter a number between 1 and 99999.',
['2'] = '%s is a prime number!',
['3'] = '%s is NOT a prime number...'
},
['promote'] = {
['1'] = 'I cannot promote this user because they are a moderator or an administrator of this chat.',
['2'] = 'I cannot promote this user because they have already left this chat.',
['3'] = 'I cannot promote this user because they have already been kicked from this chat.'
},
['quote'] = {
['1'] = 'This user has opted out of data-storing functionality.',
- ['2'] = 'There are no saved quotes for %s%s! You can save one by using /save in reply to a message they send.'
+ ['2'] = 'There are no saved quotes for %s! You can save one by using /save in reply to a message they send.'
},
['randomsite'] = {
['1'] = 'Generate Another'
},
['randomword'] = {
['1'] = 'Generate Another',
['2'] = 'Your random word is <b>%s</b>!'
},
['report'] = {
['1'] = 'Please reply to the message you would like to report to the group\'s administrators.',
['2'] = 'You can\'t report your own messages, are you just trying to be funny?',
['3'] = '<b>%s needs help in %s!</b>',
['4'] = 'Click here to view the reported message.',
['5'] = 'I\'ve successfully reported that message to %s admin(s)!'
},
['rms'] = {
['1'] = 'Holy GNU!'
},
['save'] = {
['1'] = 'This user has opted out of data-storing functionality.',
- ['2'] = 'That message has been saved in my database, and added to the list of possible responses for when /quote is used in reply to %s%s!'
+ ['2'] = 'That message has been saved in my database, and added to the list of possible responses for when /quote is used in reply to %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s didn\'t mean to say this!</i>',
['2'] = '%s\n\n<i>%s has admitted defeat.</i>',
['3'] = '%s\n\n<i>%s isn\'t sure if they were mistaken...</i>',
['4'] = 'Screw you, <i>when am I ever wrong?</i>',
['5'] = '"<code>%s</code>" isn\'t a valid Lua pattern.',
['6'] = '<b>Hi, %s, did you mean:</b>\n<i>%s</i>',
['7'] = 'Yes',
['8'] = 'No',
['9'] = 'Not sure'
},
['setgrouplang'] = {
['1'] = 'This group\'s language has been set to %s!',
['2'] = 'This group\'s language is currently %s.\nPlease note that some strings may not be translated as of yet. If you\'d like to change your language, select one using the keyboard below:',
['3'] = 'The option to force users to use the same language in this group is currently disabled. This setting should be toggled from /administration but, to make things easier for you, I\'ve included a button below.',
['4'] = 'Enable',
['5'] = 'Disable'
},
['setlang'] = {
['1'] = 'Your language has been set to %s!',
['2'] = 'Your language is currently %s.\nPlease note that some strings may not be translated as of yet. If you\'d like to change your language, select one using the keyboard below:'
},
['setlink'] = {
['1'] = 'That\'s not a valid URL.',
['2'] = 'Link set successfully!'
},
['setrules'] = {
['1'] = 'Invalid Markdown formatting.',
['2'] = 'Successfully set the new rules!'
},
['setwelcome'] = {
['1'] = 'What would you like the welcome message to be? The text you specify will be Markdown-formatted and sent every time a user joins the chat (the welcome message can be disabled in the administration menu, accessible via /administration). You can use placeholders to automatically customise the welcome message for each user. Use $user_id to insert the user\'s numerical ID, $chat_id to insert the chat\'s numerical ID, $name to insert the user\'s name, $title to insert the chat\'s title and $username to insert the user\'s username (if the user doesn\'t have an @username, their name will be used instead, so it is best to avoid using this in conjunction with $name).',
['2'] = 'There was an error formatting your message, please check your Markdown syntax and try again.',
['3'] = 'The welcome message for %s has successfully been updated!'
},
['share'] = {
['1'] = 'Share'
},
['shorten'] = {
['1'] = 'Please select a URL shortener using the buttons below:'
},
['shsh'] = {
['1'] = 'I couldn\'t fetch any SHSH blobs for that ECID, please ensure it\'s valid and you have saved them using https://tsssaver.1conan.com.',
['2'] = 'SHSH blobs for that device are available for the following versions of iOS:\n',
['3'] = 'Download .zip'
},
['statistics'] = {
['1'] = 'No messages have been sent in this chat!',
['2'] = '<b>Statistics for:</b> %s\n\n%s\n<b>Total messages sent:</b> %s',
['3'] = 'The statistics for this chat have been reset!',
['4'] = 'I could not reset the statistics for this chat. Perhaps they have already been reset?'
},
['steam'] = {
['1'] = 'Your Steam username has been set to "%s".',
['2'] = '"%s" isn\'t a valid Steam username.',
['3'] = '%s has been a user on Steam since %s, on %s. They last logged off at %s, on %s. Click <a href="%s">here</a> to view their Steam profile.',
['4'] = '%s, AKA "%s",'
},
['synonym'] = {
['1'] = 'You could use the word <b>%s</b>, instead of %s.'
},
['thoughts'] = {
['1'] = '%s\n\nPositive: <code>%s%% [%s]</code>\nNegative: <code>%s%% [%s]</code>\nIndifferent: <code>%s%% [%s]</code>\nTotal thoughts: <code>%s</code>'
},
['tobinary'] = {
['1'] = 'Please enter the string you would like to convert to binary.'
},
['trust'] = {
['1'] = 'I cannot trust this user because they are a moderator or an administrator of this chat.',
['2'] = 'I cannot trust this user because they have already left this chat.',
['3'] = 'I cannot trust this user because they have already been kicked from this chat.'
},
['unmute'] = {
['1'] = 'Which user would you like me to unmute? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot unmute this user because they are not currently muted in this chat.',
['3'] = 'I cannot unmute this user because they are a moderator or an administrator in this chat.',
['4'] = 'I cannot unmute this user because they have already left (or been kicked from) this chat.'
},
['untrust'] = {
['1'] = 'Which user would you like me to untrust? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot untrust this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot untrust this user because they have already left this chat.',
['4'] = 'I cannot untrust this user because they have already been kicked from this chat.'
},
['upload'] = {
['1'] = 'Please reply to the file you\'d like to download to the server. It must be <= 20 MB.',
['2'] = 'That file is too large. It must be <= 20 MB.',
['3'] = 'I couldn\'t get this file, it\'s probably too old.',
['4'] = 'There was an error whilst retrieving this file.',
['5'] = 'Successfully downloaded the file to the server - it can be found at <code>%s</code>!'
},
['version'] = {
['1'] = '@%s AKA %s `[%s]` is running mattata %s, created by [Matthew Hesketh](https://t.me/wrxck). The source code is available on [GitHub](https://github.com/wrxck/mattata).'
},
['voteban'] = {
['1'] = 'Which user would you like to open up a vote-ban for? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot setup a vote-ban for this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot setup a vote-ban for this user because they have already left (or been kicked from) this chat.',
['4'] = 'Should %s [%s] be banned from %s? %s upvotes are required for an immediate ban, and %s downvotes are required for this vote to be closed.',
['5'] = 'Yes [%s]',
['6'] = 'No [%s]',
['7'] = 'The people have spoken. I have banned %s [%s] from %s because %s people voted for me to do so.',
['8'] = 'The required upvote amount was reached, however, I was unable to ban %s - perhaps they\'ve left the group or been promoted since we opened the vote to ban them? It\'s either that, or I no longer have the administrative privileges required in order to perform this action!',
['9'] = 'The people have spoken. I haven\'t banned %s [%s] from %s because the required %s people downvoted the decision to ban them.',
['10'] = 'You upvoted the decision to ban %s [%s]!',
['11'] = 'Your current vote has been retracted, use the buttons again to re-submit your vote.',
['12'] = 'You downvoted the decision to ban %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'You don\'t have a location set. Use /setloc <location> to set one.',
['2'] = 'It\'s currently %s (feels like %s) in %s. %s'
},
['welcome'] = {
['1'] = 'Group Rules'
},
['allowlist'] = {
['1'] = 'Which user would you like me to allowlist? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot allowlist this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot allowlist this user because they have already left this chat.',
['4'] = 'I cannot allowlist this user because they have already been banned from this chat.'
},
['wikipedia'] = {
['1'] = 'Read more.'
},
['youtube'] = {
['1'] = 'Previous',
['2'] = 'Next',
['3'] = 'You are on page %s of %s!'
}
}
\ No newline at end of file
diff --git a/languages/pl_pl.lua b/languages/pl_pl.lua
index 8d774cf..5cb1766 100644
--- a/languages/pl_pl.lua
+++ b/languages/pl_pl.lua
@@ -1,813 +1,813 @@
-- This is a language file for mattata
-- Language: pl-pl
-- Author: GingerPlusPlus
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Błąd połączenia.',
['results'] = 'Brak pasujących wyników.',
['supergroup'] = 'Ta komenda może być używana tylko w supergrupach.',
['admin'] = 'Aby użyć tej komendy, musisz być moderatorem lub administratorem w tej grupie.',
['unknown'] = 'Nieznany użytkownik. Aby pokazać mi kto to, przekaż wiadomość od niego do dowolnego czatu w którym jestem.',
['generic'] = 'Wystąpił błąd!',
['use'] = 'You are not allowed to use this!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Ta funkcja jest dostępna tylko dla użytkowników posiadających @username.',
['2'] = '%s powrócił(a) po nieobecności trwającej %s!',
['3'] = 'Komentarz',
['4'] = '%s jest teraz AFK.%s'
},
['antispam'] = {
['1'] = 'Disable',
['2'] = 'Enable',
['3'] = 'Disable limit',
['4'] = 'Enable limits on %s',
['5'] = 'All Administration Settings',
['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
['8'] = 'The maximum limit is 100.',
['9'] = 'The minimum limit is 1.',
['10'] = 'Modify the anti-spam settings for %s below:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'Zobacz na iTunes',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'Nie mogę dostać zdjęć profilowych tego użytkownika, upewnij się że podano poprawne @username lub ID.',
['2'] = 'Ten użytkownik nie ma żadnych zdjęć profilowych.',
['3'] = 'Ten użytkownik nie ma aż tylu zdjęć profilowych!',
['4'] = 'Ten użytkownik zrezygnował ze zbierania danych na jego temat, toteż nie mogę pokazać Ci jego zdjęć profilowych.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Kogo mam zbanować? Podaj @username lub ID.',
['2'] = 'Nie mogę zbanować tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę zbanować tego użytkownika, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę zbanować tego użytkownika, ponieważ został on zbanowany już wcześniej.',
['5'] = 'Potrzebuję uprawnień administratora aby móc banować.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Podaj komendę to uruchomienia.',
['2'] = 'Sukces!'
},
['blocklist'] = {
['1'] = 'Kogo mam ignorować? Podaj @username lub ID.',
['2'] = 'Nie mogę ignorować tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę ignorować tego użytkownika, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę ignorować tego użytkownika, ponieważ został on zbanowany.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s został dodany do czarnej listy, nie pozwolę się tam dodać!',
['2'] = '%s jest użytkownikiem, ta komenda służy do blokowanie grup i kanałów!',
['3'] = '%s wydaje się nie istnieć!'
},
['bugreport'] = {
['1'] = 'Twój raport o błędzie został wysłany; ID Twojego raportu to #%s.',
['2'] = 'Wystąpił problem podczas raportowania błędu...'
},
['calc'] = {
['1'] = 'Klinknij aby wysłać.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'Nie potrafię opisać tego obrazka.'
},
['cats'] = {
['1'] = 'Miau!'
},
['channel'] = {
['1'] = 'Nie masz wymaganych uprawnień.',
['2'] = 'Wygląda na to że już nie administrujesz tamtą grupą.',
['3'] = 'Twoja wiadomość nie mogła zostać wysłana, upewnij się że mam uprawnienia administratora w tamtym kanale.',
['4'] = 'Twoja wiadomość została wysłana.',
['5'] = 'Nie mogę pobrać listy admistratorów tamtej grupy.',
['6'] = 'Wygląda na to że nie jesteś administratorem w tamtej grupie.',
['7'] = 'Podaj wiadomość do wysłania, używając /channel <kanał> <wiadomość>.',
['8'] = 'Czy jesteś pewien że chcesz wysłać tą wiadomość? Będzie ona wyglądać tak:',
['9'] = 'Potwierdź',
['10'] = 'Wiadmość zawiera niepoprawny Markdown! Popraw składnię i spróbuj ponownie.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'Nie wysłano jeszcze żadnych komend w tej grupie!',
['2'] = '<b>Statystyki komend w:</b> %s\n\n%s\n<b>Liczba wszystkich komend:</b> %s',
['3'] = 'Zresetowano statystyki komend w tej grupie!',
['4'] = 'Błąd podczas resetowania statystyk, może zostały one zresetowane już wcześniej?'
},
['control'] = {
['1'] = 'Heh, chciałbyś!',
['2'] = '%s restartuje się...'
},
['copypasta'] = {
['1'] = 'Wiadomość na którą odpowiadasz tą komendą nie może być dłuższa niż %s znaków!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'Dodawanie licznika do wiadomości nie powiodło się!'
},
['custom'] = {
['1'] = 'Sukces! Ta wiadomość zostanie wysłana za każdym razem gdy ktoś napisze %s!',
['2'] = 'Wyzwalacz "%s" nie istnieje!',
['3'] = 'Wyzwalacz "%s" został usunięty!',
['4'] = 'Nie utworzono żadnych wyzwalaczy',
['5'] = 'Wyzwalacze w %s:\n',
['6'] = 'Aby utworzyć nowy wyzwalacz, napisz:\n/custom new #wyzwalacz <wartość>.\nAby zobaczyć listę wyzwalaczy, napisz /custom list. Aby usunąć wyzwalacz, napisz, use /custom del #wyzwalacz.'
},
['delete'] = {
['1'] = 'Nie mogę usunąć tej wiadomości. Może jest za stara, albo nie istnieje?'
},
['demote'] = {
['1'] = 'Kogo mam zdegradować? Podaj @username lub ID.',
['2'] = 'Nie mogę zdegradować tego użytkownika, ponieważ nie jest to moderator tej grupy.',
['3'] = 'Nie mogę zdegradować tego użytkownika, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę zdegradować tego użytkownika, ponieważ został on wyrzucony z tej grupy.',
},
['dice'] = {
['1'] = 'Najmniejsza dopuszczalna liczba ścian to %s.',
['2'] = '%s to limit liczby ścian, i liczby rzutów.',
['3'] = 'Limit liczby ścian to %s, a limit liczby rzutów to %s.',
['4'] = '%s rzutów %s-ścienną kostką:\n'
},
['doge'] = {
['1'] = 'Podaj tekst do umieszczenia na obrazku z Piesełem. Rozdziel wypowiedzi ukośnikiem lub nową linią.'
},
['duckduckgo'] = {
['1'] = 'Nie wiem co to jest!'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['eightball'] = {
['1'] = 'Tak.',
['2'] = 'Nie.',
['3'] = 'Prawdopodobnie.',
['4'] = 'Uh... spytaj ponownie później.'
},
['exec'] = {
['1'] = 'Wybierz język:',
['2'] = 'To trwało zbyt długo... Czy próbowałeś mnie zawiesić?',
['3'] = 'Wybrano %s – jesteś pewien?',
['4'] = 'Powrót',
['5'] = 'Potwierdź',
['6'] = 'Podaj fragment kodu który chcesz uruchomić, o język zapytam za chwilę.',
['7'] = 'Wybierz język:'
},
['facebook'] = {
['1'] = 'Wystąpił błąd!',
['2'] = 'Podaj Facebookową nazwę użytkownika.',
['3'] = 'Zobacz %s na Facebooku'
},
['fact'] = {
['1'] = 'Wygeneruj inny'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Szukano:',
['2'] = 'Czego chcesz szukać na Flickr?',
['3'] = 'Więcej wyników'
},
['fortune'] = {
['1'] = 'Kliknij aby wysłać.'
},
['frombinary'] = {
['1'] = 'Wprowadź liczbę binarną którą chcesz przeliczyć na tekst.',
['2'] = 'Nie jest to poprawna liczba binarna!'
},
['game'] = {
['1'] = 'Zwycięstwa: %s\nPorażki: %s\nSaldo: %s mattamonet',
['2'] = 'Dołącz',
['3'] = 'Gra się już skończyła!',
['4'] = 'Nie Twój ruch!',
['5'] = 'Nie jesteś w tej grze!',
['6'] = 'To pole jest już zajęte, wybierz inne!',
['7'] = 'Już jesteś w grze!',
['8'] = 'Gra została rozpoczęta już wcześniej!',
['9'] = '%s [%s] gra przeciwko %s [%s]\nKolej na ruch gracza %s!',
['10'] = '%s wygrał(a) z %s!',
['11'] = '%s zremisował(a) z %s!',
['12'] = 'Czekanie na przeciwnika...',
['13'] = 'Kółko i krzyżyk',
['14'] = 'Klinkij aby rozpocząć grę w tej grupie!',
['15'] = 'Statystyki dla %s:\n',
['16'] = 'Zagraj w kółko i krzyżyk!'
},
['gblocklist'] = {
['1'] = 'Odpowiedz do użytkownika którego mam wszędzie ignorować, bądź podaj jego @username lub ID.',
['2'] = 'Nie mogę dostać informacji o "%s", upewnij się że jest to poprawny @username lub ID.',
['3'] = 'To %s, a nie użytkownik!'
},
['gif'] = {
['1'] = 'Co mam wyszukać na Giphy?'
},
['godwords'] = {
['1'] = 'Podaj liczbę naturalną pomiędzy 1 a 64!',
['2'] = 'Liczba zbyt mała, musi należeć do przedziału od 1 do 64!',
['3'] = 'Liczba zbyt duża, musi należeć do przedziału od 1 do 64!'
},
['gallowlist'] = {
['1'] = 'Odpowiedz do użytkownika któremu mam znowu odpowiedać, bądź podaj jego @username lub ID.',
['2'] = 'Nie mogę dostać informacji o "%s", upewnij się że jest to poprawny @username lub ID.',
['3'] = 'To %s, a nie użytkownik!'
},
['hackernews'] = {
['1'] = 'Najlepsze historie z Hacker News:'
},
['help'] = {
['1'] = 'Brak pasujących wyników!',
['2'] = 'Brak funkcji których nazwa pasuje do "%s"!',
['3'] = '\n\nArgumenty: <wymagane> [opcjonalne]\n\nSzukaj funkcji lub przeczytaj pomoc do komendy używając wyszukiwania inline - w dowolnym czacie, napisz @%s <czego szukasz>.',
['4'] = 'Poprzednia',
['5'] = 'Następna',
['6'] = 'Powrót',
['7'] = 'Szukaj',
['8'] = 'Strona %s z %s',
['9'] = [[
Mogę wykonywać wiele akcji administracyjnych w Twoich grupach, dodaj mnie do grupy jako administrator i wyślij /administration żeby dostosować ustawienia dla swojej grupy.
Niektóre polecenia administracyjne i ich krótki opis:
• /pin <tekst> - Tworzy wiadomość do przypięcia (używane jest formatowanie Markdown). Użyj ponownie aby zedytować przypiętą wiadomość bez konieczności przypinania nowej wiadomości.
• /ban - Zbanuj użytkownika, odpowiadając tą komendą na jego wiadomość, bądź podając jego ID lub @username jako argument
• /kick - Wyrzuć (ban, następnie unban) użytkownika, odpowiadając tą komendą na jego wiadomość, bądź podając jego ID lub @username jako argument
• /unban - Anuluj bana użytkownika, odpowiadając tą komendą na jego wiadomość, bądź podając jego ID lub @username jako argument
• /setrules <tekst> - Ustaw tekst (sformatowany Markdownem) jako zasady grupy, które można przeczytać pisząc /rules
]],
['10'] = [[
• /setwelcome <tekst> - Co chcesz powiedzieć każdemu nowemu członkowi? Możesz używać Markdown do formatowania. (Wiadomość powitalną można wyłączyć w menu administracyjnym, pisząc /administration). Użyj $user\_id aby wstawić ID dołączającego użytkownika, $chat\_id aby wstawić ID grupy, $name aby wstawić the imię użytkownika, $title aby wstawić nazwę grupy i $username aby wstawić @username użytkownika (jeśli użytkownik nie ma @username, zostanie wstawione jego imię, więc najlepiej nie używać $name i $username koło siebie)
• /warn - Ostrzeż użytkownika. Użytkownik zostanie zbanowany jeśli osiągnie limit ostrzeżeń
• /mod - Awansuj użytkownika na moderatora, pozwalając im używać poleceń administracyjnych, takich jak /ban, /kick, /warn itp.
• /demod - Zdegraduj moderatora do zwykłego użytkownika, odbierając im możliwość używania poleceń administracyjnych
• /staff - Wyświetl twórcę grupy, administratorów i moderatorów
]],
['11'] = [[
• /report - Przekazuje wiadomość na którą odpowiadasz administratorom, ostrzegając ich o zaistniałej sytuacji
• /setlink <URL> - Ustaw link do grupy, który można zobaczyć poleceniem /link
• /links <tekst> - Pozwól na wysyłanie linków znalezionych w tekście (także linki zapisane jako @username)
]],
['12'] = 'Poniżej jest parę linków które mogą Ci się przydać:',
['13'] = 'Development',
['14'] = 'Kanał',
['15'] = 'Wsparcie',
['16'] = 'Częste pytania',
['17'] = 'Kod źródłowy',
['18'] = 'Wspomóż finansowo',
['19'] = 'Oceń',
['20'] = 'Log administracyjny',
['21'] = 'Ustawienia administracyjne',
['22'] = 'Plugins', --!
['23'] = [[
<b>Cześć %s! Mam na imię %s, miło Cię poznać</b> %s
Rozumiem wiele poleceń, które możesz poznać klikając przycisk "Commands".
%s <b>Wskazówka:</b> Użyj przycisku "Settings" poniżej aby dostosować moje zachowanie%s!
%s <b>Find me useful, or just want to help?</b> Donations are very much appreciated, use /donate for more information!
]],
['24'] = 'w'
},
['id'] = {
['1'] = 'Nieznany użytkownik. Aby pokazać mi kto to, przekaż wiadomość od niego do dowolnego czatu w którym jestem.',
['2'] = 'Czat o który pytano:',
['3'] = 'Ten czat:',
['4'] = 'Kliknij aby wysłać.'
},
['imdb'] = {
['1'] = 'Poprzednia',
['2'] = 'Następna',
['3'] = 'Strona %s z %s'
},
['import'] = {
['1'] = 'Nie rozpoznaję tamtego czatu!',
['2'] = 'To nie jest supergrupa, więc nie mogę zaimportować z niej żadnych ustawień!',
['3'] = 'Pomyślnie zaimportowano ustawienia administracyjne i stan pluginów z %s do %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s plik konfiguracyjny: %s
%s tryb: %s
%s port TCP: %s
%s wersja: %s
%s czas pracy: %s days
%s ID procesu: %s
%s Przeterminowane wpisy: %s
%s liczba użytkowników: %s
%s liczba grup: %s
System:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s na Instagramie'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>Suma kontrolna MD5: %s\nSuma kontrolna SHA1: %s\nRozmiar pliku: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'To firmware nie jest już podpisywane!',
['3'] = 'To firmware jest wciąż podpisywane!',
['4'] = 'Wybierz swój model:',
['5'] = 'Wybierz swoją wersję firmware:',
['6'] = 'Wybierz swój typ urządzenia:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'To konto zostało znalezione w następujących wyciekach:'
},
['isup'] = {
['1'] = 'Ta strona internetowa wydaje się działać, może tylko u Ciebie nie działa?',
['2'] = 'Nie wygląda mi to na poprawny adres strony internetowej...',
['3'] = 'Nie tylko u Ciebie, tutaj też ta strona internetowa wydaje się nie działać.'
},
['itunes'] = {
['1'] = 'Nazwa:',
['2'] = 'Artysta:',
['3'] = 'Album:',
['4'] = 'Utwór:',
['5'] = 'Płyta:',
['6'] = 'Wiadomość zawierająca polecenie została usunięta.',
['7'] = 'Okładka poniżej:',
['8'] = 'Co mam wyszukać na iTunes?',
['9'] = 'Okładka albumu'
},
['kick'] = {
['1'] = 'Kogo mam wyrzucić? Podaj @username lub ID.',
['2'] = 'Nie mogę wyrzucić tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę wyrzucić tego użytkownika, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę wyrzucić tego użytkownika, ponieważ został on wyrzucony już wcześniej.',
['5'] = 'Potrzebuję uprawnień administratora aby móc wyrzucać.'
},
['lastfm'] = {
['1'] = 'Nazwa użytkownika last.fm użytkownika %s została ustawiona na "%s".',
['2'] = 'Twoja nazwa użytkownika last.fm została zapomniana!',
['3'] = 'Nie masz ustawionej nazwy użytkownika last.fm!',
['4'] = 'Proszę podaj swoją nazwę użytkownika last.fm bądź ustaw ją używając /fmset.',
['5'] = 'Nie znaleziono historii tego użytkownika.',
['6'] = '%s słucha w tej chwili:\n',
['7'] = '%s ostatnio słuchał(a):\n',
['8'] = 'Nieznany',
['9'] = 'Kliknij aby wysłać.'
},
['lmgtfy'] = {
['1'] = 'Wygoogluję to za Ciebie!'
},
['location'] = {
['1'] = 'Nie masz ustawionej lokalizacji. Co mam ustawić jako Twoją nową lokalizację?'
},
['logchat'] = {
['1'] = 'Podaj @username bądź ID grupy w której mam rejestrować akcje administracyjnych.',
['2'] = 'Sprawdzam czy tamta grupa jest ok...',
['3'] = 'Przepraszam, wygląda na to, że grupa nie istnieje, bądź nie jestem jej członkiem. Napraw to i spróbuj ponownie.',
['4'] = 'Nie możesz ustawić użytkownika jako dziennik akcji administracyjnych!',
['5'] = 'Nie jesteś administratorem w tamtej grupie!',
['6'] = 'Wygląda na to że już rejestruję akcje administracyjne w tamtej grupie! Użyj /logchat by wybrać inną.',
['7'] = 'Jak na razie wszystko w porządku, spróbuję wysłać tam testową wiadomość żeby upawnić się że mogę wywyłać tam wiadomości...',
['8'] = 'Witaj świecie - to wiadomość testowa, żeby sprawdzić czy mogę tu pisać - jeśli to czytasz, wszystko poszło zgodnie z planem!',
['9'] = 'Wszystko ok! Od teraz, każda akcja administracyjna w tej grupie będzie rejestrowana w %s - aby wybrać inne miejsce, napisz /logchat.'
},
['lua'] = {
['1'] = 'Podaj proszę fragment kodu Lua do uruchomienia:'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Pokaż tekst',
['3'] = 'Podaj tytuł piosenki/artystę/fragment tekstu.'
},
['minecraft'] = {
['1'] = '<b>%s zmienił(a) nazwę użytkownika %s raz</b>',
['2'] = '<b>%s zmienił(a) nazwę użytkownika %s razy</b>',
['3'] = 'Poprzednia',
['4'] = 'Następna',
['5'] = 'Powrót',
['6'] = 'UUID',
['7'] = 'Avatar',
['8'] = 'Historia nazwy użytkownika',
['9'] = 'Wybierz:',
['10'] = 'Podaj nazwę użytkownika gracza Minecraft.',
['11'] = 'Nazwy użytkownika w Minecraft mają długość od 3 do 16 znaków.'
},
['msglink'] = {
['1'] = 'Ta komenda może być używana tylko w supergrupach i kanałach.',
['2'] = 'Ta %s musi być publiczna, musi mieć @username.',
['3'] = 'Odpisz tą komendą na wiadomość aby otrzymać linka do wiadomości.'
},
['mute'] = {
['1'] = 'Kogo mam wyciszyć? Podaj @username lub ID.',
['2'] = 'Nie mogę wyciszyć tego użytkownika, ponieważ został on wyciszony już wcześniej.',
['3'] = 'Nie mogę wyciszyć tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['4'] = 'Nie mogę wyciszyć tego użytkownika, ponieważ opuścił on tę grupę lub został z niej wyrzucony.',
['5'] = 'Potrzebuję uprawnień administratora aby móc wyciszać.'
},
['myspotify'] = {
['1'] = 'Profil',
['2'] = 'Śledzący',
['3'] = 'Niedawno odtwarzane',
['4'] = 'Aktualnie odtwarzane',
['5'] = 'Najczęściej odtwarzane utwory',
['6'] = 'Top Artists', --!
['7'] = 'Wygląda na to, że nie śledzisz żadnych artystów!',
['8'] = 'Your Top Artists',
['9'] = 'Wygląda na to, że nie masz żadnych utworów w bibliotece!',
['10'] = 'Utwory najczęściej odtwarzane przez Ciebie',
['11'] = 'Wygląda na to, że nie śledzisz żadnych artystów!',
['12'] = 'Artyści których śledzisz',
['13'] = 'Nie odtwarzano ostatnie żadnych utworów!',
['14'] = '<b>Niedawno odtwarzane</b>\n%s %s\n%s %s\n%s Słuchano o %d:%d dnia %d/%d/%d.',
['15'] = 'Zaakceptowano żądanie, trwa przetwarzanie.',
['16'] = 'Wygląda na to, że niczego teraz nie słuchasz!',
['17'] = 'Aktualnie odtwarzane',
['18'] = 'Wystąpił błąd podczas ponownej autoryzacji Twojego konta Spotify!',
['19'] = 'Ponowna autoryzacja Twojego konta Spotify powiodła się! Przetwarzanie Twojego oryginalnego żądania...',
['20'] = 'Trwa ponowna autoryzacja Twojego konta Spotify, proszę czekać...',
['21'] = 'Potrzebujesz autoryzować Mattatę aby połączyć się ze swoim kontem Spotify. Kliknij [tutaj](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read%%20playlist-read-private%%20playlist-read-collaborative%%20user-read-private%%20user-read-birthdate%%20user-read-email%%20user-follow-read%%20user-top-read%%20user-read-playback-state%%20user-read-recently-played%%20user-read-currently-playing) i kliknij zielony przycisk "OKAY" aby połączyć Mattatę do Twojego konta Spotify. Następnie wyślij link do którego Cię przekierowano (powinien się zaczynać od "%s", a następnie zawierać unikatowy kod) w odpowiedzi na tę wiadomość.',
['22'] = 'Listy odtwarzania',
['23'] = 'Użyj trybu inline',
['24'] = 'Tekst piosenki',
['25'] = 'Nie znaleziono żadnych urządzeń.',
['26'] = 'Wygląda na to, że nie masz żadnych list odtwarzania.',
['27'] = 'Twoje listy odtwarzania',
['28'] = '%s %s [%s utworów]',
['29'] = '%s %s [%s]\nSpotify %s user\n\n<b>Urządzenia:</b>\n%s', --!
['30'] = 'Włączam poprzedni utwor...',
['31'] = 'Nie masz konta premium!',
['32'] = 'Nie znaleziono żadnych urządzeń.',
['33'] = 'Włączam następny utwór...',
['34'] = 'Wznawiam odtwarzanie...',
['35'] = 'Twoje urządzenie jest tymczasowo niedostępne...',
['36'] = 'Nie znaleziono żadnych urządzeń!',
['37'] = 'Wstrzymuję odtwarzanie...',
['38'] = 'Trwa odtwarzanie',
['39'] = 'Losuję kolejność odtwarzania...',
['40'] = 'To nie jest poprawny poziom głośności. Podaj liczbę między 0 a 100.',
['41'] = 'Głośność została ustawiona na %s%%!',
['42'] = 'Ta wiadomość została wysłana przez wcześniejszą wersję pluginu, poproś o nową wysyłając /myspotify!'
},
['name'] = {
['1'] = 'Aktualnie reaguję na imię "%s" - aby to zmienić, użyj /name <imię>.',
['2'] = 'Moje nowe imię musi mieć długość od 2 do 32 znaków!',
['3'] = 'Moje nowe imię musi się składać tylko z liter i cyfr!',
['4'] = 'Będę od teraz reagować na "%s", zamiast "%s" - aby to zmienić, użyj /name <imię>.'
},
['netflix'] = {
['1'] = 'Czytaj więcej'
},
['news'] = {
['1'] = '"<code>%s</code>" isn\'t a valid Lua pattern.', --!
['2'] = 'Nie mogę pobrać listy źródeł.',
['3'] = '<b>Źródła newsów pasujących do wzorca</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Aktualnie dostępne źródła newsów których możesz używać w </b> /news<b>. Użyj</b> /nsources &lt;Lua_pattern&gt; <b>aby przeszukać tę listę pod kątem bardziej specyficznych rezultatów.</b>\n\n%s',
['5'] = 'Nie masz preferowanego źródła newsów. Użyj /setnews <źródło> aby ustawić. Przejrzyj listę źródeł używając /nsources, lub zawęź wyniki używając /nsources <Lua_pattern>.',
['6'] = 'Twoje aktualne preferowane źródło newsów to %s. Użyj /setnews <źródło> aby to zmienić. Przejrzyj listę źródeł używając /nsources, lub zawęź wyniki używając /nsources <Lua_pattern>.',
['7'] = 'Twoje preferowane źródło informacji jest już ustawione na %s! Użyj /news aby zobaczyć aktualną najlepszą historię.',
['8'] = 'Nieznane źródło newsów. Przejrzyj listę źródeł używając /nsources, lub zawęź wyniki używając /nsources <Lua_pattern>.',
['9'] = 'Twoje preferowane źródło newsów zostało zmienione na %s! Użyj /news aby zobaczyć aktualną najlepszą historię.',
['10'] = 'Nieznane źródło newsów. Przejrzyj listę źródeł używając /nsources. Jeśli masz ulubione źródło, użyj /setnews <źródło> żeby pobierać zeń newsy kiedy użyjesz /news bez argumentów.',
['11'] = 'Czytaj więcej'
},
['nick'] = {
['1'] = 'Twoja ksywka została zapomniana!',
['2'] = 'Twoja ksywka została ustawiona na "%s"!'
},
['ninegag'] = {
['1'] = 'Czytaj więcej'
},
['optout'] = {
['1'] = 'Pozwoliłeś na zbieranie danych które wysyłasz! Użyj /optout aby zrezygnować.',
['2'] = 'Zrezygnowałeś ze zbieranie danych które wysyłasz! Użyj /optin aby pozwolić na zbieranie danych.'
},
['paste'] = {
['1'] = 'Wybierz serwis do którego mam wysłać Twój tekst:'
},
['pay'] = {
['1'] = 'Masz aktualnie %s mattamonet. Zdobądź więcej wygrywając w kółko i krzyżyk, używając /game - wygrasz 100 mattamonet za każdą wygraną, i stracisz 50 za każdą przegraną.',
['2'] = 'Musisz użyć tej komendy w odpowiedzi do użytkownika któremu chcesz przelać mattamonety',
['3'] = 'Ile mettamonet chcesz przelać do %s?',
['4'] = 'Podana ilość musi być liczbą nieujemną.',
['5'] = 'Nie możesz przelać mattamonet do siebie!',
['6'] = 'Nie masz tylu mattamonet!',
['7'] = '%s mattamonet zostało przelanych do to %s. Masz teraz %s mattamonet.'
},
['pokedex'] = {
['1'] = 'Nazwa: %s\nID: %s\nTyp: %s\nOpis: %s'
},
['pin'] = {
['1'] = 'Nie utworzono wcześniej żadnej wiadomości do przypięcia. Użyj /pin <tekst> aby utworzyć. Użyj Markdown do formatowania.',
['2'] = 'Oto ostatnia wiadomość utworzona przez /pin.',
['3'] = 'Znaleziono wiadomość do przypięcia w bazie danych, ale wygląda na to że została ona usunięta z grupy. Utwórz nową używając /pin <tekst>. Użyj Markdown do formatowania.',
['4'] = 'Wystąpił błąd podczas aktualizowania wiadomości do przypięcia. Wprowadzony tekst mógł zawierać nieprawidłowy Markdown, bądź wiadomość do przypięcia została usunięta. Spróbuję wysłać nową wiadomość do przypięcia, znajdziesz ją poniżej - jeśli potrzebujesz ją zmodyfikować, po upewnieniu się że istnieje, użyj /pin <tekst>.',
['5'] = 'Tekst zawiera nieprawidłowy Markdown.',
['6'] = 'Kliknij tutaj aby zobaczyć zaktualizowaną przypiętą wiadomość.'
},
['prime'] = {
['1'] = 'Podaj liczbę między 1 a 99999.',
['2'] = '%s jest liczbą piewszą!',
['3'] = '%s NIE jest liczbą pierwszą...'
},
['promote'] = {
['1'] = 'Nie mogę awansować tego użytkownika na moderatora, ponieważ jest to moderator lub administrator tej grupy.',
['2'] = 'Nie mogę awansować tego użytkownika na moderatora, ponieważ opuścił on tę grupę.',
['3'] = 'Nie mogę awansować tego użytkownika na moderatora, ponieważ został on wyrzucony z tej grupy.'
},
['quote'] = {
['1'] = 'Ten użytkownik zrezygnował ze zbierania danych na jego temat',
- ['2'] = 'Brak zapisanych cytatów użytkownika %s%s! Odpisz na wiadomość poleceniem /save aby zapisać.'
+ ['2'] = 'Brak zapisanych cytatów użytkownika %s! Odpisz na wiadomość poleceniem /save aby zapisać.'
},
['randomsite'] = {
['1'] = 'Wygeneruj inną'
},
['randomword'] = {
['1'] = 'Wygeneruj inne',
['2'] = 'Twoje losowe słowo to <b>%s</b>!'
},
['report'] = {
['1'] = 'Please reply to the message you would like to report to the group\'s administrators.',
['2'] = 'You can\'t report your own messages, are you just trying to be funny?',
['3'] = '<b>%s needs help in %s!</b>',
['4'] = 'Click here to view the reported message.',
['5'] = 'I\'ve successfully reported that message to %s admin(s)!'
},
['rms'] = {
['1'] = 'Holy GNU!' --!
},
['save'] = {
['1'] = 'Ten użytkownik zrezygnował ze zbierania danych na jego temat',
- ['2'] = 'Wiadomość zapisana w bazie danych i dodana do listy możliwych odpowiedzi gdy /quote jest użyte w odpowiedzi do %s%s!'
+ ['2'] = 'Wiadomość zapisana w bazie danych i dodana do listy możliwych odpowiedzi gdy /quote jest użyte w odpowiedzi do %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s nie miał(a) tego na myśli!</i>',
['2'] = '%s\n\n<i>%s przyznał(a) się do porażki.</i>',
['3'] = '%s\n\n<i>%s nie ma pewności czy się nie pomylił(a)...</i>',
['4'] = 'Odczep się, ja <i>nigdy</i> się nie mylę!',
['5'] = '"<code>%s</code>" isn\'t a valid Lua pattern.', --!
['6'] = '<b>Hej, %s, miałeś na myśli:</b>\n<i>%s</i>',
['7'] = 'Tak',
['8'] = 'Nie',
['9'] = 'Nie wiem'
},
['setgrouplang'] = {
['1'] = 'Język tej grupy został ustawiony na %s!',
['2'] = 'Aktualnu język tej grupy to %s.\nPamiętaj że tłumaczenie może nie być kompletne. Aby zmienić język, użyj klawiatury poniżej:',
['3'] = 'Wspólny język dla tej grupy jest wyłączony. Aby to zmienić, użyj przycisku poniżej lub menu /administration.',
['4'] = 'Włącz',
['5'] = 'Wyłącz'
},
['setlang'] = {
['1'] = 'Twój język został ustawiony na %s!',
['2'] = 'Aktualnie wybrany język %s.\nPamiętaj że tłumaczenie może nie być kompletne. Jeśli chcesz zmienić język, użyj klawiatury poniżej:'
},
['setlink'] = {
['1'] = 'To nie jest poprawny URL.',
['2'] = 'Link został ustawiony!'
},
['setrules'] = {
['1'] = 'Niepoprawny Markdown.',
['2'] = 'Ustawienie zasad powiodło się!'
},
['setwelcome'] = {
['1'] = 'Co chcesz powiedzieć każdemu nowemu członkowi? Możesz używać Markdown do formatowania. (Wiadomość powitalną można wyłączyć w menu administracyjnym, pisząc /administration). Użyj $user_id aby wstawić ID dołączającego użytkownika, $chat_id aby wstawić ID grupy, $name aby wstawić the imię użytkownika, $title aby wstawić nazwę grupy i $username aby wstawić @username użytkownika (jeśli użytkownik nie ma @username, zostanie wstawione jego imię, więc najlepiej nie używać $name i $username koło siebie).',
['2'] = 'Twoja wiadomość jest niepoprawnie sformatowana, sprawdź swój Markdown i spróbuj ponownie.',
['3'] = 'Zapisano wiadomość powitalną dla %s!'
},
['share'] = {
['1'] = 'Udostępnij'
},
['shorten'] = {
['1'] = 'Wybierz skracacz linków używając przycisków poniżej:'
},
['shsh'] = {
['1'] = 'Nie mogę pobrać żadnych SHSH blobs dla tego ECID, upewnij się że jest poprawny i zapisałeś go używając https://tsssaver.1conan.com.',
['2'] = 'SHSH blobs dla tego urządzenia są dostępne dla następujących wersji iOS:\n',
['3'] = 'Pobierz .zip'
},
['statistics'] = {
['1'] = 'W tej grupie nie wysłano jeszcze żadnej wiadomości!',
['2'] = '<b>Statystyki w:</b> %s\n\n%s\n<b>Liczba wszystkich wiadomości:</b> %s',
['3'] = 'Zresetowano statystyki w tej grupie!',
['4'] = 'Błąd podczas resetowania statystyk, może zostały one zresetowane już wcześniej?'
},
['steam'] = {
['1'] = 'Twoja nazwa użytkownika na Steamie została ustawiona na "%s".',
['2'] = '"%s" nie jest poprawną nazwą użytkownika na Steamie.',
['3'] = '%s jest użytkownikiem Steama od %s, %s.\nData ostatniego wylogowania: %s, %s.\n<a href="%s">Profil na Steamie</a>',
['4'] = '%s, AKA "%s",'
},
['synonym'] = {
['1'] = 'Możesz użyć słowa <b>%s</b> zamiast %s.'
},
['thoughts'] = {
['1'] = '%s\n\nPozytywnie: <code>%s%% [%s]</code>\nNegatywnie: <code>%s%% [%s]</code>\nObojętnie: <code>%s%% [%s]</code>\nWszystkich przemyśleń: <code>%s</code>'
},
['tobinary'] = {
['1'] = 'Podaj ciąg znaków który chcesz skonwertować do liczby binarnej.'
},
['trust'] = {
['1'] = 'Nie mogę zaufać temu użytkownikowi, ponieważ jest to moderator lub administrator tej grupy.',
['2'] = 'Nie mogę zaufać temu użytkownikowi, ponieważ opuścił on tę grupę.',
['3'] = 'Nie mogę zaufać temu użytkownikowi, ponieważ został on wyrzucony już wcześniej.',
},
['unmute'] = {
['1'] = 'Komu mam pozwolić mówić? Podaj @username lub ID.',
['2'] = 'Nie mogę pozwolić mówić temu użytkownikowi, ponieważ nie został on wyciszony.',
['3'] = 'Nie mogę pozwolić mówić temu użytkownikowi, ponieważ jest to moderator lub administrator tej grupy.',
['4'] = 'Nie mogę pozwolić mówić temu użytkownikowi, ponieważ opuścił on tę grupę lub został z niej wyrzucony.',
},
['untrust'] = {
['1'] = 'Komu mam przestać ufać? Podaj @username lub ID.',
['2'] = 'Nie mogę przestać ufać temu użytkownikowi, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę przestać ufać temu użytkownikowi, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę przestać ufać temu użytkownikowi, ponieważ został on wyrzucony z tej grupy.',
},
['upload'] = {
['1'] = 'Odpowiedz na plik który chcesz ściągnąć na serwer. Plik musi ważyć <= 20 MB.',
['2'] = 'Plik zbyt duży, limit to 20 MB.',
['3'] = 'Nie można pobrać pliku, prawdopodobnie jest zbyt stary.',
['4'] = 'Wystąpił błąd podczas pobierania pliku.',
['5'] = 'Pobrano plik na serwer, ścieżka: <code>%s</code>.'
},
['version'] = {
['1'] = '@%s AKA %s `[%s]` działa pod kontrolą mattata %s, stworzona przez [Matthew Hesketh](https://t.me/wrxck). Kod źródłowy jest dostępny na [GitHubie](https://github.com/wrxck/mattata).'
},
['voteban'] = {
['1'] = 'Dla kogo mam otworzyć głosowanie nad banem? Podaj @username lub ID.',
['2'] = 'Nie mogę otworzyć głosowania nad banem tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę otworzyć głosowania nad banem tego użytkownika, ponieważ opuścił on tę grupę lub został z niej wyrzucony.',
['4'] = 'Czy %s [%s] powinien zostać zbanowany z %s? %s głosów za jest wymaganych aby zbanować, a %s głosów przeciw jest wymaganych aby zamknąć to głosowanie bez banowania.',
['5'] = 'Tak [%s]',
['6'] = 'Nie [%s]',
['7'] = 'Grupa zdecydowała. %s [%s] został zbanowany z %s ponieważ %s ludzi tak zagłosowało.',
['8'] = 'Osiągnięto wymaganą liczba głosów za banem, jednakże nie mogę zbanować %s - może opuścił(a) on(a) groupę, lub otrzymał(a) nominację na moderatora w międzyczasie, albo ja nie mam już uprawnień administratora.',
['9'] = 'Grupa zdecydowała. Nie banuję %s [%s] z %s ponieważ wymaganych %s ludzi zagłosowało przeciwko banowi.',
['10'] = 'Głosowałeś za banem dla %s [%s]!',
['11'] = 'Głos został cofnięty, możesz zagłosować ponownie.',
['12'] = 'Zagłosowałeś przeciwko banowi dla %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'Nie masz ustawionej lokalizacji. Użyj /setloc <lokalizacja> aby ustawić.',
['2'] = 'Aktualna temperatura: %s (odczuwalna: %s) w %s. %s'
},
['welcome'] = {
['1'] = 'Przeczytaj zasady'
},
['allowlist'] = {
['1'] = 'Kogo mam przestać ignorować? Podaj @username lub ID.',
['2'] = 'Nie mogę przestać ignorować tego użytkownika, ponieważ jest to moderator lub administrator tej grupy.',
['3'] = 'Nie mogę przestać ignorować tego użytkownika, ponieważ opuścił on tę grupę.',
['4'] = 'Nie mogę przestać ignorować tego użytkownika, ponieważ został on zbanowany.',
},
['wikipedia'] = {
['1'] = 'Czytaj więcej'
},
['youtube'] = {
['1'] = 'Poprzedni',
['2'] = 'Następny',
['3'] = 'Strona %s z %s'
}
}
\ No newline at end of file
diff --git a/languages/pt_br.lua b/languages/pt_br.lua
index 74f28fb..7030a4c 100644
--- a/languages/pt_br.lua
+++ b/languages/pt_br.lua
@@ -1,734 +1,734 @@
-- This is a language file for mattata
-- Language: pt-br
-- Author: American_Jesus
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Erro de conexão.',
['results'] = 'Eu não consegui encontrar nenhum resultado para isso.',
['supergroup'] = 'Este comando só pode ser usado em super grupos.',
['admin'] = 'Precisa ser moderador ou administrador neste grupo para usar este comando.',
['unknown'] = 'Eu não reconheço esse(s) utilizador(es). Se gostaria de me ensinar quem ele(s) são, encaminhe-me uma mensagem dele(s) para qualquer conversa que eu estou.',
['generic'] = 'Ocorreu um erro!',
['use'] = 'Você não tem permissão para usar isso!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Desculpe, receio que este elemento esteja disponível somente para utilizadores com um @utilizador público!',
['2'] = '%s voltou depois de estar AFK por %s!',
['3'] = 'Nota',
['4'] = '%s está agora AFK.%s'
},
['antispam'] = {
['1'] = 'Desabilitar',
['2'] = 'Habilitar',
['3'] = 'Desabilitar limite',
['4'] = 'Habilitar limite para %s',
['5'] = 'Todas as Configurações de Administração',
['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
['8'] = 'The maximum limit is 100.',
['9'] = 'The minimum limit is 1.',
['10'] = 'Modificar as configurações de anti-spam para %s abaixo:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'Ver no iTunes',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'Não consegui obter fotos de perfil para esse utilizador, verifique se especificou um nome de utilizador ou ID numérico válido.',
['2'] = 'Esse utilizador não tem fotos de perfil.',
['3'] = 'Esse utilizador não tem assim tantas de perfil!',
['4'] = 'That user has opted-out of data-collecting functionality, therefore I am not able to show you any of their profile photos.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Qual utilizador gostaria que eu bane? Pode especificar esse utilizador pelo seu @username ou ID numérico.',
['2'] = 'Não consigo banir esse utilizador porque ele é um moderador ou um administrador neste grupo.',
['3'] = 'Não consigo banir este utilizador porque ele saiu deste grupo.',
['4'] = 'Não consigo banir este utilizador porque ele já foi banido deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para banir esse utilizador. Corrija este problema e tente novamente.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Especifique um comando para executar!',
['2'] = 'Sucesso!'
},
['blocklist'] = {
['1'] = 'Qual utilizador gostaria de adicionar a lista negra? Pode especificar este utilizador pelo seu @username ou ID numérico.',
['2'] = 'Não consigo adicionar a lista negra esse utilizador porque ele é um moderador ou um administrador neste grupo.',
['3'] = 'Não consigo adicionar a lista negra esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo adicionar a lista negra esse utilizador porque ele já foi banido neste grupo.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s foi adicionado a lista negra, e vou deixar lá quem eu adicionar!',
['2'] = '%s é um utilizador, este comando é apenas para lista negras em conversas como grupos e canais!',
['3'] = '%s não parece ser uma conversa valida!'
},
['bugreport'] = {
['1'] = 'Sucesso! Seu relatório de bug foi enviado. O ID deste relatório é #%s.',
['2'] = 'Ocorreu um problema enquanto relatava esse bug! Ah, a ironia!'
},
['calc'] = {
['1'] = 'Clique para enviar o resultado.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'Eu realmente não posso descrever essa imagem!'
},
['cats'] = {
['1'] = 'Meow!'
},
['channel'] = {
['1'] = 'Não tem permissão para usar isso!',
['2'] = 'Parece já não ser um administrador nesse grupo!',
['3'] = 'Não consegui enviar a sua mensagem, tem certeza de que ainda tenho permissão para enviar mensagens nesse grupo?',
['4'] = 'A sua mensagem foi enviada!',
['5'] = 'Não consegui recuperar uma lista de administradores para desse grupo!',
['6'] = 'Não parece ser um administrador desse grupo!',
['7'] = 'Especifique a mensagem a enviar, utilizando a sintaxe /channel <canal> <mensagem>.',
['8'] = 'Tem certeza de que deseja enviar esta mensagem? É assim que vai aparecer:',
['9'] = 'Sim, tenho a certeza!',
['10'] = 'Essa mensagem contém formatação Markdown inválida! Corrija a sintaxe e tente novamente.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'Nenhum comando foi enviado neste chat!',
['2'] = '<b>Estatísticas de comandos para:</b> %s\n\n%s\n<b>Total de comandos enviados:</b> %s',
['3'] = 'As estatísticas de comandos para este chat foram resetadas!',
['4'] = 'Não consegui resetar as estatísticas de comandos para este chat. Talvez eu já as tenha resetado?'
},
['control'] = {
['1'] = 'Pfft, querias!',
['2'] = '%s está recarregando...'
},
['copypasta'] = {
['1'] = 'O texto respondido não deverá exceder %s caracteres!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'Eu não pude adicionar um contador a essa mensagem!'
},
['custom'] = {
['1'] = 'Sucesso! Essa mensagem será enviada toda vez que alguém usar %s!',
['2'] = 'O trigger "%s" não existe!',
['3'] = 'O trigger "%s" foi apagado!',
['4'] = 'Ainda não tem triggers personalizado definidos!',
['5'] = 'Comandos personalizados para %s:\n',
['6'] = 'Para criar um novo comando personalizado, use a seguinte sintaxe:\n/custom new #trigger <valor>. Para listar todos os triggers atuais, use /custom list. Para apagar um trigger, use /custom del #trigger.'
},
['delete'] = {
['1'] = 'Não consegui apagar essa mensagem. Talvez a mensagem seja muito antiga ou inexistente?'
},
['demote'] = {
['1'] = 'Qual utilizador gostaria que eu despromovesse? Pode especificar este utilizador pelo seu @username ou ID numérico.',
['2'] = 'Eu não posso despromover esse utilizador porque ele não é um moderador ou um administrador neste grupo.',
['3'] = 'Eu não posso despromover esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo despromover esse utilizador porque ele já foi expulso deste grupo.'
},
['doge'] = {
['1'] = 'Por favor, escreva o texto que deseja para Doge-ify. Cada sentença deve ser separada usando barras (/) ou novas linhas.'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['exec'] = {
['1'] = 'Selecione a linguagem em que gostaria de executar o seu código:',
['2'] = 'Ocorreu um erro! Tempo de ligação expirou. Está tentando me engasgar?',
['3'] = 'Selecionou "%s" – tem a certeza?',
['4'] = 'Voltar',
['5'] = 'Tenho certeza',
['6'] = 'Introduza um fragmento de código que pretende executar. Não precisa especificar a linguagem, faremos isso depois!',
['7'] = 'Selecione a linguagem em que gostaria de executar o seu código:'
},
['facebook'] = {
['1'] = 'Ocorreu um erro!',
['2'] = 'Escreva o nome de utilizador do Facebook do qual gostaria de obter a foto do perfil.',
['3'] = 'Visitas @%s no Facebook'
},
['fact'] = {
['1'] = 'Gerar Outro'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Pesquisou por:',
['2'] = 'Introduza uma consulta de pesquisa (Ou seja, o que quer que eu procure no Flickr, i.e. "Big Ben" mostrara uma fotografia do Big Ben em Londres).',
['3'] = 'Mais Resultados'
},
['game'] = {
['1'] = 'Total de vitórias: %s\nTotal de derrotas: %s\nBalanço: %s mattacoins',
['2'] = 'Entrar no Jogo',
['3'] = 'Este jogo já acabou!',
['4'] = 'Não é a sua vez!',
['5'] = 'Não faz parte deste jogo!',
['6'] = 'Não pode ser ai!',
['7'] = 'Já faz parte deste jogo!',
['8'] = 'Este jogo já começou!',
['9'] = '%s [%s] está a jogar contra %s [%s]\nE é a vez de %s\'s a jogar!',
['10'] = '%s ganhou o jogo contra %s!',
['11'] = '%s criou um jogo contra %s!',
['12'] = 'A espera pelo oponente...',
['13'] = 'Jogo do Galo',
['14'] = 'Clique para enviar o jogo para o seu grupo!',
['15'] = 'Estatísticas %s:\n',
['16'] = 'Jogar ao Jogo do Galo!'
},
['gblocklist'] = {
['1'] = 'Responda ao utilizador que deseja incluir na lista negra global ou especifique-o por nome de utilizador/ID.',
['2'] = 'Não conseguir obter informações sobre "%s", verifique se é um nome de utilizador/ID válido e tente novamente.',
['3'] = 'Isso é um %s, não um utilizador!'
},
['gif'] = {
['1'] = 'Introduza uma consulta de pesquisa (Que é, o que quer que eu procure no GIPHY, ex: "cat" irá mostrar um GIF de um gato).'
},
['gallowlist'] = {
['1'] = 'Responda ao utilizador que deseja incluir na lista branca global ou especifique-o por nome de utilizador/ID.',
['2'] = 'Não conseguir obter informações sobre "%s", verifique se é um nome de utilizador/ID válido e tente novamente.',
['3'] = 'Isso é um %s, não um utilizador!'
},
['hackernews'] = {
['1'] = 'Histórias principais de Hacker News:'
},
['help'] = {
['1'] = 'Nenhum resultado encontrado!',
['2'] = 'Não foram encontrados elementos que correspondam a "%s", Por favor, tente ser mais específico!',
['3'] = '\n\nArgumentos: <requer> [opcional]\n\nProcurar um elemento ou obter ajuda com um comando usando minha funcionalidade de pesquisa inline - apenas me mencione em qualquer grupo usando a sintaxe @%s <texto de procura>.',
['4'] = 'Anterior',
['5'] = 'Seguinte',
['6'] = 'Voltar',
['7'] = 'Procurar',
['8'] = 'Está na pagina %s de %s!',
['9'] = [[
Posso executar muitas ações administrativas nos seus grupos, basta adicionar-me como administrador e envie /administration para ajustar as configurações do seu grupo.
Aqui estão alguns comandos administrativos e um breve comentário sobre o que eles fazem:
• /pin <texto> - Envie uma mensagem formatada em Markdown que pode ser editada usando o mesmo comando com texto diferente, para evitar de ter que afixar novamente uma mensagem se não poder edita-la (o que acontece se a mensagem tiver mais de 48 horas)
• /ban - Banir um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /kick - Expulsar (banir e depois remover ban) um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /unban - Remover ban a um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /setrules <texto> - Defina o texto formatado como Markdown como as regras de grupo, que serão enviadas sempre que alguém usar /rules
]],
['10'] = [[
• /setwelcome - Defina o texto formatado como Markdown como uma mensagem de boas-vindas que será enviada sempre que um utilizador se juntar ao seu grupo (A mensagem de boas-vindas pode ser desativada no menu de administração, acessível via /administration). Pode usar espaços reservados para personalizar automaticamente a mensagem de boas-vindas para cada utilizador. Use $user_id para inserir o ID numérico do utilizador, $chat_id para inserir o ID numérico do grupo, $name para inserir o nome do utilizador, $title para inserir o título do grupo e $username para inserir o nome de utilizador do utilizador (Se o utilizador não tiver um @utilizador, o seu nome será usado em vez disso, para evitar é melhor usar isso com $name)
• /warn - Avisa um utilizador, e bane-o quando atingirem o número máximo de avisos
• /mod - Promove um utilizador respondendo a, dando acesso a comandos administrativos como /ban, /kick, /warn etc. (isto é útil quando não quer que alguém tenha a capacidade de apagar mensagens!)
• /demod - Despromove um utilizador respondendo a, removendo do seu estatuto de moderação e revogando sua capacidade de usar comandos administrativos
• /staff - Mostrar o criador, administradores e moderadores do grupo numa lista bem formatada
]],
['11'] = [[
• /report - Encaminha a mensagem de resposta para todos os administradores e os alerta da situação atual
• /setlink <URL> - Define o endereço do grupo para o URL fornecido, que será enviado sempre que alguém usar /link
• /links <texto> - Listas brancas todos os endereços Telegram encontrados no texto fornecido (inclui endereços de @utilizador)
]],
['12'] = 'Abaixo estão alguns links que pode achar úteis:',
['13'] = 'Desenvolvimento',
['14'] = 'Canal',
['15'] = 'Suporte',
['16'] = 'FAQ',
['17'] = 'Código Fonte',
['18'] = 'Doar',
['19'] = 'Rate',
['20'] = 'Registo de Administração',
['21'] = 'Definições de administrador',
['22'] = 'Plugins',
['23'] = [[
<b>Olá %s! O meu nome é %s, é um prazer conhece-lo</b> %s
Eu entendo muitos comandos, que você pode aprender mais sobre pressionando o botão "Comandos" usando o teclado acoplado.
%s <b>Dica:</b> Use o botão "Definições" para alterar o modo como eu trabalho%s!
%s <b>Find me useful, or just want to help?</b> Donations are very much appreciated, use /donate for more information!
]],
['24'] = 'em'
},
['id'] = {
['1'] = 'Desculpe, mas eu não reconheço esse utilizador. Ensine-me quem ele é, encaminhando uma mensagem dele a mim ou faça com que ele me enviem uma mensagem.',
['2'] = 'Grupo consultado:',
['3'] = 'Este grupo:',
['4'] = 'Clique para enviar o resultado!'
},
['imdb'] = {
['1'] = 'Anterior',
['2'] = 'Seguinte',
['3'] = 'Está na pagina %s de %s!'
},
['import'] = {
['1'] = 'Eu não reconheço esse grupo!',
['2'] = 'Isso não é um super grupo, portanto não consigo importar nenhuma configuração dele!',
['3'] = 'Configurações administrativas importadas e plugins alternados com sucesso de %s para %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s Ficheiro de Configuração: %s
%s Modo: %s
%s Porta TCP: %s
%s Versão: %s
%s Tempo de atividade: %s days
%s ID do Processo: %s
%s Keys Expiradas: %s
%s Contagem de Utilizadores: %s
%s Contagem de Grupos: %s
Sistema:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s no Instagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 sum: %s\nSHA1 sum: %s\nTamanho do ficheiro: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'Este firmware não está mais sendo assinado!',
['3'] = 'Este firmware ainda está sendo assinado!',
['4'] = 'Selecione o seu modelo:',
['5'] = 'Selecione a versão do firmware:',
['6'] = 'Selecione seu tipo de dispositivo:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'Essa conta foi encontrada nos seguintes fugas de informação:'
},
['itunes'] = {
['1'] = 'Nome:',
['2'] = 'Artista:',
['3'] = 'Álbum:',
['4'] = 'Faixa:',
['5'] = 'Disco:',
['6'] = 'A consulta original não pôde ser encontrada, provavelmente apagou a mensagem original.',
['7'] = 'A capa pode ser encontrada abaixo:',
['8'] = 'Introduza uma consulta de pesquisa (Ou seja, o que quer que eu procure no iTunes, Ex: "Green Day American Idiot" ira mostrar informações sobre o primeiro resultado para American Idiot dos Green Day).',
['9'] = 'Obter Capa do Álbum'
},
['kick'] = {
['1'] = 'Qual utilizador gostaria que eu expulsasse? Pode especificar este utilizador por seu @utilizador ou ID numérico.',
['2'] = 'Eu não consigo expulsar esse utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Eu não consigo expulsar esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo expulsar esse utilizador porque ele já foi expulso deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para expulsar esse utilizador. Corrija este problema e tente novamente.'
},
['lastfm'] = {
['1'] = '%s\'s utilizador de last.fm foi definido para "%s".',
['2'] = 'O seu utilizador last.fm foi esquecido!',
['3'] = 'Não tem atualmente um utilizado do last.fm definido!',
['4'] = 'Especifique o utilizador do last.fm ou defina com /fmset.',
['5'] = 'Nenhum histórico foi encontrado para este utilizador.',
['6'] = '%s está atualmente a ouvir:\n',
['7'] = '%s ouviu ultimamente:\n',
['8'] = 'Desconhecido',
['9'] = 'Clique para enviar o resultado.'
},
['location'] = {
['1'] = 'Não tem uma localização definida. O que nova localização gostaria que fosse?'
},
['logchat'] = {
['1'] = 'Escreva o nome de utilizador ou ID numérico do grupo no qual deseja registar todas as ações administrativas.',
['2'] = 'A verificar se o grupo é válido...',
['3'] = 'Desculpe, parece que especificou um grupo inválido, ou especificou um grupo que eu ainda não adicionado. Corrija e tente novamente.',
['4'] = 'Não pode definir um utilizador como o seu grupo de registo!',
['5'] = 'Não parece ser administrador nesse grupo!',
['6'] = 'Parece que eu já estou registar ações administrativas nesse grupo! Use /logchat para especificar um novo.',
['7'] = 'Esse grupo é válido, vou tentar e enviar uma mensagem de teste para ele, apenas para garantir que tenho permissão para falar!',
['8'] = 'Olá mundo - esta é uma mensagem de teste para verificar minhas permissões de escrita - se estiver a ler isto, então tudo correu bem!',
['9'] = 'Tudo feito! De agora em diante, Quaisquer ações administrativas neste grupo serão registadas em %s - para mudar o grupo que quer que eu registe ações administrativas, basta enviar /logchat.'
},
['lua'] = {
['1'] = 'Digite uma string de Lua para executar!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Mostrar letra',
['3'] = 'Introduza uma consulta de pesquisa (isto é, que musica/artista/letra quer que eu obtenha letras, Ex: "Green Day Basket Case" irá mostrar a letra para Basket Case dos Green Day).'
},
['minecraft'] = {
['1'] = '<b>%s mudou o seu utilizador %s vez</b>',
['2'] = '<b>%s mudou o seu utilizador %s vezes</b>',
['3'] = 'Anterior',
['4'] = 'Seguinte',
['5'] = 'Voltar',
['6'] = 'UUID',
['7'] = 'Avatar',
['8'] = 'Histórico de Utilizador',
['9'] = 'Selecione uma opção:',
['10'] = 'Escreva o nome de utilizador do jogador do Minecraft que gostaria de ver informações (Ex: enviando "Notch" irá ver as informações sobre o jogador Notch).',
['11'] = 'Os nomes de utilizadores do Minecraft têm entre 3 e 16 caracteres.'
},
['mute'] = {
['1'] = 'Que utilizador gostaria que ficasse silenciar? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo silenciar este utilizador porque já estão silenciados neste grupo.',
['3'] = 'Não consigo silenciar este utilizador porque ele é um moderador ou administrador neste grupo.',
['4'] = 'Não consigo silenciar este utilizador porque ele já deixou (ou foi expulso) deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para silenciar este utilizador. Corrija este problema e tente novamente.'
},
['myspotify'] = {
['1'] = 'Perfil',
['2'] = 'Seguindo',
['3'] = 'Recently Played',
['4'] = 'Currently Playing',
['5'] = 'Top Tracks',
['6'] = 'Top Artistas',
['7'] = 'You don\'t appear to be following any artists!',
['8'] = 'Seus Top Artistas',
['9'] = 'You don\'t appear to have any tracks in your library!',
['10'] = 'Your Top Tracks',
['11'] = 'You don\'t appear to be following any artists!',
['12'] = 'Artists You Follow',
['13'] = 'You don\'t appear to have recently played any tracks!',
['14'] = '<b>Recently Played</b>\n%s %s\n%s %s\n%s Listened to at %s:%s on %s/%s/%s.',
['15'] = 'The request has been accepted for processing, but the processing has not been completed.',
['16'] = 'You don\'t appear to be listening to anything right now!',
['17'] = 'Currently Playing',
['18'] = 'An error occured whilst re-authorising your Spotify account!',
['19'] = 'Successfully re-authorised your Spotify account! Processing your original request...',
['20'] = 'Re-authorising your Spotify account, please wait...',
['21'] = 'You need to authorise mattata in order to connect your Spotify account. Click [here](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) and press the green "OKAY" button to link mattata to your Spotify account. After you\'ve done that, send the link you were redirected to (it should begin with "%s", followed by a unique code) in reply to this message.',
['22'] = 'Playlists',
['23'] = 'Use Inline Mode',
['24'] = 'Lyrics',
['25'] = 'No devices were found.',
['26'] = 'You don\'t appear to have any playlists.',
['27'] = 'Your Playlists',
['28'] = '%s %s [%s tracks]',
['29'] = '%s %s [%s]\nSpotify %s user\n\n<b>Devices:</b>\n%s',
['30'] = 'Playing previous track...',
['31'] = 'You are not a premium user!',
['32'] = 'I could not find any devices.',
['33'] = 'Playing next track...',
['34'] = 'Resuming track...',
['35'] = 'Your device is temporarily unavailable...',
['36'] = 'No devices were found!',
['37'] = 'Pausing track...',
['38'] = 'Now playing',
['39'] = 'Shuffling your music...',
['40'] = 'That\'s not a valid volume. Please specify a number between 0 and 100.',
['41'] = 'The volume has been set to %s%%!',
['42'] = 'This message is using an old version of this plugin, please request a new one by sending /myspotify!'
},
['name'] = {
['1'] = 'O nome pelo qual respondo atualmente é "%s" - para alterar isso, use /name <texto> (onde <texto> é o nome pelo qual quer que eu responda).',
['2'] = 'Meu novo nome precisa ter entre 2 e 32 caracteres!',
['3'] = 'Meu nome só pode conter caracteres alfanuméricos!',
['4'] = 'Vou agora responder a "%s", em vez de "%s" - para alterar isso, use /name <texto> (onde <text> o nome a qual quer que eu responda).'
},
['netflix'] = {
['1'] = 'Ver mais.'
},
['news'] = {
['1'] = '"<code>%s</code>" não é um padrão Lua válido.',
['2'] = 'Eu não consegui obter uma lista de fontes.',
['3'] = '<b>Fontes de notícias encontradas correspondentes</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Aqui estão as fontes de notícias disponíveis que pode usar com</b> /news<b>. Use</b> /nsources &lt;pesquisa&gt; <b>para pesquisar a lista de fontes de notícias para um conjunto mais específico de resultados. As pesquisas são combinadas usando padrões Lua</b>\n\n%s',
['5'] = 'Não tem uma fonte de notícias preferida. Use /setnews <source> para definir uma. Veja a lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['6'] = 'A sua fonte de notícias preferida atual é %s. Use /setnews <source> para alterar isso. Veja a lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['7'] = 'A sua fonte preferida já está definida para %s! Use /news para ver a história principal atual.',
['8'] = 'Isso não é uma fonte de notícias válida. Exibir uma lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['9'] = 'A sua fonte de notícias preferida foi atualizada para %s! Use /news para ver a história principal atual.',
['10'] = 'Isso não é uma fonte válida, use /nsources para ver uma lista de fontes disponíveis. Se tem uma fonte preferida, use /setnews <fonte> Para receber automaticamente notícias daquela fonte enviada quando envie /news, sem quaisquer argumentos necessários.',
['11'] = 'Ver mais.'
},
['nick'] = {
['1'] = 'O seu nick foi esquecido!',
['2'] = 'O seu nick foi definido como "%s"!'
},
['optout'] = {
['1'] = 'Optou por enviar os seus dados! Use /optout para excluir.',
['2'] = 'Optou por não enviar os seus dados! Use /optin para enviar.'
},
['paste'] = {
['1'] = 'Selecione um serviço para enviar copia:'
},
['pin'] = {
['1'] = 'Não definiu ainda uma mensagem afixada. Use /pin <texto> para definir uma. A formatação Markdown é suportada.',
['2'] = 'Aqui está a última mensagem gerada usando /pin.',
['3'] = 'Eu encontrei uma mensagem afixada existente na base de dados, mas a mensagem que enviei parece ter sido apagada, e não consigo mais encontra-la. Pode definir uma nova usando /pin <texto>. A formatação Markdown é suportada.',
['4'] = 'Ocorreu um erro ao atualizar a mensagem afixada. Ou o texto inserido continha um sintaxe Markdown inválido, ou a mensagem afixada foi apagada. Eu estou agora tentar e enviar-lhe uma mensagem afixada nova, que será capaz de encontrar abaixo - se precisar modifica-lo, depois de garantir que a mensagem ainda existe, use /pin <texto>.',
['5'] = 'Eu não consegui enviar esse texto porque ele contém um sintaxe Markdown inválido.',
['6'] = 'Clique aqui para ver a mensagem afixada, atualizado para contendo o texto que me enviou.'
},
['pokedex'] = {
['1'] = 'Nome: %s\nID: %s\nTipo: %s\nDescrição: %s'
},
['promote'] = {
['1'] = 'Não consigo promover este utilizador porque é moderador ou administrador deste grupo.',
['2'] = 'Não consigo promover este utilizador porque já saiu deste grupo.',
['3'] = 'Não consigo promover esse utilizador porque ele já foi expulso deste grupo.'
},
['quote'] = {
['1'] = 'Este utilizador desativou a funcionalidade de armazenamento de dados.',
- ['2'] = 'Não há citações guardadas para %s%s! Pode guardar um usando /save em resposta a uma mensagem que enviam.'
+ ['2'] = 'Não há citações guardadas para %s! Pode guardar um usando /save em resposta a uma mensagem que enviam.'
},
['report'] = {
['1'] = 'Please reply to the message you would like to report to the group\'s administrators.',
['2'] = 'You can\'t report your own messages, are you just trying to be funny?',
['3'] = '<b>%s precisa de ajuda em %s!</b>',
['4'] = 'Click here to view the reported message.',
['5'] = 'I\'ve successfully reported that message to %s admin(s)!'
},
['save'] = {
['1'] = 'Este utilizador desativou a funcionalidade de armazenamento de dados.',
- ['2'] = 'Esta mensagem foi gravada na minha base de dados, e adicionado à lista de possíveis respostas para quando /quote è usado em resposta a %s%s!'
+ ['2'] = 'Esta mensagem foi gravada na minha base de dados, e adicionado à lista de possíveis respostas para quando /quote è usado em resposta a %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s não quis dizer isso!</i>',
['2'] = '%s\n\n<i>%s admitiu a sua derrota.</i>',
['3'] = '%s\n\n<i>%s não tem certeza se eles estavam errados...</i>',
['4'] = 'Vai-te lixar, <i>quando é que eu estou errado?</i>',
['5'] = '"<code>%s</code>" não é um modelo Lua válido.',
['6'] = '<b>%s quis dizer:</b>\n<i>%s</i>',
['7'] = 'Sim',
['8'] = 'Não',
['9'] = 'Não tenho certeza'
},
['setgrouplang'] = {
['1'] = 'O idioma deste grupo foi alterado para %s!',
['2'] = 'This group\'s language is currently %s.\nPlease note that some strings may not be translated as of yet. If you\'d like to change your language, select one using the keyboard below:',
['3'] = 'The option to force users to use the same language in this group is currently disabled. This setting should be toggled from /administration but, to make things easier for you, I\'ve included a button below.',
['4'] = 'Habilitar',
['5'] = 'Desabilitar'
},
['setlang'] = {
['1'] = 'O seu idioma foi definido para %s!',
['2'] = 'O seu idioma é atualmente %s.\nTome nota que algumas sequencias de caracteres podem não estar traduzidas. Se quiser alterar seu idioma, selecione um usando o teclado abaixo:'
},
['setlink'] = {
['1'] = 'Não é um URL valido.',
['2'] = 'Endereço definido com sucesso!'
},
['setrules'] = {
['1'] = 'Formato Markdown invalido.',
['2'] = 'Regras definidas com sucesso!'
},
['setwelcome'] = {
['1'] = 'O que mensagem gostaria de boas-vindas que fosse? O texto que especificar será formato em Markdown e enviado toda vez que um utilizador se juntar ao grupo (A mensagem de boas-vindas pode ser desativada no menu de administração, acessível via /administration). Pode usar espaços reservados para personalizar automaticamente a mensagem de boas-vindas para cada utilizador. Use $user_id para inserir o ID numérico do utilizador, $chat_id para inserir o ID numérico do grupo, $name para inserir o nome do utilizador, $title para inserir o título do grupo e $username para inserir o nome de utilizador do utilizador (Se o utilizador não tiver um @utilizador, o seu nome será usado em vez disso, para evitar é melhor usar isso com $name).',
['2'] = 'Ocorreu um erro ao formatar a mensagem, verifique a sintaxe de Markdown e tente novamente.',
['3'] = 'A mensagem de boas-vindas para %s foi atualizada com sucesso!'
},
['share'] = {
['1'] = 'Partilhar'
},
['shorten'] = {
['1'] = 'Selecione um URL shortener usando os botões abaixo:'
},
['shsh'] = {
['1'] = 'Eu não consegui obter qualquer blobs SHSH para esse ECID, assegure-se de que é válido e os guardou usando https://tsssaver.1conan.com.',
['2'] = 'Os blobs SHSH para esse dispositivo estão disponíveis para as seguintes versões do iOS:\n',
['3'] = 'Transferir .zip'
},
['statistics'] = {
['1'] = 'No messages have been sent in this chat!',
['2'] = '<b>Statistics for:</b> %s\n\n%s\n<b>Total messages sent:</b> %s',
['3'] = 'The statistics for this chat have been reset!',
['4'] = 'I could not reset the statistics for this chat. Perhaps they have already been reset?'
},
['steam'] = {
['1'] = 'O seu nome de utilizador do Steam foi definido para "%s".',
['2'] = '"%s" não é um nome de utilizador Steam valido.',
['3'] = '%s é utilizador do Steam desde %s, em %s. Desligou a ultima vez %s, em %s. Clique <a href="%s">aqui</a> para ver o perfil no Steam.',
['4'] = '%s, AKA "%s",'
},
['trust'] = {
['1'] = 'I cannot trust this user because they are a moderator or an administrator of this chat.',
['2'] = 'I cannot trust this user because they have already left this chat.',
['3'] = 'I cannot trust this user because they have already been kicked from this chat.'
},
['unmute'] = {
['1'] = 'Que utilizador gostaria que removesse silenciar? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo remover silenciar a este utilizador porque não está atualmente silenciado neste grupo.',
['3'] = 'Não consigo remover silenciar a este utilizador porque ele é um moderador ou administrador neste grupo.',
['4'] = 'Não consigo remover silenciar a este utilizador porque ele já deixou (ou foi expulso) deste grupo.',
},
['untrust'] = {
['1'] = 'Which user would you like me to untrust? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot untrust this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot untrust this user because they have already left this chat.',
['4'] = 'I cannot untrust this user because they have already been kicked from this chat.'
},
['upload'] = {
['1'] = 'Responda a mensagem do ficheiro que pretende transferir para o servidor. Deve ser <= 20 MB.',
['2'] = 'Ficheiro é demasiado grande. Deve ser <= 20 MB.',
['3'] = 'Não consegui obter esse ficheiro, é provavelmente muito antigo.',
['4'] = 'Ocorreu um erro ao recuperar esse ficheiro.',
['5'] = 'Ficheiro transferido para o servidor com sucesso - pode ser encontrado em <code>%s</code>!'
},
['voteban'] = {
['1'] = 'Qual utilizador gostaria de abrir uma votação para banir? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo criar uma votação para este utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Não consigo criar uma votação para este utilizador porque ele já deixaram (ou foi expulso) deste grupo.',
['4'] = '%s [%s] deve ser banido por %s? %s voto a favor para banir imediatamente, e %s votos contra para fechar esta votação.',
['5'] = 'Sim [%s]',
['6'] = 'Não [%s]',
['7'] = 'O povo falou. E baniu %s [%s] por %s porque %s pessoas votaram a favor.',
['8'] = 'O montante de votos a favor necessários foi atingido, no entanto, não foi pode banir %s - talvez deixou o grupo ou foi promovido desde que abrimos a votação para banir? É isso ou não tenho mais os privilégios administrativos necessários para executar esta ação!',
['9'] = 'O povo falou. E não foi banido %s [%s] por %s porque %s pessoa decidiram votar contra.',
['10'] = 'Votou a favor na decisão de banir %s [%s]!',
['11'] = 'O seu voto atual foi retirado, use os botões novamente para reenviar o seu voto.',
['12'] = 'Votou contra na decisão de banir %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'Ainda não tem uma localização definida. Use /setloc <localização> para definir uma.',
['2'] = 'Está atualmente %s (parece %s) em %s. %s'
},
['welcome'] = {
['1'] = 'Regras do Grupo'
},
['allowlist'] = {
['1'] = 'Qual utilizador gostaria de adicionar à white-list? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo adicionar à white-list esse utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Não consigo adicionar à white-list esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo adicionar à white-list esse utilizador porque ele já foi banido neste grupo.'
},
['wikipedia'] = {
['1'] = 'Ver mais.'
},
['youtube'] = {
['1'] = 'Anterior',
['2'] = 'Seguinte',
['3'] = 'Está na pagina %s de %s!'
}
}
\ No newline at end of file
diff --git a/languages/pt_pt.lua b/languages/pt_pt.lua
index 8e84a71..3114fbd 100644
--- a/languages/pt_pt.lua
+++ b/languages/pt_pt.lua
@@ -1,734 +1,734 @@
-- This is a language file for mattata
-- Language: pt-pt
-- Author: American_Jesus
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Erro de ligação.',
['results'] = 'Eu não consegui encontrar nenhum resultado para isso.',
['supergroup'] = 'Este comando só pode ser usado em super grupos.',
['admin'] = 'Precisa ser moderador ou administrador neste grupo para usar este comando.',
['unknown'] = 'Eu não reconheço esse(s) utilizador(es). Se gostaria de me ensinar quem ele(s) são, encaminhe-me uma mensagem dele(s) para qualquer conversa que eu estou.',
['generic'] = 'Ocorreu um erro!',
['use'] = 'You are not allowed to use this!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Desculpe, receio que este elemento esteja disponível somente para utilizadores com um @utilizador público!',
['2'] = '%s voltou depois de estar AFK por %s!',
['3'] = 'Nota',
['4'] = '%s está agora AFK.%s'
},
['antispam'] = {
['1'] = 'Disable',
['2'] = 'Enable',
['3'] = 'Disable limit',
['4'] = 'Enable limits on %s',
['5'] = 'All Administration Settings',
['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
['8'] = 'The maximum limit is 100.',
['9'] = 'The minimum limit is 1.',
['10'] = 'Modify the anti-spam settings for %s below:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'Ver no iTunes',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'Não consegui obter fotos de perfil para esse utilizador, verifique se especificou um nome de utilizador ou ID numérico válido.',
['2'] = 'Esse utilizador não tem fotos de perfil.',
['3'] = 'Esse utilizador não tem assim tantas de perfil!',
['4'] = 'That user has opted-out of data-collecting functionality, therefore I am not able to show you any of their profile photos.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Qual utilizador gostaria que eu bane? Pode especificar esse utilizador pelo seu @username ou ID numérico.',
['2'] = 'Não consigo banir esse utilizador porque ele é um moderador ou um administrador neste grupo.',
['3'] = 'Não consigo banir este utilizador porque ele saiu deste grupo.',
['4'] = 'Não consigo banir este utilizador porque ele já foi banido deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para banir esse utilizador. Corrija este problema e tente novamente.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Especifique um comando para executar!',
['2'] = 'Sucesso!'
},
['blocklist'] = {
['1'] = 'Qual utilizador gostaria de adicionar a lista negra? Pode especificar este utilizador pelo seu @username ou ID numérico.',
['2'] = 'Não consigo adicionar a lista negra esse utilizador porque ele é um moderador ou um administrador neste grupo.',
['3'] = 'Não consigo adicionar a lista negra esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo adicionar a lista negra esse utilizador porque ele já foi banido neste grupo.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s foi adicionado a lista negra, e vou deixar lá quem eu adicionar!',
['2'] = '%s é um utilizador, este comando é apenas para lista negras em conversas como grupos e canais!',
['3'] = '%s não parece ser uma conversa valida!'
},
['bugreport'] = {
['1'] = 'Sucesso! Seu relatório de bug foi enviado. O ID deste relatório é #%s.',
['2'] = 'Ocorreu um problema enquanto relatava esse bug! Ah, a ironia!'
},
['calc'] = {
['1'] = 'Clique para enviar o resultado.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'Eu realmente não posso descrever essa imagem!'
},
['cats'] = {
['1'] = 'Meow!'
},
['channel'] = {
['1'] = 'Não tem permissão para usar isso!',
['2'] = 'Parece já não ser um administrador nesse grupo!',
['3'] = 'Não consegui enviar a sua mensagem, tem certeza de que ainda tenho permissão para enviar mensagens nesse grupo?',
['4'] = 'A sua mensagem foi enviada!',
['5'] = 'Não consegui recuperar uma lista de administradores para desse grupo!',
['6'] = 'Não parece ser um administrador desse grupo!',
['7'] = 'Especifique a mensagem a enviar, utilizando a sintaxe /channel <canal> <mensagem>.',
['8'] = 'Tem certeza de que deseja enviar esta mensagem? É assim que vai aparecer:',
['9'] = 'Sim, Tenho a certeza!',
['10'] = 'Essa mensagem contém formatação Markdown inválido! Corrija a sintaxe e tente novamente.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'No commands have been sent in this chat!',
['2'] = '<b>Command statistics for:</b> %s\n\n%s\n<b>Total commands sent:</b> %s',
['3'] = 'The command statistics for this chat have been reset!',
['4'] = 'I could not reset the command statistics for this chat. Perhaps they have already been reset?'
},
['control'] = {
['1'] = 'Pfft, querias!',
['2'] = '%s está a recarregar...'
},
['copypasta'] = {
['1'] = 'O texto respondido não deverá exceder %s caracteres!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'Eu não pude adicionar um contador a essa mensagem!'
},
['custom'] = {
['1'] = 'Sucesso! Essa mensagem será enviada toda vez que alguém usar %s!',
['2'] = 'O trigger "%s" não existe!',
['3'] = 'O trigger "%s" foi apagado!',
['4'] = 'Ainda não tem triggers personalizado definidos!',
['5'] = 'Comandos personalizados para %s:\n',
['6'] = 'Para criar um novo comando personalizado, use a seguinte sintaxe:\n/custom new #trigger <valor>. Para listar todos os triggers atuais, use /custom list. Para apagar um trigger, use /custom del #trigger.'
},
['delete'] = {
['1'] = 'Não consegui apagar essa mensagem. Talvez a mensagem seja muito antiga ou inexistente?'
},
['demote'] = {
['1'] = 'Qual utilizador gostaria que eu despromovesse? Pode especificar este utilizador pelo seu @username ou ID numérico.',
['2'] = 'Eu não posso despromover esse utilizador porque ele não é um moderador ou um administrador neste grupo.',
['3'] = 'Eu não posso despromover esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo despromover esse utilizador porque ele já foi expulso deste grupo.'
},
['doge'] = {
['1'] = 'Por favor, escreva o texto que deseja para Doge-ify. Cada sentença deve ser separada usando barras (/) ou novas linhas.'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['exec'] = {
['1'] = 'Selecione a linguagem em que gostaria de executar o seu código:',
['2'] = 'Ocurreu um erro! Tempo de ligação expirou. Está a tentar fazer-me lag?',
['3'] = 'Selecionou "%s" – tem a certeza?',
['4'] = 'Voltar',
['5'] = 'Tenho a certeza',
['6'] = 'Introduza um fragmento de código que pretende executar. Não precisa especificar a linguagem, faremos isso depois!',
['7'] = 'Selecione a linguagem em que gostaria de executar o seu código:'
},
['facebook'] = {
['1'] = 'Ocorreu um erro!',
['2'] = 'Escreva o nome de utilizador do Facebook do qual gostaria de obter a foto do perfil.',
['3'] = 'Visitas @%s no Facebook'
},
['fact'] = {
['1'] = 'Gerar Outro'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Pesquisou por:',
['2'] = 'Introduza uma consulta de pesquisa (Ou seja, o que quer que eu procure no Flickr, i.e. "Big Ben" mostrara uma fotografia do Big Ben em Londres).',
['3'] = 'Mais Resultados'
},
['game'] = {
['1'] = 'Total de vitórias: %s\nTotal de derrotas: %s\nBalanço: %s mattacoins',
['2'] = 'Entrar no Jogo',
['3'] = 'Este jogo já acabou!',
['4'] = 'Não é a sua vez!',
['5'] = 'Não faz parte deste jogo!',
['6'] = 'Não pode ser ai!',
['7'] = 'Já faz parte deste jogo!',
['8'] = 'Este jogo já começou!',
['9'] = '%s [%s] está a jogar contra %s [%s]\nE é a vez de %s\'s a jogar!',
['10'] = '%s ganhou o jogo contra %s!',
['11'] = '%s criou um jogo contra %s!',
['12'] = 'A espera pelo oponente...',
['13'] = 'Jogo do Galo',
['14'] = 'Clique para enviar o jogo para o seu grupo!',
['15'] = 'Estatísticas %s:\n',
['16'] = 'Jogar ao Jogo do Galo!'
},
['gblocklist'] = {
['1'] = 'Responda ao utilizador que deseja incluir na lista negra global ou especifique-o por nome de utilizador/ID.',
['2'] = 'Não conseguir obter informações sobre "%s", verifique se é um nome de utilizador/ID válido e tente novamente.',
['3'] = 'Isso é um %s, não um utilizador!'
},
['gif'] = {
['1'] = 'Introduza uma consulta de pesquisa (Que é, o que quer que eu procure no GIPHY, ex: "cat" irá mostrar um GIF de um gato).'
},
['gallowlist'] = {
['1'] = 'Responda ao utilizador que deseja incluir na lista branca global ou especifique-o por nome de utilizador/ID.',
['2'] = 'Não conseguir obter informações sobre "%s", verifique se é um nome de utilizador/ID válido e tente novamente.',
['3'] = 'Isso é um %s, não um utilizador!'
},
['hackernews'] = {
['1'] = 'Histórias principais de Hacker News:'
},
['help'] = {
['1'] = 'Nenhum resultado encontrado!',
['2'] = 'Não foram encontrados elementos que correspondam a "%s", Por favor, tente ser mais específico!',
['3'] = '\n\nArgumentos: <requer> [opcional]\n\nProcurar um elemento ou obter ajuda com um comando usando minha funcionalidade de pesquisa inline - apenas me mencione em qualquer grupo usando a sintaxe @%s <texto de procura>.',
['4'] = 'Anterior',
['5'] = 'Seguinte',
['6'] = 'Voltar',
['7'] = 'Procurar',
['8'] = 'Está na pagina %s de %s!',
['9'] = [[
Posso executar muitas ações administrativas nos seus grupos, basta adicionar-me como administrador e envie /administration para ajustar as configurações do seu grupo.
Aqui estão alguns comandos administrativos e um breve comentário sobre o que eles fazem:
• /pin <texto> - Envie uma mensagem formatada em Markdown que pode ser editada usando o mesmo comando com texto diferente, para evitar de ter que afixar novamente uma mensagem se não poder edita-la (o que acontece se a mensagem tiver mais de 48 horas)
• /ban - Banir um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /kick - Expulsar (banir e depois remover ban) um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /unban - Remover ban a um utilizador respondendo a uma de suas mensagens ou especificando com o nome de utilizador/ID
• /setrules <texto> - Defina o texto formatado como Markdown como as regras de grupo, que serão enviadas sempre que alguém usar /rules
]],
['10'] = [[
• /setwelcome - Defina o texto formatado como Markdown como uma mensagem de boas-vindas que será enviada sempre que um utilizador se juntar ao seu grupo (A mensagem de boas-vindas pode ser desativada no menu de administração, acessível via /administration). Pode usar espaços reservados para personalizar automaticamente a mensagem de boas-vindas para cada utilizador. Use $user_id para inserir o ID numérico do utilizador, $chat_id para inserir o ID numérico do grupo, $name para inserir o nome do utilizador, $title para inserir o título do grupo e $username para inserir o nome de utilizador do utilizador (Se o utilizador não tiver um @utilizador, o seu nome será usado em vez disso, para evitar é melhor usar isso com $name)
• /warn - Avisa um utilizador, e bane-o quando atingirem o número máximo de avisos
• /mod - Promove um utilizador respondendo a, dando acesso a comandos administrativos como /ban, /kick, /warn etc. (isto é útil quando não quer que alguém tenha a capacidade de apagar mensagens!)
• /demod - Despromove um utilizador respondendo a, removendo do seu estatuto de moderação e revogando sua capacidade de usar comandos administrativos
• /staff - Mostrar o criador, administradores e moderadores do grupo numa lista bem formatada
]],
['11'] = [[
• /report - Encaminha a mensagem de resposta para todos os administradores e os alerta da situação atual
• /setlink <URL> - Define o endereço do grupo para o URL fornecido, que será enviado sempre que alguém usar /link
• /links <texto> - Listas brancas todos os endereços Telegram encontrados no texto fornecido (inclui endereços de @utilizador)
]],
['12'] = 'Abaixo estão alguns links que pode achar úteis:',
['13'] = 'Desenvolvimento',
['14'] = 'Canal',
['15'] = 'Suporte',
['16'] = 'FAQ',
['17'] = 'Código Fonte',
['18'] = 'Doar',
['19'] = 'Rate',
['20'] = 'Registo de Administração',
['21'] = 'Definições de administrador',
['22'] = 'Plugins',
['23'] = [[
<b>Olá %s! O meu nome é %s, é um prazer conhece-lo</b> %s
Eu entendo muitos comandos, que você pode aprender mais sobre pressionando o botão "Comandos" usando o teclado acoplado.
%s <b>Dica:</b> Use o botão "Definições" para alterar o modo como eu trabalho%s!
%s <b>Find me useful, or just want to help?</b> Donations are very much appreciated, use /donate for more information!
]],
['24'] = 'em'
},
['id'] = {
['1'] = 'Desculpe, mas eu não reconheço esse utilizador. Ensine-me quem ele é, encaminhando uma mensagem dele a mim ou faça com que ele me enviem uma mensagem.',
['2'] = 'Grupo consultado:',
['3'] = 'Este grupo:',
['4'] = 'Clique para enviar o resultado!'
},
['imdb'] = {
['1'] = 'Anterior',
['2'] = 'Seguinte',
['3'] = 'Está na pagina %s de %s!'
},
['import'] = {
['1'] = 'Eu não reconheço esse grupo!',
['2'] = 'Isso não é um super grupo, portanto não consigo importar nenhuma configuração dele!',
['3'] = 'Configurações administrativas importadas e plugins alternados com sucesso de %s para %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s Ficheiro de Configuração: %s
%s Modo: %s
%s Porta TCP: %s
%s Versão: %s
%s Tempo de atividade: %s days
%s ID do Processo: %s
%s Keys Expiradas: %s
%s Contagem de Utilizadores: %s
%s Contagem de Grupos: %s
Sistema:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s no Instagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 sum: %s\nSHA1 sum: %s\nTamanho do ficheiro: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'Este firmware não está mais sendo assinado!',
['3'] = 'Este firmware ainda está sendo assinado!',
['4'] = 'Selecione o seu modelo:',
['5'] = 'Selecione a versão do firmware:',
['6'] = 'Selecione seu tipo de dispositivo:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'Essa conta foi encontrada nos seguintes fugas de informação:'
},
['itunes'] = {
['1'] = 'Nome:',
['2'] = 'Artista:',
['3'] = 'Álbum:',
['4'] = 'Faixa:',
['5'] = 'Disco:',
['6'] = 'A consulta original não pôde ser encontrada, provavelmente apagou a mensagem original.',
['7'] = 'A capa pode ser encontrada abaixo:',
['8'] = 'Introduza uma consulta de pesquisa (Ou seja, o que quer que eu procure no iTunes, Ex: "Green Day American Idiot" ira mostrar informações sobre o primeiro resultado para American Idiot dos Green Day).',
['9'] = 'Obter Capa do Álbum'
},
['kick'] = {
['1'] = 'Qual utilizador gostaria que eu expulsasse? Pode especificar este utilizador por seu @utilizador ou ID numérico.',
['2'] = 'Eu não consigo expulsar esse utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Eu não consigo expulsar esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo expulsar esse utilizador porque ele já foi expulso deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para expulsar esse utilizador. Corrija este problema e tente novamente.'
},
['lastfm'] = {
['1'] = '%s\'s utilizador de last.fm foi definido para "%s".',
['2'] = 'O seu utilizador last.fm foi esquecido!',
['3'] = 'Não tem atualmente um utilizado do last.fm definido!',
['4'] = 'Especifique o utilizador do last.fm ou defina com /fmset.',
['5'] = 'Nenhum histórico foi encontrado para este utilizador.',
['6'] = '%s está atualmente a ouvir:\n',
['7'] = '%s ouviu ultimamente:\n',
['8'] = 'Desconhecido',
['9'] = 'Clique para enviar o resultado.'
},
['location'] = {
['1'] = 'Não tem uma localização definida. O que nova localização gostaria que fosse?'
},
['logchat'] = {
['1'] = 'Escreva o nome de utilizador ou ID numérico do grupo no qual deseja registar todas as ações administrativas.',
['2'] = 'A verificar se o grupo é válido...',
['3'] = 'Desculpe, parece que especificou um grupo inválido, ou especificou um grupo que eu ainda não adicionado. Corrija e tente novamente.',
['4'] = 'Não pode definir um utilizador como o seu grupo de registo!',
['5'] = 'Não parece ser administrador nesse grupo!',
['6'] = 'Parece que eu já estou registar ações administrativas nesse grupo! Use /logchat para especificar um novo.',
['7'] = 'Esse grupo é válido, vou tentar e enviar uma mensagem de teste para ele, apenas para garantir que tenho permissão para falar!',
['8'] = 'Olá mundo - esta é uma mensagem de teste para verificar minhas permissões de escrita - se estiver a ler isto, então tudo correu bem!',
['9'] = 'Tudo feito! De agora em diante, Quaisquer ações administrativas neste grupo serão registadas em %s - para mudar o grupo que quer que eu registe ações administrativas, basta enviar /logchat.'
},
['lua'] = {
['1'] = 'Digite uma string de Lua para executar!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Mostrar letra',
['3'] = 'Introduza uma consulta de pesquisa (isto é, que musica/artista/letra quer que eu obtenha letras, Ex: "Green Day Basket Case" irá mostrar a letra para Basket Case dos Green Day).'
},
['minecraft'] = {
['1'] = '<b>%s mudou o seu utilizador %s vez</b>',
['2'] = '<b>%s mudou o seu utilizador %s vezes</b>',
['3'] = 'Anterior',
['4'] = 'Seguinte',
['5'] = 'Voltar',
['6'] = 'UUID',
['7'] = 'Avatar',
['8'] = 'Histórico de Utilizador',
['9'] = 'Selecione uma opção:',
['10'] = 'Escreva o nome de utilizador do jogador do Minecraft que gostaria de ver informações (Ex: enviando "Notch" irá ver as informações sobre o jogador Notch).',
['11'] = 'Os nomes de utilizadores do Minecraft têm entre 3 e 16 caracteres.'
},
['mute'] = {
['1'] = 'Que utilizador gostaria que ficasse silenciar? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo silenciar este utilizador porque já estão silenciados neste grupo.',
['3'] = 'Não consigo silenciar este utilizador porque ele é um moderador ou administrador neste grupo.',
['4'] = 'Não consigo silenciar este utilizador porque ele já deixou (ou foi expulso) deste grupo.',
['5'] = 'Eu preciso ter permissões administrativas para silenciar este utilizador. Corrija este problema e tente novamente.'
},
['myspotify'] = {
['1'] = 'Profile',
['2'] = 'Following',
['3'] = 'Recently Played',
['4'] = 'Currently Playing',
['5'] = 'Top Tracks',
['6'] = 'Top Artists',
['7'] = 'You don\'t appear to be following any artists!',
['8'] = 'Your Top Artists',
['9'] = 'You don\'t appear to have any tracks in your library!',
['10'] = 'Your Top Tracks',
['11'] = 'You don\'t appear to be following any artists!',
['12'] = 'Artists You Follow',
['13'] = 'You don\'t appear to have recently played any tracks!',
['14'] = '<b>Recently Played</b>\n%s %s\n%s %s\n%s Listened to at %s:%s on %s/%s/%s.',
['15'] = 'The request has been accepted for processing, but the processing has not been completed.',
['16'] = 'You don\'t appear to be listening to anything right now!',
['17'] = 'Currently Playing',
['18'] = 'An error occured whilst re-authorising your Spotify account!',
['19'] = 'Successfully re-authorised your Spotify account! Processing your original request...',
['20'] = 'Re-authorising your Spotify account, please wait...',
['21'] = 'You need to authorise mattata in order to connect your Spotify account. Click [here](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) and press the green "OKAY" button to link mattata to your Spotify account. After you\'ve done that, send the link you were redirected to (it should begin with "%s", followed by a unique code) in reply to this message.',
['22'] = 'Playlists',
['23'] = 'Use Inline Mode',
['24'] = 'Lyrics',
['25'] = 'No devices were found.',
['26'] = 'You don\'t appear to have any playlists.',
['27'] = 'Your Playlists',
['28'] = '%s %s [%s tracks]',
['29'] = '%s %s [%s]\nSpotify %s user\n\n<b>Devices:</b>\n%s',
['30'] = 'Playing previous track...',
['31'] = 'You are not a premium user!',
['32'] = 'I could not find any devices.',
['33'] = 'Playing next track...',
['34'] = 'Resuming track...',
['35'] = 'Your device is temporarily unavailable...',
['36'] = 'No devices were found!',
['37'] = 'Pausing track...',
['38'] = 'Now playing',
['39'] = 'Shuffling your music...',
['40'] = 'That\'s not a valid volume. Please specify a number between 0 and 100.',
['41'] = 'The volume has been set to %s%%!',
['42'] = 'This message is using an old version of this plugin, please request a new one by sending /myspotify!'
},
['name'] = {
['1'] = 'O nome a qual respondo atualmente é "%s" - para alterar isso, use /name <texto> (onde <texto> o nome a qual quer que eu responda).',
['2'] = 'Meu novo nome precisa ter entre 2 e 32 caracteres!',
['3'] = 'Meu nome só pode conter caracteres alfanuméricos!',
['4'] = 'Vou agora responder a "%s", em vez de "%s" - para alterar isso, use /name <texto> (onde <text> o nome a qual quer que eu responda).'
},
['netflix'] = {
['1'] = 'Ver mais.'
},
['news'] = {
['1'] = '"<code>%s</code>" não é um padrão Lua válido.',
['2'] = 'Eu não consegui obter uma lista de fontes.',
['3'] = '<b>Fontes de notícias encontradas correspondentes</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Aqui estão as fontes de notícias disponíveis que pode usar com</b> /news<b>. Use</b> /nsources &lt;pesquisa&gt; <b>para pesquisar a lista de fontes de notícias para um conjunto mais específico de resultados. As pesquisas são combinadas usando padrões Lua</b>\n\n%s',
['5'] = 'Não tem uma fonte de notícias preferida. Use /setnews <source> para definir uma. Veja a lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['6'] = 'A sua fonte de notícias preferida atual é %s. Use /setnews <source> para alterar isso. Veja a lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['7'] = 'A sua fonte preferida já está definida para %s! Use /news para ver a história principal atual.',
['8'] = 'Isso não é uma fonte de notícias válida. Exibir uma lista de fontes usando /nsources, ou restringir os resultados usando /nsources <pesquisa>.',
['9'] = 'A sua fonte de notícias preferida foi atualizada para %s! Use /news para ver a história principal atual.',
['10'] = 'Isso não é uma fonte válida, use /nsources para ver uma lista de fontes disponíveis. Se tem uma fonte preferida, use /setnews <fonte> Para receber automaticamente notícias daquela fonte enviada quando envie /news, sem quaisquer argumentos necessários.',
['11'] = 'Ver mais.'
},
['nick'] = {
['1'] = 'O seu nick foi esquecido!',
['2'] = 'O seu nick foi definido como "%s"!'
},
['optout'] = {
['1'] = 'Optou por enviar os seus dados! Use /optout para excluir.',
['2'] = 'Optou por não enviar os seus dados! Use /optin para enviar.'
},
['paste'] = {
['1'] = 'Selecione um serviço para enviar copia:'
},
['pin'] = {
['1'] = 'Não definiu ainda uma mensagem afixada. Use /pin <texto> para definir uma. A formatação Markdown é suportada.',
['2'] = 'Aqui está a última mensagem gerada usando /pin.',
['3'] = 'Eu encontrei uma mensagem afixada existente na base de dados, mas a mensagem que enviei parece ter sido apagada, e não consigo mais encontra-la. Pode definir uma nova usando /pin <texto>. A formatação Markdown é suportada.',
['4'] = 'Ocorreu um erro ao atualizar a mensagem afixada. Ou o texto inserido continha um sintaxe Markdown inválido, ou a mensagem afixada foi apagada. Eu estou agora tentar e enviar-lhe uma mensagem afixada nova, que será capaz de encontrar abaixo - se precisar modifica-lo, depois de garantir que a mensagem ainda existe, use /pin <texto>.',
['5'] = 'Eu não consegui enviar esse texto porque ele contém um sintaxe Markdown inválido.',
['6'] = 'Clique aqui para ver a mensagem afixada, atualizado para contendo o texto que me enviou.'
},
['pokedex'] = {
['1'] = 'Nome: %s\nID: %s\nTipo: %s\nDescrição: %s'
},
['promote'] = {
['1'] = 'Não consigo promover este utilizador porque é moderador ou administrador deste grupo.',
['2'] = 'Não consigo promover este utilizador porque já saiu deste grupo.',
['3'] = 'Não consigo promover esse utilizador porque ele já foi expulso deste grupo.'
},
['quote'] = {
['1'] = 'Este utilizador desativou a funcionalidade de armazenamento de dados.',
- ['2'] = 'Não há citações guardadas para %s%s! Pode guardar um usando /save em resposta a uma mensagem que enviam.'
+ ['2'] = 'Não há citações guardadas para %s! Pode guardar um usando /save em resposta a uma mensagem que enviam.'
},
['report'] = {
['1'] = 'Please reply to the message you would like to report to the group\'s administrators.',
['2'] = 'You can\'t report your own messages, are you just trying to be funny?',
['3'] = '<b>%s needs help in %s!</b>',
['4'] = 'Click here to view the reported message.',
['5'] = 'I\'ve successfully reported that message to %s admin(s)!'
},
['save'] = {
['1'] = 'Este utilizador desativou a funcionalidade de armazenamento de dados.',
- ['2'] = 'Esta mensagem foi gravada na minha base de dados, e adicionado à lista de possíveis respostas para quando /quote è usado em resposta a %s%s!'
+ ['2'] = 'Esta mensagem foi gravada na minha base de dados, e adicionado à lista de possíveis respostas para quando /quote è usado em resposta a %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s não quis dizer isso!</i>',
['2'] = '%s\n\n<i>%s admitiu a sua derrota.</i>',
['3'] = '%s\n\n<i>%s não tem certeza se eles estavam errados...</i>',
['4'] = 'Vai-te lixar, <i>quando é que eu estou errado?</i>',
['5'] = '"<code>%s</code>" não é um modelo Lua válido.',
['6'] = '<b>%s quis dizer:</b>\n<i>%s</i>',
['7'] = 'Sim',
['8'] = 'Não',
['9'] = 'Não tenho certeza'
},
['setgrouplang'] = {
['1'] = 'This group\'s language has been set to %s!',
['2'] = 'This group\'s language is currently %s.\nPlease note that some strings may not be translated as of yet. If you\'d like to change your language, select one using the keyboard below:',
['3'] = 'The option to force users to use the same language in this group is currently disabled. This setting should be toggled from /administration but, to make things easier for you, I\'ve included a button below.',
['4'] = 'Enable',
['5'] = 'Disable'
},
['setlang'] = {
['1'] = 'O seu idioma foi definido para %s!',
['2'] = 'O seu idioma é atualmente %s.\nTome nota que algumas sequencias de caracteres podem não estar traduzidas. Se quiser alterar seu idioma, selecione um usando o teclado abaixo:'
},
['setlink'] = {
['1'] = 'Não é um URL valido.',
['2'] = 'Endereço definido com sucesso!'
},
['setrules'] = {
['1'] = 'Formato Markdown invalido.',
['2'] = 'Regras definidas com sucesso!'
},
['setwelcome'] = {
['1'] = 'O que mensagem gostaria de boas-vindas que fosse? O texto que especificar será formato em Markdown e enviado toda vez que um utilizador se juntar ao grupo (A mensagem de boas-vindas pode ser desativada no menu de administração, acessível via /administration). Pode usar espaços reservados para personalizar automaticamente a mensagem de boas-vindas para cada utilizador. Use $user_id para inserir o ID numérico do utilizador, $chat_id para inserir o ID numérico do grupo, $name para inserir o nome do utilizador, $title para inserir o título do grupo e $username para inserir o nome de utilizador do utilizador (Se o utilizador não tiver um @utilizador, o seu nome será usado em vez disso, para evitar é melhor usar isso com $name).',
['2'] = 'Ocorreu um erro ao formatar a mensagem, verifique a sintaxe de Markdown e tente novamente.',
['3'] = 'A mensagem de boas-vindas para %s foi atualizada com sucesso!'
},
['share'] = {
['1'] = 'Partilhar'
},
['shorten'] = {
['1'] = 'Selecione um URL shortener usando os botões abaixo:'
},
['shsh'] = {
['1'] = 'Eu não consegui obter qualquer blobs SHSH para esse ECID, assegure-se de que é válido e os guardou usando https://tsssaver.1conan.com.',
['2'] = 'Os blobs SHSH para esse dispositivo estão disponíveis para as seguintes versões do iOS:\n',
['3'] = 'Transferir .zip'
},
['statistics'] = {
['1'] = 'No messages have been sent in this chat!',
['2'] = '<b>Statistics for:</b> %s\n\n%s\n<b>Total messages sent:</b> %s',
['3'] = 'The statistics for this chat have been reset!',
['4'] = 'I could not reset the statistics for this chat. Perhaps they have already been reset?'
},
['steam'] = {
['1'] = 'O seu nome de utilizador do Steam foi definido para "%s".',
['2'] = '"%s" não é um nome de utilizador Steam valido.',
['3'] = '%s é utilizador do Steam desde %s, em %s. Desligou a ultima vez %s, em %s. Clique <a href="%s">aqui</a> para ver o perfil no Steam.',
['4'] = '%s, AKA "%s",'
},
['trust'] = {
['1'] = 'I cannot trust this user because they are a moderator or an administrator of this chat.',
['2'] = 'I cannot trust this user because they have already left this chat.',
['3'] = 'I cannot trust this user because they have already been kicked from this chat.'
},
['unmute'] = {
['1'] = 'Que utilizador gostaria que removesse silenciar? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo remover silenciar a este utilizador porque não está atualmente silenciado neste grupo.',
['3'] = 'Não consigo remover silenciar a este utilizador porque ele é um moderador ou administrador neste grupo.',
['4'] = 'Não consigo remover silenciar a este utilizador porque ele já deixou (ou foi expulso) deste grupo.',
},
['untrust'] = {
['1'] = 'Which user would you like me to untrust? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot untrust this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot untrust this user because they have already left this chat.',
['4'] = 'I cannot untrust this user because they have already been kicked from this chat.'
},
['upload'] = {
['1'] = 'Responda a mensagem do ficheiro que pretende transferir para o servidor. Deve ser <= 20 MB.',
['2'] = 'Ficheiro é demasiado grande. Deve ser <= 20 MB.',
['3'] = 'Não consegui obter esse ficheiro, é provavelmente muito antigo.',
['4'] = 'Ocorreu um erro ao recuperar esse ficheiro.',
['5'] = 'Ficheiro transferido para o servidor com sucesso - pode ser encontrado em <code>%s</code>!'
},
['voteban'] = {
['1'] = 'Qual utilizador gostaria de abrir uma votação para banir? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo criar uma votação para este utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Não consigo criar uma votação para este utilizador porque ele já deixaram (ou foi expulso) deste grupo.',
['4'] = '%s [%s] deve ser banido por %s? %s voto a favor para banir imediatamente, e %s votos contra para fechar esta votação.',
['5'] = 'Sim [%s]',
['6'] = 'Não [%s]',
['7'] = 'O povo falou. E baniu %s [%s] por %s porque %s pessoas votaram a favor.',
['8'] = 'O montante de votos a favor necessários foi atingido, no entanto, não foi pode banir %s - talvez deixou o grupo ou foi promovido desde que abrimos a votação para banir? É isso ou não tenho mais os privilégios administrativos necessários para executar esta ação!',
['9'] = 'O povo falou. E não foi banido %s [%s] por %s porque %s pessoa decidiram votar contra.',
['10'] = 'Votou a favor na decisão de banir %s [%s]!',
['11'] = 'O seu voto atual foi retirado, use os botões novamente para reenviar o seu voto.',
['12'] = 'Votou contra na decisão de banir %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'Ainda não tem uma localização definida. Use /setloc <localização> para definir uma.',
['2'] = 'Está atualmente %s (parece %s) em %s. %s'
},
['welcome'] = {
['1'] = 'Group Rules'
},
['allowlist'] = {
['1'] = 'Qual utilizador gostaria de adicionar a lista branca? Pode especificar este utilizador pelo seu @utilizador ou ID numérico.',
['2'] = 'Não consigo adicionar a lista branca esse utilizador porque ele é um moderador ou administrador neste grupo.',
['3'] = 'Não consigo adicionar a lista branca esse utilizador porque ele já deixou este grupo.',
['4'] = 'Não consigo adicionar a lista branca esse utilizador porque ele já foi banido neste grupo.'
},
['wikipedia'] = {
['1'] = 'Ver mais.'
},
['youtube'] = {
['1'] = 'Anterior',
['2'] = 'Seguinte',
['3'] = 'Está na pagina %s de %s!'
}
}
\ No newline at end of file
diff --git a/languages/scottish.lua b/languages/scottish.lua
index f192f64..3f373ba 100644
--- a/languages/scottish.lua
+++ b/languages/scottish.lua
@@ -1,734 +1,734 @@
-- This is a language file for mattata
-- Language: scottish
-- Author: LKD70
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Connection mistak.',
['results'] = 'A coudna airt oot ony results for that.',
['supergroup'] = 'This commaund can anely be used in supergruips.',
['admin'] = 'Ye need tae be a moderator ore an administrator in thes tauk in maun tae use thes commaund.',
['unknown'] = 'A daena recognise that usar. If ye wud like tae lear me who thei be, forrit a message from them tae any tauk that Am in.',
['generic'] = 'A mistak occured!',
['use'] = 'You are not allowed to use this!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Sorry, Am afraid thes feature is anely available tae usars with a public @usarname!',
['2'] = '%s has returned after being awa for %s!',
['3'] = 'Jot',
['4'] = '%s is now awa.%s'
},
['antispam'] = {
['1'] = 'Disable',
['2'] = 'Enable',
['3'] = 'Disable limit',
['4'] = 'Enable limits on %s',
['5'] = 'All Administration Settings',
['6'] = '%s [%s] has kicked %s [%s] from %s [%s] for hitting the configured anti-spam limit for [%s] media.',
['7'] = 'Kicked %s for hitting the configured antispam limit for [%s] media.',
['8'] = 'The maximum limit is 100.',
['9'] = 'The minimum limit is 1.',
['10'] = 'Modify the anti-spam settings for %s below:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'veu on iTunes',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'A coudna get the profile photaes for that usar, pleese mak siccar ye specified a valid usarname ore numerical ID.',
['2'] = 'That usar daesna have any profile photos.',
['3'] = 'That usar daesna have that many profile photaes!',
['4'] = 'That user has opted-out of data-collecting functionality, therefore I am not able to show you any of their profile photos.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Which usar wud ye like me tae ban? Ye can specify thes usar by thair @usarname ore numerical ID.',
['2'] = 'A cannae ban thes usar becawis thei be a moderator ore an administrator in thes tauk.',
['3'] = 'A cannae ban thes usar becawis thei have alrady left thes tauk.',
['4'] = 'A cannae ban thes usar becawis thei have alrady been banned from thes tauk.',
['5'] = 'A need tae have administrative permissions in maun tae ban thes usar. Pleese mend thes issue, and pree again.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Pleese specify a commaund tae run!',
['2'] = 'Success!'
},
['blocklist'] = {
['1'] = 'Which usar wud ye like me tae blocklist? Ye can specify thes usar by thair @usarname ore numerical ID.',
['2'] = 'A cannae blocklist thes usar becawis thei be a moderator ore an administrator in thes tauk.',
['3'] = 'A cannae blocklist thes usar becawis thei have alrady left thes tauk.',
['4'] = 'A cannae blocklist thes usar becawis thei have alrady been banned from thes tauk.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s has now been blocklisted, and A will leave whenever A am added there!',
['2'] = '%s is a usar, thes commaund is anely for blocklisting tauks such as gruips and channels!',
['3'] = '%s daesna appeir tae be a valid tauk!'
},
['bugreport'] = {
['1'] = 'Success! Your bug report has been sent. The ID of thes report is #%s.',
['2'] = 'There was a problem whilst reporting that bug! Ha, the irony!'
},
['calc'] = {
['1'] = 'Click tae send the result.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'A really cannae describe that picture!'
},
['cats'] = {
['1'] = 'Meow!'
},
['channel'] = {
['1'] = 'Ye be not allowed tae use thes!',
['2'] = 'Ye daena appeir tae be an administrator in that tauk anymore!',
['3'] = 'A coudna send yer message, be ye sure A still have permission tae send messages in that tauk?',
['4'] = 'Your message has been sent!',
['5'] = 'A was unable tae retrieve a list of administrators for that tauk!',
['6'] = 'Ye daena appeir tae be an administrator in that tauk!',
['7'] = 'Pleese specify the message tae send, using the syntax /channel <channel> <message>.',
['8'] = 'Are ye sure ye want tae send thes message? This is how it will look:',
['9'] = 'Yes, Am sure!',
['10'] = 'That message contains invalid Markdoun formatting! Pleese correct yer syntax and pree again.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'No commands have been sent in this chat!',
['2'] = '<b>Command statistics for:</b> %s\n\n%s\n<b>Total commands sent:</b> %s',
['3'] = 'The command statistics for this chat have been reset!',
['4'] = 'I could not reset the command statistics for this chat. Perhaps they have already been reset?'
},
['control'] = {
['1'] = 'Pfft, ye wish!',
['2'] = '%s is reloading...'
},
['copypasta'] = {
['1'] = 'The replied-to text musn\'t be any longer than %s characters!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'A coudna add a cownter tae that message!'
},
['custom'] = {
['1'] = 'Success! That message will now be sent every time somebody uses %s!',
['2'] = 'The trigger "%s" does not exist!',
['3'] = 'The trigger "%s" has been deleted!',
['4'] = 'Ye daena have any custom triggers set!',
['5'] = 'Custom commands for %s:\n',
['6'] = 'To create a new, custom commaund, use the following syntax:\n/custom new #trigger <value>. tae list all current triggers, use /custom list. tae delete a trigger, use /custom del #trigger.'
},
['delete'] = {
['1'] = 'I could not delete that message. Perhaps the message is too old or non-existent?'
},
['demote'] = {
['1'] = 'Which usar wud ye like me tae demote? Ye can specify thes usar by thair @usarname ore numerical ID.',
['2'] = 'A cannae demote thes usar becawis thei be not a moderator ore an administrator in thes tauk.',
['3'] = 'A cannae demote thes usar becawis thei have alrady left thes tauk.',
['4'] = 'A cannae demote thes usar becawis thei have alrady been kicked from thes tauk.'
},
['doge'] = {
['1'] = 'Pleese enter the text ye want tae Doge-ify. Each sentence should be separated using slashes ore new lines.'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['exec'] = {
['1'] = 'Pleese select the language ye wud like tae execute yer code in:',
['2'] = 'A mistak occured! The connection timed-out. Were ye preeing tae make me lag?',
['3'] = 'Ye have selected "%s" – be ye sure?',
['4'] = 'Back',
['5'] = 'Am sure',
['6'] = 'Pleese enter a snippet of code that ye wud like tae run. Ye daena need tae specify the language, we will do that afterwards!',
['7'] = 'Pleese select the language ye wud like tae execute yer code in:'
},
['facebook'] = {
['1'] = 'A mistak occured!',
['2'] = 'Pleese enter the name of the Facebook usar ye wud like tae get the profile picture of.',
['3'] = 'veu @%s on Facebook'
},
['fact'] = {
['1'] = 'Generate Another'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Ye serched for:',
['2'] = 'Pleese enter a serch query (that is, what ye want me tae serch Flickr for, i.e. "Big Ben" will return a photograph of Big Ben in London).',
['3'] = 'More Results'
},
['game'] = {
['1'] = 'Total wyns: %s\nTotal losses: %s\nBalance: %s mattacoins',
['2'] = 'Join Gemm',
['3'] = 'This gemm has alrady ended!',
['4'] = 'It\'s not yer turn!',
['5'] = 'Ye be not part of thes gemm!',
['6'] = 'Ye cannae go here!',
['7'] = 'Ye be alrady part of thes gemm!',
['8'] = 'This gemm has alrady started!',
['9'] = '%s [%s] is playing against %s [%s]\nIt is currently %s\'s turn!',
['10'] = '%s won the gemm against %s!',
['11'] = '%s drew the gemm against %s!',
['12'] = 'Waiting for opponent...',
['13'] = 'Tic-Tac-Toe',
['14'] = 'Click tae send the gemm tae yer tauk!',
['15'] = 'Statistics for %s:\n',
['16'] = 'Play Tic-Tac-Toe!'
},
['gblocklist'] = {
['1'] = 'Pleese reply-to the usar ye\'d like tae globally blocklist, ore specify them by usarname/ID.',
['2'] = 'A coudna get information about "%s", pleese check it\'s a valid usarname/ID and pree again.',
['3'] = 'That\'s a %s, not a usar!'
},
['gif'] = {
['1'] = 'Pleese enter a serch query (that is, what ye want me tae serch GIPHY for, i.e. "cat" will return a GIF of a cat).'
},
['gallowlist'] = {
['1'] = 'Pleese reply-to the usar ye\'d like tae globally allowlist, ore specify them by usarname/ID.',
['2'] = 'A coudna get information about "%s", pleese check it\'s a valid usarname/ID and pree again.',
['3'] = 'That\'s a %s, not a usar!'
},
['hackernews'] = {
['1'] = 'Top Stories from Hacker News:'
},
['help'] = {
['1'] = 'No results found!',
['2'] = 'There were no features found matching "%s", pleese pree and be more specific!',
['3'] = '\n\nArguments: <required> [optional]\n\nSerch for a feature ore get help with a commaund by using my inline serch functionality - just mention me in any tauk using the syntax @%s <serch query>.',
['4'] = 'Previous',
['5'] = 'Next',
['6'] = 'Back',
['7'] = 'Serch',
['8'] = 'Ye be on page %s of %s!',
['9'] = [[
A can perform many administrative actions in yer gruips, just add me as an administrator and send /administration tae adjust the settings for yer gruip.
Here be some administrative commands and a brief comment regarding what thei do:
• /pin <text> - Send a Markdoun-formatted message which can be edited by using the same commaund with different text, tae save ye from having tae re-pin a message if ye can't edit it (which happens if the message is older than 48 hours)
• /ban - Ban a usar by replying tae one of thair messages, ore by specifying them by usarname/ID
• /kick - Kick (ban and then unban) a usar by replying tae one of thair messages, ore by specifying them by usarname/ID
• /unban - Unban a usar by replying tae one of thair messages, ore by specifying them by usarname/ID
• /setrules <text> - Set the given Markdoun-formatted text as the gruip rules, which will be sent whenever somebody uses /rules
]],
['10'] = [[
• /setwelcome - Set the given Markdoun-formatted text as a welcome message that will be sent every time a usar joins yer gruip (the welcome message can be disabled in the administration menu, accessible via /administration). Ye can use placeholders tae automatically customise the welcome message for each usar. Use $usar\_id tae insert the usar's numerical ID, $chat\_id tae insert the tauk's numerical ID, $name tae insert the usar's name, $title tae insert the tauk title and $usarname tae insert the usar's usarname (if the usar doesn't have an @usarname, thair name will be used instead, so it is best tae avoid using thes with $name)
• /warn - Warn a usar, and ban them when thei hit the maximum number of warnings
• /mod - Promote the replied-to usar, giving them access tae administrative commands such as /ban, /kick, /warn etc. (this is useful when ye don't want somebody tae have the ability tae delete messages!)
• /demod - Demote the replied-to usar, stripping them from thair moderation status and revoking thair ability tae use administrative commands
• /staff - veu the gruip's creator, administrators, and moderators in a neatly-formatted list
]],
['11'] = [[
• /report - Forwards the replied-to message tae all administrators and alerts them of the current situation
• /setlink <URL> - Set the gruip's link tae the given URL, which will be sent whenever somebody uses /link
• /links <text> - Allowlists all of the Telegram links found in the given text (includes @usarname links)
]],
['12'] = 'Below be some links ye might find useful:',
['13'] = 'Development',
['14'] = 'Channel',
['15'] = 'Support',
['16'] = 'FAQ',
['17'] = 'Source',
['18'] = 'Donate',
['19'] = 'Rate',
['20'] = 'Administration Log',
['21'] = 'Admin Settings',
['22'] = 'Plugins',
['23'] = [[
<b>Hi %s! My name's %s, it's a pleasure tae meet ye</b> %s
A understand many commands, which ye can learn more about by pressing the "Commands" button using the attached keyboard.
%s <b>Tip:</b> Use the "Settings" button tae change how A work%s!
%s <b>Find me useful, or just want to help?</b> Donations are very much appreciated, use /donate for more information!
]],
['24'] = 'in'
},
['id'] = {
['1'] = 'Am sorry, but A daena recognise that usar. tae lear me who thei be, forrit a message from them tae me ore get them tae send me a message.',
['2'] = 'Queried Chat:',
['3'] = 'This Chat:',
['4'] = 'Click tae send the result!'
},
['imdb'] = {
['1'] = 'Previous',
['2'] = 'Next',
['3'] = 'Ye be on page %s of %s!'
},
['import'] = {
['1'] = 'A daena recognise that tauk!',
['2'] = 'That\'s not a supergruip, therefore A cannae import any settings from it!',
['3'] = 'Successfully imported administrative settings & toggled plugins from %s tae %s!'
},
['info'] = {
['1'] = [[
```
Redis:
%s Config File: %s
%s Mode: %s
%s TCP Port: %s
%s Version: %s
%s Uptime: %s days
%s Process ID: %s
%s Expired Keys: %s
%s Usar Cownt: %s
%s Gruip Cownt: %s
System:
%s OS: %s
```
]]
},
['instagram'] = {
['1'] = '@%s on Instagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 sum: %s\nSHA1 sum: %s\nFile size: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'This firmwhere is no longer being signed!',
['3'] = 'This firmwhere is still being signed!',
['4'] = 'Pleese select yer model:',
['5'] = 'Pleese select yer firmwhere version:',
['6'] = 'Pleese select yer device type:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'That account was found in the following leaks:'
},
['itunes'] = {
['1'] = 'Name:',
['2'] = 'Artist:',
['3'] = 'Album:',
['4'] = 'Track:',
['5'] = 'Disc:',
['6'] = 'The original query could not be found, ye\'ve probably deleted the original message.',
['7'] = 'The artwork can be found below:',
['8'] = 'Pleese enter a serch query (that is, what ye want me tae serch iTunes for, i.e. "Green Day American Idiot" will return information about the first result for American Idiot by Green Day).',
['9'] = 'Get Album Artwork'
},
['kick'] = {
['1'] = 'Which usar wud ye like me tae keek? Ye can specify thes usar by thair @usarname ore numerical ID.',
['2'] = 'A cannae keek thes usar becawis thei be a moderator ore an administrator in thes tauk.',
['3'] = 'A cannae keek thes usar becawis thei have alrady left thes tauk.',
['4'] = 'A cannae keek thes usar becawis thei have alrady been keeked from thes tauk.',
['5'] = 'A need tae have administrative permissions in maun tae keek thes usar. Pleese amend thes issue, and pree again.'
},
['lastfm'] = {
['1'] = '%s\'s last.fm usarname has been set tae "%s".',
['2'] = 'Your last.fm usarname has been forgotten!',
['3'] = 'Ye daena currently have a last.fm usarname set!',
['4'] = 'Pleese specify yer last.fm usarname ore set it with /fmset.',
['5'] = 'No history was found for thes usar.',
['6'] = '%s is currently listening to:\n',
['7'] = '%s last listened to:\n',
['8'] = 'Unknown',
['9'] = 'Click tae send the result.'
},
['location'] = {
['1'] = 'Ye daena have a location set. What wud ye like yer new location tae be?'
},
['logchat'] = {
['1'] = 'Pleese enter the usarname ore numerical ID of the tauk ye wish tae log all administrative actions into.',
['2'] = 'Checking tae see whether that tauk is valid...',
['3'] = 'Am sorry, it appeirs ye\'ve either specified an invalid tauk, ore ye\'ve specified a tauk A haven\'t been added tae yet. Pleese rectify thes and pree again.',
['4'] = 'Ye can\'t set a usar as yer log tauk!',
['5'] = 'Ye daena appeir tae be an administrator in that tauk!',
['6'] = 'It seems Am alrady logging administrative actions into that tauk! Use /logchat tae specify a new one.',
['7'] = 'That tauk is valid, Am now going tae pree and send a test message tae it, just tae ensure A have permission tae post!',
['8'] = 'Hello, World - thes is a test message tae check my posting permissions - if ye\'re reading thes, then everything went OK!',
['9'] = 'All done! From now on, any administrative actions in thes tauk will be logged into %s - tae change the tauk ye want me tae log administrative actions into, just send /logchat.'
},
['lua'] = {
['1'] = 'Pleese enter a string of Lua tae execute!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Show Lyrics',
['3'] = 'Pleese enter a serch query (that is, what song/artist/lyrics ye want me tae get lyrics for, i.e. "Green Day Basket Case" will return the lyrics for the song Basket Case by Green Day).'
},
['minecraft'] = {
['1'] = '<b>%s has changed his/her usarname %s time</b>',
['2'] = '<b>%s has changed his/her usarname %s times</b>',
['3'] = 'Previous',
['4'] = 'Next',
['5'] = 'Back',
['6'] = 'UUID',
['7'] = 'Avatar',
['8'] = 'Usarname History',
['9'] = 'Pleese select an option:',
['10'] = 'Pleese enter the usarname of the Minecraft player ye wud like tae view information about (i.e. sending "Notch" will view information about the player Notch).',
['11'] = 'Minecraft usarnames be between 3 and 16 characters long.'
},
['mute'] = {
['1'] = 'Which user would you like me to mute? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot mute this user because they are already muted in this chat.',
['3'] = 'I cannot mute this user because they are a moderator or an administrator in this chat.',
['4'] = 'I cannot mute this user because they have already left (or been kicked from) this chat.',
['5'] = 'I need to have administrative permissions in order to mute this user. Please amend this issue, and try again.'
},
['myspotify'] = {
['1'] = 'Profile',
['2'] = 'Following',
['3'] = 'Recently Played',
['4'] = 'Currently Playing',
['5'] = 'Top Tracks',
['6'] = 'Top Artists',
['7'] = 'You don\'t appear to be following any artists!',
['8'] = 'Your Top Artists',
['9'] = 'You don\'t appear to have any tracks in your library!',
['10'] = 'Your Top Tracks',
['11'] = 'You don\'t appear to be following any artists!',
['12'] = 'Artists You Follow',
['13'] = 'You don\'t appear to have recently played any tracks!',
['14'] = '<b>Recently Played</b>\n%s %s\n%s %s\n%s Listened to at %s:%s on %s/%s/%s.',
['15'] = 'The request has been accepted for processing, but the processing has not been completed.',
['16'] = 'You don\'t appear to be listening to anything right now!',
['17'] = 'Currently Playing',
['18'] = 'An error occured whilst re-authorising your Spotify account!',
['19'] = 'Successfully re-authorised your Spotify account! Processing your original request...',
['20'] = 'Re-authorising your Spotify account, please wait...',
['21'] = 'You need to authorise mattata in order to connect your Spotify account. Click [here](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) and press the green "OKAY" button to link mattata to your Spotify account. After you\'ve done that, send the link you were redirected to (it should begin with "%s", followed by a unique code) in reply to this message.',
['22'] = 'Playlists',
['23'] = 'Use Inline Mode',
['24'] = 'Lyrics',
['25'] = 'No devices were found.',
['26'] = 'You don\'t appear to have any playlists.',
['27'] = 'Your Playlists',
['28'] = '%s %s [%s tracks]',
['29'] = '%s %s [%s]\nSpotify %s user\n\n<b>Devices:</b>\n%s',
['30'] = 'Playing previous track...',
['31'] = 'You are not a premium user!',
['32'] = 'I could not find any devices.',
['33'] = 'Playing next track...',
['34'] = 'Resuming track...',
['35'] = 'Your device is temporarily unavailable...',
['36'] = 'No devices were found!',
['37'] = 'Pausing track...',
['38'] = 'Now playing',
['39'] = 'Shuffling your music...',
['40'] = 'That\'s not a valid volume. Please specify a number between 0 and 100.',
['41'] = 'The volume has been set to %s%%!',
['42'] = 'This message is using an old version of this plugin, please request a new one by sending /myspotify!'
},
['name'] = {
['1'] = 'The name A currently respond tae is "%s" - tae change thes, use /name <text> (where <text> is what ye want me tae respond to).',
['2'] = 'My new name needs tae be between 2 and 32 characters long!',
['3'] = 'My name may anely contain alphanumeric characters!',
['4'] = 'A will now respond tae "%s", instead of "%s" - tae change thes, use /name <text> (where <text> is what ye want me tae respond to).'
},
['netflix'] = {
['1'] = 'Read more.'
},
['news'] = {
['1'] = '"<code>%s</code>" isn\'t a valid Lua pattern.',
['2'] = 'A coudna retrieve a list of sources.',
['3'] = '<b>News sources found matching</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Here be the current available news sources ye can use with</b> /news<b>. Use</b> /nsources &lt;query&gt; <b>to serch the list of news sources for a more specific set of results. Serches be matched using Lua patterns</b>\n\n%s',
['5'] = 'Ye daena have a preferred news source. Use /setnews <source> tae set one. veu a list of sources using /nsources, ore narrow doun the results by using /nsources <query>.',
['6'] = 'Your current preferred news source is %s. Use /setnews <source> tae change it. veu a list of sources using /nsources, ore narrow doun the results by using /nsources <query>.',
['7'] = 'Your preferred source is alrady set tae %s! Use /news tae view the current top story.',
['8'] = 'That\'s not a valid news source. veu a list of sources using /nsources, ore narrow doun the results by using /nsources <query>.',
['9'] = 'Your preferred news source has been updated tae %s! Use /news tae view the current top story.',
['10'] = 'That\'s not a valid source, use /nsources tae view a list of available sources. If ye have a preferred source, use /setnews <source> tae automatically have news from that source sent when ye send /news, without any arguments needed.',
['11'] = 'Read more.'
},
['nick'] = {
['1'] = 'Your nickname has now been forgotten!',
['2'] = 'Your nickname has been set tae "%s"!'
},
['optout'] = {
['1'] = 'Ye have opted-in tae having data ye send collected! Use /optout tae opt-out.',
['2'] = 'Ye have opted-out of having data ye send collected! Use /optin tae opt-in.'
},
['paste'] = {
['1'] = 'Pleese select a service tae upload yer paste to:'
},
['pin'] = {
['1'] = 'You haven\'t set a pin before. Use /pin <text> to set one. Markdown formatting is supported.',
['2'] = 'Here is the last message generated using /pin.',
['3'] = 'I found an existing pin in the database, but the message I sent it in seems to have been deleted, and I can\'t find it anymore. You can set a new one with /pin <text>. Markdown formatting is supported.',
['4'] = 'There was an error whilst updating your pin. Either the text you entered contained invalid Markdown syntax, or the pin has been deleted. I\'m now going to try and send you a new pin, which you\'ll be able to find below - if you need to modify it then, after ensuring the message still exists, use /pin <text>.',
['5'] = 'I couldn\'t send that text because it contains invalid Markdown syntax.',
['6'] = 'Click here to see the pin, updated to contain the text you gave me.'
},
['pokedex'] = {
['1'] = 'Name: %s\nID: %s\nType: %s\nDescription: %s'
},
['promote'] = {
['1'] = 'A cannae promote thes usar becawis thei be a moderator ore an administrator of thes tauk.',
['2'] = 'A cannae promote thes usar becawis thei have alrady left thes tauk.',
['3'] = 'A cannae promote thes usar becawis thei have alrady been kicked from thes tauk.'
},
['quote'] = {
['1'] = 'This usar has opted out of data-storing functionality.',
- ['2'] = 'There be no saved quotes for %s%s! Ye can save one by using /save in reply tae a message thei send.'
+ ['2'] = 'There be no saved quotes for %s! Ye can save one by using /save in reply tae a message thei send.'
},
['report'] = {
['1'] = 'Please reply to the message you would like to report to the group\'s administrators.',
['2'] = 'You can\'t report your own messages, are you just trying to be funny?',
['3'] = '<b>%s needs help in %s!</b>',
['4'] = 'Click here to view the reported message.',
['5'] = 'I\'ve successfully reported that message to %s admin(s)!'
},
['save'] = {
['1'] = 'This usar has opted out of data-storing functionality.',
- ['2'] = 'That message has been saved in my database, and added tae the list of possible responses for when /quote is used in reply tae %s%s!'
+ ['2'] = 'That message has been saved in my database, and added tae the list of possible responses for when /quote is used in reply tae %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s didn\'t mean tae say thes!</i>',
['2'] = '%s\n\n<i>%s has admitted defeat.</i>',
['3'] = '%s\n\n<i>%s isn\'t sure if thei were mistaken...</i>',
['4'] = 'Screw ye, <i>when am A ever wrong?</i>',
['5'] = '"<code>%s</code>" isn\'t a valid Lua pattern.',
['6'] = '<b>Hi, %s, did ye mean:</b>\n<i>%s</i>',
['7'] = 'Yes',
['8'] = 'No',
['9'] = 'Not sure'
},
['setgrouplang'] = {
['1'] = 'This group\'s language has been set to %s!',
['2'] = 'This group\'s language is currently %s.\nPlease note that some strings may not be translated as of yet. If you\'d like to change your language, select one using the keyboard below:',
['3'] = 'The option to force users to use the same language in this group is currently disabled. This setting should be toggled from /administration but, to make things easier for you, I\'ve included a button below.',
['4'] = 'Enable',
['5'] = 'Disable'
},
['setlang'] = {
['1'] = 'Your language has been set tae %s!',
['2'] = 'Your language is currently %s.\nPleese note that some strings may not be translated as of yet. If ye\'d like tae change yer language, select one using the keyboard below:'
},
['setlink'] = {
['1'] = 'That\'s not a valid URL.',
['2'] = 'Link set successfully!'
},
['setrules'] = {
['1'] = 'Invalid Markdown formatting.',
['2'] = 'Successfully set the new rules!'
},
['setwelcome'] = {
['1'] = 'What wud ye like the welcome message tae be? The text ye specify will be Markdoun-formatted and sent every time a usar joins the tauk (the welcome message can be disabled in the administration menu, accessible via /administration). Ye can use placeholders tae automatically customise the welcome message for each usar. Use $usar_id tae insert the usar\'s numerical ID, $chat_id tae insert the tauk\'s numerical ID, $name tae insert the usar\'s name, $title tae insert the tauk\'s title and $usarname tae insert the usar\'s usarname (if the usar daesna have an @usarname, thair name will be used instead, so it is best tae avoid using thes in conjunction with $name).',
['2'] = 'There was a mistak formatting yer message, pleese check yer Markdoun syntax and pree again.',
['3'] = 'The welcome message for %s has successfully been updated!'
},
['share'] = {
['1'] = 'Shbe'
},
['shorten'] = {
['1'] = 'Pleese select a URL shortener using the buttons below:'
},
['shsh'] = {
['1'] = 'A coudna fetch any SHSH blobs for that ECID, pleese ensure it\'s valid and ye have saved them using https://tsssaver.1conan.com.',
['2'] = 'SHSH blobs for that device be available for the following versions of iOS:\n',
['3'] = 'Dounload .zip'
},
['statistics'] = {
['1'] = 'No messages have been sent in this chat!',
['2'] = '<b>Statistics for:</b> %s\n\n%s\n<b>Total messages sent:</b> %s',
['3'] = 'The statistics for this chat have been reset!',
['4'] = 'I could not reset the statistics for this chat. Perhaps they have already been reset?'
},
['steam'] = {
['1'] = 'Your Steam usarname has been set tae "%s".',
['2'] = '"%s" isn\'t a valid Steam usarname.',
['3'] = '%s has been a usar on Steam since %s, on %s. They last logged off at %s, on %s. Click <a href="%s">here</a> tae view thair Steam profile.',
['4'] = '%s, AKA "%s",'
},
['trust'] = {
['1'] = 'I cannot trust this user because they are a moderator or an administrator of this chat.',
['2'] = 'I cannot trust this user because they have already left this chat.',
['3'] = 'I cannot trust this user because they have already been kicked from this chat.'
},
['unmute'] = {
['1'] = 'Which user would you like me to unmute? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot unmute this user because they are not currently muted in this chat.',
['3'] = 'I cannot unmute this user because they are a moderator or an administrator in this chat.',
['4'] = 'I cannot unmute this user because they have already left (or been kicked from) this chat.'
},
['untrust'] = {
['1'] = 'Which user would you like me to untrust? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot untrust this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot untrust this user because they have already left this chat.',
['4'] = 'I cannot untrust this user because they have already been kicked from this chat.'
},
['upload'] = {
['1'] = 'Pleese reply tae the file ye\'d like tae dounload tae the server. It must be <= 20 MB.',
['2'] = 'That file is too large. It must be <= 20 MB.',
['3'] = 'A coudna get thes file, it\'s probably too old.',
['4'] = 'There was a mistak whilst retrieving thes file.',
['5'] = 'Successfully dounloaded the file tae the server - it can be found at <code>%s</code>!'
},
['voteban'] = {
['1'] = 'Which user would you like to open up a vote-ban for? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot setup a vote-ban for this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot setup a vote-ban for this user because they have already left (or been kicked from) this chat.',
['4'] = 'Should %s [%s] be banned from %s? %s upvotes are required for an immediate ban, and %s downvotes are required for this vote to be closed.',
['5'] = 'Yes [%s]',
['6'] = 'No [%s]',
['7'] = 'The people have spoken. I have banned %s [%s] from %s because %s people voted for me to do so.',
['8'] = 'The required upvote amount was reached, however, I was unable to ban %s - perhaps they\'ve left the group or been promoted since we opened the vote to ban them? It\'s either that, or I no longer have the administrative privileges required in order to perform this action!',
['9'] = 'The people have spoken. I haven\'t banned %s [%s] from %s because the required %s people downvoted the decision to ban them.',
['10'] = 'You upvoted the decision to ban %s [%s]!',
['11'] = 'Your current vote has been retracted, use the buttons again to re-submit your vote.',
['12'] = 'You downvoted the decision to ban %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'Ye daena have a location set. Use /setloc <location> tae set one.',
['2'] = 'It\'s currently %s (feels like %s) in %s. %s'
},
['welcome'] = {
['1'] = 'Group Rules'
},
['allowlist'] = {
['1'] = 'Which user would you like me to allowlist? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot allowlist this user because they are a moderator or an administrator in this chat.',
['3'] = 'I cannot allowlist this user because they have already left this chat.',
['4'] = 'I cannot allowlist this user because they have already been banned from this chat.'
},
['wikipedia'] = {
['1'] = 'Read more.'
},
['youtube'] = {
['1'] = 'Previous',
['2'] = 'Next',
['3'] = 'Ye be on page %s of %s!'
}
}
\ No newline at end of file
diff --git a/languages/tr_tr.lua b/languages/tr_tr.lua
index 9145f68..9ec13b9 100644
--- a/languages/tr_tr.lua
+++ b/languages/tr_tr.lua
@@ -1,734 +1,734 @@
-- This is a language file for mattata
-- Language: tr-tr
-- Author: By_Azade
-- DO NOT CHANGE ANYTHING THAT BEGINS OR ENDS WITH A %
-- THESE ARE PLACEHOLDERS!
-- DO NOT CHANGE ANY MARKDOWN/HTML FORMATTING!
-- IF YOU ARE UNSURE, ASK ON TELEGRAM (t.me/mattataDev)
return {
['errors'] = {
['connection'] = 'Bağlantı Hatası',
['results'] = 'Bunun için herhangi bir sonuç bulamadım.',
['supergroup'] = 'Bu komut sadece grupta kullanılır.',
['admin'] = 'Bu komutu kullanabilmeniz için grupta admin veya moderatör olmalısınız.',
['unknown'] = 'Bu kullanıcıyı tanımıyorum. Eğer onu bana tanıtmak isterseniz, mesajını bana yönlendirin.',
['generic'] = 'Hata oluştu!',
['use'] = 'Bunu kullanmanıza izi yok!',
['private'] = 'You can only use this command in private chat!'
},
['addcommand'] = {
['1'] = 'Please specify the command in the format <code>/command - description</code>',
['2'] = 'I couldn\'t retrieve my commands!',
['3'] = 'The command description can\'t be longer than 256 characters!',
['4'] = 'An unknown error occurred! I couldn\'t add your command!',
['5'] = 'Success! Command added.'
},
['addrule'] = {
['1'] = 'Please specify the rule you would like to add!',
['2'] = 'You don\'t have any rules to add to! Please set group rules using /setrules!',
['3'] = 'I couldn\'t add that rule, as it would make the length of the rules longer than Telegram\'s 4096 character limit!',
['4'] = 'I couldn\'t add that rule, it appears it contains invalid Markdown formatting!',
['5'] = 'Successfully updated the rules!'
},
['addslap'] = {
['1'] = 'You can only use this command in groups!',
['2'] = 'The slap cannot contain curly braces apart from placeholders!',
['3'] = 'The slap cannot be any longer than 256 characters in length!',
['4'] = 'I\'ve successfully added that slap as a possibility for /slap in this group!',
['5'] = 'You must include placeholders in your slap. Use {ME} for the person executing and {THEM} for the victim.'
},
['administration'] = {
['1'] = 'Enable Administration',
['2'] = 'Disable Administration',
['3'] = 'Anti-Spam Settings',
['4'] = 'Warning Settings',
['5'] = 'Vote-Ban Settings',
['6'] = 'Welcome New Users?',
['7'] = 'Send Rules On Join?',
['8'] = 'Send Rules In Group?',
['9'] = 'Back',
['10'] = 'Next',
['11'] = 'Word Filter',
['12'] = 'Anti-Bot',
['13'] = 'Anti-Link',
['14'] = 'Log Actions?',
['15'] = 'Anti-RTL',
['16'] = 'Anti-Spam Action',
['17'] = 'Ban',
['18'] = 'Kick',
['19'] = 'Delete Commands?',
['20'] = 'Force Group Language?',
['21'] = 'Send Settings In Group?',
['22'] = 'Delete Reply On Action?',
['23'] = 'Require Captcha?',
['24'] = 'Use Inline Captcha?',
['25'] = 'Ban SpamWatch-flagged users?',
['26'] = 'Number of warnings until %s:',
['27'] = 'Upvotes needed to ban:',
['28'] = 'Downvotes needed to dismiss:',
['29'] = 'Deleted %s, and its matching link from the database!',
['30'] = 'There were no entries found in the database matching "%s"!',
['31'] = 'You\'re not an administrator in that chat!',
['32'] = 'The minimum number of upvotes required for a vote-ban is %s.',
['33'] = 'The maximum number of upvotes required for a vote-ban is %s.',
['34'] = 'The minimum number of downvotes required for a vote-ban is %s.',
['35'] = 'The maximum number of downvotes required for a vote-ban is %s.',
['36'] = 'The maximum number of warnings is %s.',
['37'] = 'The minimum number of warnings is %s.',
['38'] = 'You can add one or more words to the word filter by using /filter <word(s)>',
['39'] = 'You will no longer be reminded that the administration plugin is disabled. To enable it, use /administration.',
['40'] = 'That\'s not a valid chat!',
['41'] = 'You don\'t appear to be an administrator in that chat!',
['42'] = 'My administrative functionality can only be used in groups/channels! If you\'re looking for help with using my administrative functionality, check out the "Administration" section of /help! Alternatively, if you wish to manage the settings for a group you administrate, you can do so here by using the syntax /administration <chat>.',
['43'] = 'Use the keyboard below to adjust the administration settings for <b>%s</b>:',
['44'] = 'Please send me a [private message](https://t.me/%s), so that I can send you this information.',
['45'] = 'I have sent you the information you requested via private chat.',
['46'] = 'Remove Channel Pins?',
['47'] = 'Remove Other Pins?',
['48'] = 'Remove Pasted Code?',
['49'] = 'Prevent Inline Bots?',
['50'] = 'Kick Media On Join?',
['51'] = 'Enable Plugins For Admins?',
['52'] = 'Kick URLs On Join?'
},
['afk'] = {
['1'] = 'Üzgünüm, Bu özellik sadece aktif kullanıcılar için @kullanıcıadı şeklinde kullanılır!',
['2'] = '%s klavyeden uzaklaşarak tekrar geri döndü %s!',
['3'] = 'Not',
['4'] = '%s şuan klavyeden uzaklaştı.%s'
},
['antispam'] = {
['1'] = 'Kapalı',
['2'] = 'Açık',
['3'] = 'Sınırı devre dışı bırak',
['4'] = 'Sınırları etkinleştir %s',
['5'] = 'Tüm Yönetim Ayarları',
['6'] = '%s [%s] Anti-spam medya limitine ulaşıldığı %s [%s] için %s [%s] gruptan atıldı [%s] .',
['7'] = 'Atıldı %s anti-spam medya limitini aştığı için [%s] .',
['8'] = 'Maksimum sınır 100.',
['9'] = 'Minimum sınır is 1.',
['10'] = 'Aşağıdan %s anti-spam ayarlarını değiştirin:',
['11'] = 'Hey %s, if you\'re going to send code that is longer than %s characters in length, please do so using /paste in <a href="https://t.me/%s">private chat with me</a>!',
['12'] = '%s <code>[%s]</code> has %s %s <code>[%s]</code> from %s <code>[%s]</code> for sending Telegram invite link(s).\n#chat%s #user%s',
['13'] = '%s %s for sending Telegram invite link(s).',
['14'] = 'Hey, I noticed you\'ve got anti-link enabled and you\'re currently not allowing your users to mention a chat you\'ve just mentioned, if you\'d like to allowlist it, use /allowlink <links>.',
['15'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending media within their first few messages.\n#chat%s #user%s',
['16'] = 'Kicked %s <code>[%s]</code> from %s <code>[%s]</code> for sending a URL within their first few messages.\n#chat%s #user%s',
['17'] = 'Action',
['18'] = 'Kick',
['19'] = 'Ban',
['20'] = 'Mute'
},
['appstore'] = {
['1'] = 'iTunes de görüntüle',
['2'] = 'rating',
['3'] = 'ratings'
},
['authspotify'] = {
['1'] = 'You are already authorised using that account.',
['2'] = 'Authorising, please wait...',
['3'] = 'A connection error occured. Are you sure you replied with the correct link? It should look like',
['4'] = 'Successfully authorised your Spotify account!'
},
['avatar'] = {
['1'] = 'Bu kullanıcı için profil fotoğraflarını alamadım, lütfen geçerli bir kullanıcı adı veya sayısal kimlik belirttiğinizden emin olun.',
['2'] = 'Bu kullanıcının profil fotoğrafı yok..',
['3'] = 'Bu kullanıcının pek çok profil fotoğrafı yok!',
['4'] = 'Bu kullanıcı, veri toplama işlevini devre dışı bıraktı, bu nedenle profil fotoğraflarından hiçbirini size gösteremiyorum.',
['5'] = 'User: %s\nPhoto: %s/%s\nSend /avatar %s [offset] to @%s to view a specific photo of this user',
['6'] = 'User: %s\nPhoto: %s/%s\nUse /avatar %s [offset] to view a specific photo of this user'
},
['ban'] = {
['1'] = 'Hangi kullanıcı banlamamı istersiniz? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu kullanıcıyı, bu sohbette bir moderatör veya yönetici oldukları için banlayamam.',
['3'] = 'Bu sohbetten ayrıldığı için bu kullanıcıyı banyalamam.',
['4'] = 'Bu sohbetten zaten banlandıkları için bu kullanıcıyı banlayamam.',
['5'] = 'Bu kullanıcıyı banlamam için admin izinlerine sahip olmam gerekiyor. Lütfen bu sorunu düzeltip tekrar deneyin.',
['6'] = '%s <code>[%s]</code> has banned %s <code>[%s]</code> from %s <code>[%s]</code>%s.\n%s %s',
['7'] = '%s has banned %s%s.'
},
['bash'] = {
['1'] = 'Lütfen çalıştırılacak bir komut belirtin!',
['2'] = 'Başarılı!'
},
['blocklist'] = {
['1'] = 'Hangi kullanıcıyı kara listeye almamı istersiniz?? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu kullanıcıyı, bu sohbette bir moderatör veya yönetici oldukları için kara listeye alamam.',
['3'] = 'Bu sohbetten ayrıldığı için bu kullanıcıyı kara listeye alamam.',
['4'] = 'Bu sohbetten banlandığı için bu kullanıcıyı kara listeye alamam.',
['5'] = '%s <code>[%s]</code> has blocklisted %s <code>[%s]</code> from using %s <code>[%s]</code> in %s <code>[%s]</code>%s.\n%s %s',
['6'] = '%s has blocklisted %s from using %s%s.'
},
['blocklistchat'] = {
['1'] = '%s şimdi kara listeye alındı!',
['2'] = '%s bir kullanıcıysa, bu komut sadece gruplar ve kanallar gibi sohbetleri kara listeye almak için kullanılır!',
['3'] = '%s Geçerli bir sohbet gibi gözükmüyor!'
},
['bugreport'] = {
['1'] = 'Başarılı! Hata raporunuz gönderilmiştir. Bu raporun kimliği #%s.',
['2'] = 'Bu hatayı bildirirken bir sorun oluştu! Ha, ironi!'
},
['calc'] = {
['1'] = 'Sonuç göndermek için tıklayın.',
['2'] = '"%s" was an unexpected word!',
['3'] = 'You cannot have a unit before a number!'
},
['captionbotai'] = {
['1'] = 'Bu resmi gerçekten tarif edemiyorum!'
},
['cats'] = {
['1'] = 'Miyavvv!'
},
['channel'] = {
['1'] = 'Bunu kullanmanıza izin verilmiyor!',
['2'] = 'Bu sohbette artık yönetici gibi görünmüyorsunuz!',
['3'] = 'Mesajınızı gönderemedim, hala sohbet mesajı gönderme iznim var mı?',
['4'] = 'Mesajınız gönderildi!',
['5'] = 'Sohbet yöneticilerinin listesini alamadım!',
['6'] = 'Sohbette bir yönetici gibi görünmüyorsun!',
['7'] = 'Lütfen, gönderilecek mesajı /channel <kanal> <mesaj> sözdizimini kullanarak belirtin.',
['8'] = 'Bu mesajı göndermek istediğinizden emin misiniz? Nasıl görüneceği ise şöyledir:',
['9'] = 'Evet eminim!',
['10'] = 'Bu mesaj geçersiz Markdown biçimlendirme içeriyor! Lütfen sözdiziminizi düzeltin ve tekrar deneyin.'
},
['chatroulette'] = {
['1'] = 'Hey! Please don\'t send messages longer than %s characters. We don\'t want to annoy the other user!',
['2'] = '*Anonymous said:*\n```\n%s\n```\nTo end your session, send /endchat.',
['3'] = 'I\'m afraid I lost connection from the other user! To begin a new chat, please send /chatroulette!',
['4'] = 'The other person you were chatting with has ended the session. To start a new one, send /chatroulette.',
['5'] = 'Successfully ended your session. To start a new one, send /chatroulette.',
['6'] = 'I have successfully removed you from the list of available users.',
['7'] = 'You don\'t have a session set up at the moment. To start one, send /chatroulette.',
['8'] = 'Finding you a session, please wait...',
['9'] = 'I\'m afraid there aren\'t any available users right now, but I have added you to the list of available users! To stop this completely, please send /endchat.',
['10'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.',
['11'] = 'I\'m afraid the user who I tried to pair you with has since blocked me. Please try and send /chatroulette again to try and connect to me!',
['12'] = 'I have successfully paired you with another user to chat to! Please remember to be kind to them! To end the chat, send /endchat.'
},
['commandstats'] = {
['1'] = 'Bu sohbette hiçbir komut gönderilmedi!',
['2'] = '<b>Komut için istatistikler:</b> %s\n\n%s\n<b>Toplam göderilen komutlar:</b> %s',
['3'] = 'Bu sohbetin komut istatistikleri sıfırlandı!',
['4'] = 'Bu sohbetin komut istatistiklerini sıfırlayamadım. Belki de daha önce sıfırlanmışlardır?'
},
['control'] = {
['1'] = 'Pfft, dilersen!',
['2'] = '%s Yeniden yükleniyor...'
},
['copypasta'] = {
['1'] = 'Yanıtlanan metin, %s karakterlerden uzun olmamalıdır.!'
},
['coronavirus'] = {
['1'] = [[*COVID-19 Statistics for:* %s
*New confirmed cases:* %s
*Total confirmed cases:* %s
*New deaths:* %s
*Total deaths:* %s
*New recovered cases:* %s
*Total recovered cases:* %s]]
},
['counter'] = {
['1'] = 'Bu mesaja sayaç ekleyemedim!'
},
['custom'] = {
['1'] = 'Başarılı! Bu mesaj şimdi birileri her kullandığı zaman gönderilecek %s!',
['2'] = 'Tetikleyici "%s" yok!',
['3'] = 'Tetikleyici "%s" silindi!',
['4'] = 'Herhangi bir özel tetikleyici ayarlamadın!',
['5'] = 'Özel komutlar %s:\n',
['6'] = 'Yeni ve özel bir komut oluşturmak için şu sözdizimini kullanın:\n/custom new #tetikleyici <değer>.Tüm tetikleyiciler listesi için, /custom list komutunu kullanın. Tetikleyiciyi silmek için ise, /custom del #trigger komutunu kullanın.'
},
['delete'] = {
['1'] = 'Bu mesajı silemedim. Belki de mesaj çok eskidir veya mevcut değildir?'
},
['demote'] = {
['1'] = 'Hangi kullanıcının yetkisini almamı istersin ? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu kullanıcıyı, bu sohbette bir moderatör veya yönetici olmadığı için yetkisini almam mümkün değil.',
['3'] = 'Bu sohbetten zaten ayrıldıı, bu kullanıcının yetkisini alamam.',
['4'] = 'Bu kullanıcı daha önce bu sohbetten atılmış ulduğu için yetkisini almam mümkün değil.'
},
['doge'] = {
['1'] = 'Lütfen Dogeify istediğiniz metni girin. Her cümle eğik çizgi veya yeni satırlar kullanılarak ayrılmalıdır.'
},
['donate'] = {
['1'] = '<b>Hello, %s!</b>\n\nIf you\'re feeling generous, you can contribute to the mattata project by making a monetary donation of any amount. This will go towards server costs and any time and resources used to develop mattata. This is an optional act, however it is greatly appreciated and your name will also be listed publically on mattata\'s GitHub page.\n\nIf you\'re still interested, you can donate <a href="https://paypal.me/wrxck">here</a>. Thank you for your continued support!'
},
['exec'] = {
['1'] = 'Lütfen kodunuzu yürütmek istediğiniz dili seçin:',
['2'] = 'Bir hata oluştu! Bağlantı zaman aşımına uğradı. Beni geride bırakmaya mı çalışıyordun?',
['3'] = 'Seçtiniz "%s" – emin misin?',
['4'] = 'Geri',
['5'] = 'Eminim',
['6'] = 'Çalıştırmak istediğiniz kod parçacığını yazınız.Dili belirtmeniz gerekmiyor, bunu daha sonra yapacağız!',
['7'] = 'Lütfen kodunuzu yürütmek istediğiniz dili seçin:'
},
['facebook'] = {
['1'] = 'Bir hata oluştu!',
['2'] = 'Lütfen profil resmini almak istediğiniz Facebook kullanıcısının adını girin.',
['3'] = 'Facebook da %s görüntüle'
},
['fact'] = {
['1'] = 'Başka Bir Tane Oluştur'
},
['fban'] = {
['1'] = 'Which user would you like me to Fed-ban? You can specify this user by their @username or numerical ID.',
['2'] = 'I cannot Fed-ban this user because they are a moderator or an administrator in this chat.'
},
['flickr'] = {
['1'] = 'Aradığınız:',
['2'] = 'Lütfen bir arama sorgusu girin (Yani, Flickrı aramamı ne için istiyorsun, Örnek: "Kalem" kalem fotoğragları gösterilecek).',
['3'] = 'Daha fazla sonuç'
},
['game'] = {
['1'] = 'Toplam kazanç: %s\nToplam kayıp: %s\nKalan: %s mattacoins',
['2'] = 'Oyuna Katıl',
['3'] = 'Bu oyun zaten bitti!',
['4'] = 'Senin sıran değil!',
['5'] = 'Bu oyunun bir parçası değilsin!',
['6'] = 'Bu oyuna giremezsiniz!',
['7'] = 'Zaten bu oyunun bir parçasısın!',
['8'] = 'Bu oyun zaten başladı!',
['9'] = '%s [%s] e karşı oynuyor %s [%s]\nŞuanda by %s\'s senin sıran!',
['10'] = '%s e karşı oyunu kazandı %s!',
['11'] = '%s e karşı oyundan çekildi %s!',
['12'] = 'Rakip bekleniyor...',
['13'] = 'Tic-Tac-Toe',
['14'] = 'Oyunu sohbete göndermek için tıklayın!',
['15'] = 'Oyun istatistiği %s:\n',
['16'] = 'Tic-Tac-Toe oyna!'
},
['gblocklist'] = {
['1'] = 'Lütfen genel kara listeye eklemek istediğiniz kullanıcıyı yanıtlayın veya kullanıcı adı veya kimlik numarasına göre belirtin.',
['2'] = 'Hakkında bilgi alamadım "%s", lütfen geçerli bir kullanıcı adı veya kimliğini kontrol edin ve tekrar deneyin.',
['3'] = 'Bu bir %s kullanıcı değil'
},
['gif'] = {
['1'] = 'Lütfen bir arama sorgusu girin (GIPHY de ne aramak istediğini belirt , örnek: "kedi" kedi ile ilgili olan GIF ler gösterilecek).'
},
['gallowlist'] = {
['1'] = 'Lütfen genel olarak beyaz listeye eklemek isteyen kullanıcıyı yanıtlayın, kullanıcı adı veya kimlik numarasına göre belirtin.',
['2'] = 'Hakkında bilgi alamadım "%s", lütfen geçerli bir kullanıcı adı veya kimliğini kontrol edin ve tekrar deneyin.',
['3'] = 'Bu bir %s kullanıcı değil'
},
['hackernews'] = {
['1'] = 'Hacker Haberlerinden En Çok Okunan Hikayeler:'
},
['help'] = {
['1'] = 'Sonuç bulunamadı!',
['2'] = '"%s" ile eşleşen hiçbir özellik bulunamadı, lütfen daha spesifik olmaya çalışın ve deneyin.!',
['3'] = '\n\nDeğişken: <required> [opsiyonel]\n\nSatır içi arama işlevselliğini kullanarak bir özellik arayın veya bir komutla yardım alın - @%s <arama sorgusu> sözdizimini kullanarak herhangi bir sohbetten bahsedin.',
['4'] = 'Önceki',
['5'] = 'Sonraki',
['6'] = 'Geri',
['7'] = 'Ara',
['8'] = '%s sayfanın %s sayfasındasın',
['9'] = [[
Gruplarınızda birçok idari işlem yapabilirim, Beni yönetici olarak eklemelisin ve grubunuzun ayarlarını yapmak için /administrator komutunu göndermelisin.
İşte bazı idari komutlar ve yaptıklarıyla ilgili kısa bir açıklama:
• /pin <yazı> - Aynı komutla farklı metni kullanarak düzenlenebilen Markdown formatlı bir mesaj gönderin, Bir mesajı düzenleyemiyorsanız bundan kurtulmak için yeniden sabitlemeniz gerekmez (Mesaj 48 saatten fazla sabit kalamaz)
• /ban - Bir kullanıcıyı, mesajlarından birine yanıt vererek veya kullanıcı adı / kimlik numarasıyla belirterek banla
• /kick - Bir kullanıcıyı mesajlarından birine yanıt vererek veya kullanıcı adı / kimlik numarasıyla belirterek bir kullanıcıyı banlayın (aynı şekilde unban komutu)
• /unban - Bir kullanıcıyı mesajlarından birine yanıt vererek veya kullanıcı adı / kimlik numarasıyla belirterek bir kullanıcının banını kaldırın
• /setrules <yazı> - Verilen Markdown formatlı metni, birisi kullandığı zaman gönderilecek olan grup kuralları olarak ayarlayın, /rules komutunu kullanarak
]],
['10'] = [[
• /setwelcome - Kullanıcının gruba katıldığı her zaman gösterilecek olan bir hoş geldin mesajı belirtin. (hoş geldin mesajı admin menüsünden kapalı olabilir, /administration komutu ile kontrol edin). Her kullanıcı için hoş geldiniz mesajını otomatik olarak özelleştirmek için yer tutucularını kullanabilirsiniz. Kullanıcının sayısal kimliğini eklemek için $user_id kullanın,sohbetin sayısal kimliğini eklemek için $chat_id, kullanıcının adını eklemek için $name, grubun ismini eklemek için $title ve kullanıcının kullanıcı adını eklemek için $username (eğer kullanıcının kullanıcı adı (@kullanıcıadı) yoksa, bunun yerine isimleri kullanılacak, bu yüzden $name ile birlikte kullanılmamalıdır.)
• /warn - Bir kullanıcıyı uyarmak ve maksimum uyarı sayısına ulaştığında onları banlamak için kullanılır
• /mod - Yanıtlanan kullanıcıya moderatör yetkisi verir, /ban, /kick, /warn vb komutları kullanabilir.(Bu, birisinin mesajlarını silmeyi istemiyorsanız kullanışlıdır!)
• /demod - Yanıtlanan kullanıcınn moderatör yetkisini alır, moderatör komutlarını kullanamaz.
• /staff - Grubun kurucusunu, adminlerini, ve moderatörlerinin listesini gösterir.
]],
['11'] = [[
• /report - Yanıtlanan mesajı direk olarak admine rapor edip yönderir.
• /setlink <URL> - Grubun bağlantısını verilen URL'yi ayarlayın; /link bu komutu, biri kullanıldığında URL gönderilir.
• /links <yazı> - Verilen metinde bulunan tüm Telegram bağlantılarını beyaz listeye ekler ( @kullanıcıadı şeklinde olanları da)
]],
['12'] = 'Aşağıda yararlı bulabileceğiniz bazı bağlantılar verilmiştir.:',
['13'] = 'Geliştirme',
['14'] = 'Kanal',
['15'] = 'Destek',
['16'] = 'SSS',
['17'] = 'Kaynak',
['18'] = 'Bağışta bulunmak',
['19'] = 'Oylamak',
['20'] = 'Yönetim Günlüğü',
['21'] = 'Admin Ayarları',
['22'] = 'Eklentiler',
['23'] = [[
<b>Merhaba %s! Benim adım %s, sizinle tanışmak bir şeref idi</b> %s
Bir çok komutu anlıyorum, hangi komutu öğrenmek istiyorsan satır içinde "Komutlar" butonunu seçin.
%s <b>İpucu:</b> "Ayarlar" butonuna tıklayarak nasıl çalıştığımı öğrenin%s!
%s <b>Beni kullanışlı mı buldun, yoksa yardıma ihtiyaç mı var ?</b>Bağışlar çok takdir edilmektedir, /donate komutunu kullanarak daha fazla bilgi elde et!
]],
['24'] = 'içinde'
},
['id'] = {
['1'] = 'Üzgünüm ama o kullanıcıyı tanımıyorum. Bana kim olduğunu öğretmek istersen, onun bir measjını bana ilet.',
['2'] = 'Sorgulanan Sohbet:',
['3'] = 'Bu sohbet:',
['4'] = 'Sonuç göndermek için tıklayın!'
},
['imdb'] = {
['1'] = 'Önceki',
['2'] = 'Sonraki',
['3'] = '%s sayfanın %s sayfasındasın!'
},
['import'] = {
['1'] = 'Bu sohbeti tanımıyorum!',
['2'] = 'Bu bir supergroup değil, bu nedenle herhangi bir ayarları aktaramıyorum!',
['3'] = '%s dan %s adresinden yönetim ayarlarını ve geçiş yapmış eklentileri başarıyla içe aktardı.!'
},
['info'] = {
['1'] = [[
```
Dağıtım:
%s Yapılandırma Dosyası: %s
%s Mod: %s
%s TCP Port: %s
%s Versyon: %s
%s Çalışma süresi: %s days
%s Çalışma kimliği: %s
%s Süresi Dolmuş Anahtarlar: %s
%s Kullanıcı Sayısı: %s
%s Grup Sayısı: %s
Sistem:
%s İşletim sistemi: %s
```
]]
},
['instagram'] = {
['1'] = '@%s İnstagram'
},
['ipsw'] = {
['1'] = '<b>%s</b> iOS %s\n\n<code>MD5 toplamı: %s\nSHA1 toplamı: %s\nDosya boyutu: %s GB</code>\n\n<i>%s %s</i>',
['2'] = 'Bu yazılım artık imzalanmıyor!',
['3'] = 'Bu yazılım hala imzalanıyor!',
['4'] = 'Lütfen modelinizi seçin:',
['5'] = 'Lütfen bellenim sürümünüzü seçin:',
['6'] = 'Lütfen aygıt türünü seçin:',
['7'] = 'iPod Touch',
['8'] = 'iPhone',
['9'] = 'iPad',
['10'] = 'Apple TV'
},
['ispwned'] = {
['1'] = 'Bu hesap aşağıdaki sızıntılarda bulundu:'
},
['itunes'] = {
['1'] = 'İsim:',
['2'] = 'Sanatçı:',
['3'] = 'Albüm:',
['4'] = 'Parça:',
['5'] = 'Disk:',
['6'] = 'Orijinal sorgu bulunamadı, muhtemelen orijinal iletiyi silindiniz.',
['7'] = 'Sanat aşağıda bulunabilir:',
['8'] = 'Lütfen bir arama sorgusu girin (iTunes de aramak istediğin sorguyu gir, örnek: "Aykut Kuşkaya-Kaldırımlar" Aykut Kuşkaya - Kaldırımlar parçası aranacak.).',
['9'] = 'Albüm Kapağını Getir'
},
['kick'] = {
['1'] = 'Hangi kullanıcıyı gruptan atmak istersiniz? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu kullanıcıyı, bu sohbette bir moderatör veya yönetici olduğu için gruptan atamam.',
['3'] = 'Bu kullanıcıyı, bu sohbeden ayrıldığı için gruptan atamam.',
['4'] = 'Bu kullanıcıyı, bu sohbetten çoktan atıldıkları için gruptan atamam.',
['5'] = 'Bu kullanıcıyı gruptan atmak için admin izinlerine sahip olmam gerekiyor. Lütfen bu sorunu düzeltip tekrar deneyin.'
},
['lastfm'] = {
['1'] = '%s\'s last.fm kullanıcı adı ayarlandı "%s".',
['2'] = 'last.fm kullanıcı adın unutuldu!',
['3'] = 'Şu anda bir last.fm kullanıcı adınız yok!',
['4'] = 'Lütfen last.fm kullanıcı adınızı belirtin veya /fmset ile ayarlayın.',
['5'] = 'Bu kullanıcı için geçmiş bulunamadı.',
['6'] = '%s Şu anda bunu dinliyorsun:\n',
['7'] = '%s en son dinlenilen:\n',
['8'] = 'Bilinmeyen',
['9'] = 'Sonuç göndermek için tıklayın.'
},
['location'] = {
['1'] = 'Ayarlanmış konumunuz yok. Yeni konum ayarlamak ister misiniz?'
},
['logchat'] = {
['1'] = 'Lütfen tüm idari işlemleri kaydetmek istediğiniz sohbetin kullanıcı adını veya sayısal kimliğini girin.',
['2'] = 'Bu sohbetin geçerli olup olmadığını kontrol et...',
['3'] = 'Maalesef geçersiz bir sohbet belirttiniz veya henüz eklenmediğim bir sohbet belirttiniz. Lütfen bunu düzeltin ve tekrar deneyin.',
['4'] = 'Bir kullanıcıyı günlük sohbetiniz olarak ayarlayamazsınız!',
['5'] = 'Sohbette bir yönetici gibi görünmüyorsun!',
['6'] = 'Görünen o ki sohbetime zaten idari işlemler yapıyorum! /logchat komutunu kullanarak bir tane oluştur.',
['7'] = 'Bu sohbet geçerlidir, şimdi göndermeye izinim olduğundan emin olmak için ona bir test mesajı göndermeye çalışacağım!',
['8'] = 'Merhaba, Dünya - bu,mesaj gönderme izinlerini kontrol etmek için bir test mesajıdır - Eğer bunu okursanız, her şey yolundadır.',
['9'] = 'Hepsi tamam! Şu andan itibaren, bu sohbetteki herhangi bir idari işlemler giriş yapabilir %s - Benim için yönetimsel işlemleri kaydetmek istediğim sohbeti değiştirmek için, /logchat komutunu kullanın.'
},
['lua'] = {
['1'] = 'Lütfen yürütülecek bir Lua dizgesi girin!'
},
['lyrics'] = {
['1'] = 'Spotify',
['2'] = 'Şarkı sözlerini göster',
['3'] = 'Lütfen bir arama sorgusu girin (aramak istediğin şarkı sözlerini belirt, örnek: "Ankaranın Bağları" Ankaranın bağları şarkı sözlerini getirecek.).'
},
['minecraft'] = {
['1'] = '<b>%s kullanıcı adını değiştirdi %s time</b>',
['2'] = '<b>%s kullanıcı adını %s kere değiştirdi </b>',
['3'] = 'Önceki',
['4'] = 'Sonraki',
['5'] = 'Geri',
['6'] = 'UUID',
['7'] = 'Resim',
['8'] = 'Kullanıcı adı geçmişi',
['9'] = 'Lütfen özellik seçiniz:',
['10'] = 'Lütfen Minecraft oyuncusunun kullanıcı adını giriniz. (örnek: "By_Azade" By_Azade hakkında bilgi verecel).',
['11'] = 'Minecraft usernames are between 3 and 16 characters long.'
},
['mute'] = {
['1'] = 'Hangi kullanıcıyı susturmak istersiniz? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu sohbette zaten sessiz oldukları için bu kullanıcıyı susturamıyorum',
['3'] = 'Bu sohbette bir moderatör ya da yönetici oldukları için bu kullanıcıyı susturamıyorum.',
['4'] = 'Bu kullanıcıyı zaten bu sohbetten ayrılmış (veya oradan atılmış) bu yüzden susturamıyorum.',
['5'] = 'Bu kullanıcıyı susturmak için admin izinlerine sahip olmam gerekiyor. Lütfen bu sorunu düzeltip tekrar deneyin.'
},
['myspotify'] = {
['1'] = 'Profil',
['2'] = 'Takip Edilenler',
['3'] = 'Önceden Oynatılanlar',
['4'] = 'Şu Anda Oynatılıyor',
['5'] = 'En İyi Parçalarınız',
['6'] = 'En İyi Sanatçılarınız',
['7'] = 'Herhangi bir sanatçıyı takip ediyor gibi görünmüyorsun!',
['8'] = 'En İyi Sanatçılarınız',
['9'] = 'Kütüphanenizde herhangi bir parçanın bulunmadığı anlaşılıyor!',
['10'] = 'En İyi Parçalarınız',
['11'] = 'Herhangi bir sanatçıyı takip ediyor gibi görünmüyorsun!',
['12'] = 'Takip Edilen Sanatçılar',
['13'] = 'Yakın zamanda herhangi bir parça çalmış görünmüyorsun!',
['14'] = '<b>Son Oynatılan</b>\n%s %s\n%s %s\n%s Dinlendi %s:%s on %s/%s/%s.',
['15'] = 'İstek işleme için kabul edildi, ancak işlem tamamlanmadı.',
['16'] = 'Şu an bir şey dinliyor görünmüyorsun!',
['17'] = 'Şu Anda Oynatılıyor',
['18'] = 'Spotify hesabınızı yeniden yetkilendirirken bir hata oluştu.!',
['19'] = 'Spotify hesabınız başarılı bir şekilde yeniden yetkilendirildi! İsteğinizi işleme koyabilirsiniz....',
['20'] = 'Spotify hesabınızı yeniden yetkilendirilecek, lütfen bekleyin...',
['21'] = 'Spotify hesabınızı bağlamak için mattatayı yetkilendirmeniz gerekir. Tıklayın [buraya](https://accounts.spotify.com/en/authorize?client_id=%s&response_type=code&redirect_uri=%s&scope=user-library-read,playlist-read-private,playlist-read-collaborative,user-read-private,user-read-email,user-follow-read,user-top-read,user-read-playback-state,user-read-recently-played,user-read-currently-playing,user-modify-playback-state) Mattatayı Spotify hesabınıza bağlamak için yeşil "Tamam" düğmesine basın. Bunu yaptıktan sonra, yönlendirilen bağlantıyı şu adrese gönderin: ("%s" ile başlamalı ve onu benzersiz bir kod takip etmelidir).',
['22'] = 'Çalma listeleri',
['23'] = 'Satıriçi Modu Kullan',
['24'] = 'Şarkı sözleri',
['25'] = 'Hiç aygıt bulunamadı.',
['26'] = 'Hiçbir çalma listenizin yokmuş gibi görünüyor.',
['27'] = 'Senin Oynatma Listen',
['28'] = '%s %s [%s parçalar]',
['29'] = '%s %s [%s]\nSpotify %s kullanıcı\n\n<b>aygıtları:</b>\n%s',
['30'] = 'Önceki parçayı çalınıyor...',
['31'] = 'Premium kullanıcı değilsiniz!',
['32'] = 'Herhangi bir cihaz bulamadım.',
['33'] = 'Bir sonraki parçayı çalınıyor...',
['34'] = 'Parça yeniden başlatılıyor...',
['35'] = 'Cihazınız geçici olarak kullanılamıyor...',
['36'] = 'Hiç aygıt bulunamadı!',
['37'] = 'Parçayı durduruyor...',
['38'] = 'Şimdi oynuyor',
['39'] = 'Shuffling your music...',
['40'] = 'Bu geçerli bir ses değil. Lütfen 0 ile 100 arasında bir sayı belirtin.',
['41'] = 'Ses seviyesi ayarlandı %s%%!',
['42'] = 'Bu ileti bu eklentinin eski bir sürümünü kullanıyor, lütfen /myspotify komutunu kullanarak yeni bir tane isteyin.!'
},
['name'] = {
['1'] = 'Şu anda yanıtladığım isim "%s" - bunu değiştirmek için, /name <yazı> komutunu kullanın (Buradaki <yazı> bemin cevap vermemi istediğiniz şeydir).',
['2'] = 'Yeni adım 2 ila 32 karakter uzunluğunda olmalıdır!',
['3'] = 'İsmim yalnızca alfasayısal karakterler içerebilir!',
['4'] = 'Şimdi "% s" yerine "% s" ye yanıt vereceğim - bunu değiştirmek için, /name <yazı> komutunu kullanın (Buradaki <yazı> benim cevap vermemi istediğiniz şeydir).'
},
['netflix'] = {
['1'] = 'Daha Fazla Bilgi Edinin'
},
['news'] = {
['1'] = '"<code>%s</code>" Geçerli bir Lua kalıbı değil.',
['2'] = 'Bir kaynak listesi alınamadı..',
['3'] = '<b>Eşleşen haber kaynakları bulundu</b> "<code>%s</code>":\n\n%s',
['4'] = '<b>Aşağıdakilerle birlikte kullanabileceğiniz mevcut haber kaynakları</b> /news komutunu kullanarak./nsources komutunu <b>kullanın.</b> &lt;kaynak&gt; <b>daha spesifik bir sonuç kümesi için haber kaynakları listesinde arama yapmalısın. Aramalar Lua kalıpları kullanılarak eşleştirilir</b>\n\n%s',
['5'] = 'Tercih ettiğiniz bir haber kaynağınız yok. /setnews <kaynak> komutunu kullanarak bir tane ayarla. Kaynakların listesini görmek için /nsources komutunu kullan, veya kaynakları daraltmak için /nsources <kaynak> komutunu kullanabilirsin.',
['6'] = 'Tercih ettiğiniz mevcut haber kaynağı %s. /setnews <kaynak> komutunu kullanarak değiştirebilirsin. /nsources komutunu kullanarak kaynakları görüntüleyebilirsin, veya kaynakları daraltmak için /nsources <kaynak> komutunu kullanabilirsin.',
['7'] = 'Tercih ettiğiniz kaynak zaten %s! Geçerli hikayeyi görüntülemek için /news komutunu kullanın.',
['8'] = 'Bu geçerli bir haber kaynağı değil./nsources komutunu kullanarak bir kaynak listesi görüntüle, veya sonuçları daraltmak için /nsources <sorgu> komutunu kullan.',
['9'] = 'Tercih ettiğiniz haber kaynağı güncellendi %s! Geçerli hikayeyi görüntülemek için /news komutunu kullanın.',
['10'] = 'Bu geçerli bir kaynak değil, /nsources komutunu kullanarak aktif kaynakları görüntüleyin.Tercih ettiğiniz bir kaynağınız varsa, /setnews <kaynak> /news komutunu kullanarak gönderdiğinizde o kaynaktan gönderilen haberler otomatik olarak alınır, Herhangi bir argüman gerekmeden.',
['11'] = 'Daha Fazla Bilgi Edinin'
},
['nick'] = {
['1'] = 'Takma adınız şimdi unutuldu!',
['2'] = 'Takma adınız "%s"!'
},
['optout'] = {
['1'] = 'Toplanan verileri göndermeyi için seçtiniz! /optout komutunu kullanın.',
['2'] = 'Toplanan verileri göndermekten vazgeçtiniz! Etkinleştirmek için /optin komutunu kullanın.'
},
['paste'] = {
['1'] = 'Lütfen yapıştırma dosyanızı yüklemek için bir hizmet seçin:'
},
['pin'] = {
['1'] = 'Daha önce bir mesaj sabitlemediniz. /pin <yazı> komutunu kullanarak bir tane oluşturun.Yazı tipi türlerini destekler.',
['2'] = 'İşte son mesajı kullanarak üretilen /pin.',
['3'] = 'Veritabanında varolan bir pin buldum, Ancak gönderdiğim mesaj silindi gibi görünüyor, ve artık onu bulamıyorum. /pin <yazı> komutunu kullanrak yeni bir tane oluşturabilirsin. Yazı tipi türlerini destekler.',
['4'] = 'Mesajı sabitlerken bir hata oluştu. Girdiğiniz metnin geçersiz yazı tipi türü içerdiği için sabitlenen mesaj silindi. Şimdi, size aşağıda bulabileceğiniz yeni bir pin göndermeye çalışacağım - Onu değiştirmeniz gerekiyorsa, mesaj hala mevcut olduğundan emin olduktan sonra, /pin <yazı> komutunu kullanın.',
['5'] = 'Geçersiz yazı tipi formatı içerdiğinden bu metni gönderemedim.',
['6'] = 'Sabitlenen mesajı görüntüle, güncellenen mesajı görüntülemek için tıklayın.'
},
['pokedex'] = {
['1'] = 'İsim: %s\nKimlik: %s\nTip: %s\nAçıklama: %s'
},
['promote'] = {
['1'] = 'Admini veya moderatörü yetkilendiremezsin.',
['2'] = 'Bu kullanıcıyı yetkilendiremiyorum çünkü bu sohbetten ayrılmış durumda.',
['3'] = 'Bu kullanıcıyı yetkilendiremiyorum çünkü bu sohbetten çoktan atılmış durumda.'
},
['quote'] = {
['1'] = 'Bu kullanıcı, veri saklama işlevini devre dışı bıraktı.',
- ['2'] = 'Bunun için kayıtlı söz yok! Onların gönderdikleri bir mesajı /save komutunu kullanarak kaydedebilirsiniz.'
+ ['2'] = 'Bunun için kayıtlı söz yok %s! Onların gönderdikleri bir mesajı /save komutunu kullanarak kaydedebilirsiniz.'
},
['report'] = {
['1'] = 'Lütfen grubun yöneticilerine bildirmek istediğiniz iletiyi yanıtlayın.',
['2'] = 'Kendi mesajlarınızı bildiremezsiniz, sadece komik olmaya mı çalışıyorsunuz?',
['3'] = '<b>%s içinde yardıma ihtiyacı var %s!</b>',
['4'] = 'Bildirilen mesajı görüntülemek için burayı tıklayın.',
['5'] = 'Bu mesajı %s admin(ler) e başarıyla rapor ettim.!'
},
['save'] = {
['1'] = 'Bu kullanıcı, veri saklama işlevini devre dışı bıraktı.',
- ['2'] = 'Bu mesaj benim veritabanıma kaydedildi ve /quote cevabında kullanıldığında olası yanıtların listesine eklendi. %s%s!'
+ ['2'] = 'Bu mesaj benim veritabanıma kaydedildi ve /quote cevabında kullanıldığında olası yanıtların listesine eklendi. %s!'
},
['sed'] = {
['1'] = '%s\n\n<i>%s Bunu söylemek istememiştim!</i>',
['2'] = '%s\n\n<i>%s Yenilgiyi kabul etti.</i>',
['3'] = '%s\n\n<i>%s Yanılıyor mu bilmiyorlar mı ...</i>',
['4'] = 'Kahretsin, <i>Ne zamandır yanılıyorum?</i>',
['5'] = '"<code>%s</code>" Geçerli bir Lua kalıbı değil.',
['6'] = '<b>Merhaba, %s, bunu mu demek istedin:</b>\n<i>%s</i>',
['7'] = 'Evet',
['8'] = 'Hayır',
['9'] = 'Emin değilim'
},
['setgrouplang'] = {
['1'] = 'Bu grubun dili şu şekilde ayarlandı: %s!',
['2'] = 'Bu grubun dili şu anda %s.\nLütfen bazı dizelerin henüz tercüme edilmediğine dikkat ediniz. Dilinizi değiştirmek isterseniz, aşağıdaki klavyeyi kullanarak birini seçin:',
['3'] = 'Kullanıcıları bu grupta aynı dili kullanmaya zorlama seçeneği şu anda devre dışı. Bu ayar /administrator den değiştirilmelidir, ancak işleri sizin için daha kolay hale getirmek için aşağıda bir düğme ekledim.',
['4'] = 'Etkin',
['5'] = 'Devre dışı'
},
['setlang'] = {
['1'] = 'Diliniz ayarlandı %s!',
['2'] = 'Diliniz şuanda %s.\nLütfen bazı dizelerin henüz tercüme edilmediğine dikkat ediniz. Dilinizi değiştirmek isterseniz, aşağıdaki klavyeyi kullanarak birini seçin:'
},
['setlink'] = {
['1'] = 'Doğru bir URL değil.',
['2'] = 'Link başarılı bir şekilde ayarlandı!'
},
['setrules'] = {
['1'] = 'Bilinmeyen yazı tipi formatı.',
['2'] = 'Yeni kural başarılı bir şekilde kaydedildi!'
},
['setwelcome'] = {
['1'] = 'Hoşgeldiniz mesajında ne yapmak istersiniz? Belirttiğiniz metin Markdown formatında olacak ve bir kullanıcı sohbete her katıldığında gönderilecektir (Hoş Geldiniz mesajı yönetim menüsünde devre dışı bırakılabilir, /administration üzerinden erişilebilir). Her kullanıcı için hoş geldiniz mesajını otomatik olarak özelleştirmek için yer tutucularını kullanabilirsiniz. Kullanıcının sayısal kimliğini eklemek için $user_id kullanın,sohbetin sayısal kimliğini eklemek için $chat_id, kullanıcının adını eklemek için $name, grubun ismini eklemek için $title ve kullanıcının kullanıcı adını eklemek için $username (eğer kullanıcının kullanıcı adı (@kullanıcıadı) yoksa, bunun yerine isimleri kullanılacak, bu yüzden $name ile birlikte kullanılmamalıdır.).',
['2'] = 'Mesajınızı biçimlendirirken bir hata oluştu, lütfen yazı türünü kontrol edin ve tekrar deneyin.',
['3'] = 'Hoş geldin mesajı %s başarılı bir şekilde güncellendi!'
},
['share'] = {
['1'] = 'Paylaş'
},
['shorten'] = {
['1'] = 'Lütfen aşağıdaki butonları kullanarak bir URL kısaltıcı seçin:'
},
['shsh'] = {
['1'] = 'ECID için herhangi bir SHSH blobunu getiremedim, Lütfen geçerli olduğundan ve bunları kullanarak kaydettiğinizden emin olun https://tsssaver.1conan.com.',
['2'] = 'SHSH Bu cihazın blobları, iOSun aşağıdaki sürümleri için kullanılabilir:\n',
['3'] = 'İndir .zip'
},
['statistics'] = {
['1'] = 'Bu sohbette hiç mesaj gönderilmedi!',
['2'] = '<b>Statistics for:</b> %s\n\n%s\n<b>Total messages sent:</b> %s',
['3'] = 'Bu sohbet istatistikleri sıfırlandı!',
['4'] = 'Bu sohbetin istatistiklerini sıfırlayamadım. Belki daha önce resetlendi?'
},
['steam'] = {
['1'] = 'Steam kullanıcı adın ayarlandı "%s".',
['2'] = '"%s" Steam kullanıcı adı değil.',
['3'] = '%s Steam kullanıcısı %s, açık %s. En son kapattılanlar %s, açık %s. Tıkla <a href="%s">here</a> Steam profilini görüntüle.',
['4'] = '%s, AKA "%s",'
},
['trust'] = {
['1'] = 'Admini ve moderatörü güvenli olarak işaretleyemem.',
['2'] = 'Bu kullanıcıyı güvenli olarak işaretleyemem,kullanıcı gruptan ayrılmış.',
['3'] = 'Bu kullanıcıyı güvenli olarak işaretleyemem, kullanıcı gruptan atılmış'
},
['unmute'] = {
['1'] = 'Hangi kullanıcının sesini açmak istiyorsun? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Bu kullanıcının sesini açamam, kullanıcının sesi kapanmamış.',
['3'] = 'Adminin veya moderatörün sesini kapatamam.',
['4'] = 'Bu kullanıcının sesini açamam, kullanıcı gruptan ayrılmış.'
},
['untrust'] = {
['1'] = 'Hangi kullanıcıyı güvenilmeyen yapmak istiyorsun ? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Admin ve moderatörü güvenilmeyenler olarak ekleyemem.',
['3'] = 'Bu kullanıcıyı güvenilmeyenler listesine ekleyemem, kullanıcı gruptan ayrılmış.',
['4'] = 'Bu kullanıcıyı güvenilmeyenler listesine ekleyemem, kullanıcı gruptan atılmış.'
},
['upload'] = {
['1'] = 'Please reply to the file you\'d like to download to the server. It must be <= 20 MB.',
['2'] = 'Dosya çok büyük boyutta. 20MBdan küçük olmalı <= 20 MB.',
['3'] = 'Bu dosyayı alamıyorum, muhtemelen çok eski.',
['4'] = 'Bu dosyayı alınırken bir hata meydana geldi.',
['5'] = 'Dosyayı sunucudan başarılı bir şekilde indirdiniz - bulunabilir <code>%s</code>!'
},
['voteban'] = {
['1'] = 'Hangi kullanıcı için oyla-banla özelliği kullanmak istiyorsun? Bu kullanıcıyı @kulanıcıadı şeklinde veya kullanıcı IDsi ile belirtebilirsin.',
['2'] = 'Admin için oyla-banla özelliği kullanılmaz',
['3'] = 'Oyla-banla özelliğini kullanamıyorum, kullanıcı gruptan ayılmış veya banlanmış.',
['4'] = '[%s] Buradan banlanması gerekir mi %s? %s hemen yasaklanması için oylama gerekir, ve %s bunun için en az oylama kapalı olmalıdır',
['5'] = 'Evet [%s]',
['6'] = 'Hayır [%s]',
['7'] = '[%s] Buradan %s %s banlandı %s çünkü %s insanlar bunun için oy kullandılar.',
['8'] = 'En yüksek oy miktarına ulaşıldı, ancak, banlayamam %s - belki onlar oylama yapılmadan önce gruptan ayrılmışlardır? Bu eylemi gerçekleştirmek için yetkiniz yok',
['9'] = 'Onları %s [%s] banlayamam %s çünkü %s insanlar banlamak için karar vermemişler.',
['10'] = 'Banlamak için oy kullandın %s [%s]!',
['11'] = 'Oyun geri çekildi, butonu kullanarak tekrar oy kullanabilirsin.',
['12'] = 'Banlama kararı alındı %s [%s]!',
['13'] = 'A vote-ban has already been opened for this user!'
},
['weather'] = {
['1'] = 'Konum ayarlamadın. /setloc <konum> komutunu kullanarak bir tane ayarla.',
['2'] = 'Şu anda %s (hissedilen sıcaklık %s) %s. %s'
},
['welcome'] = {
['1'] = 'Grup Kuralları'
},
['allowlist'] = {
['1'] = 'Hangi kullanıcıyı beyaz listeye almak istiyorsun? Bir kullanıcıyı özel olarak @kullanıcıadı şeklinde veya kullanıcı kimliği ile belirtebilirsin.',
['2'] = 'Admini veya moderatörü beyaz listeye alamam.',
['3'] = 'Bu kullanıcıyı beyaz listeye alamam, kullanıcı sohbetten ayrılmış.',
['4'] = 'Bu kullanıcıyı beyaz listeye alamam kullanıcı sohbetten banlanmış'
},
['wikipedia'] = {
['1'] = 'Daha fazla bilgi edinin.'
},
['youtube'] = {
['1'] = 'Önceki',
['2'] = 'Sonraki',
['3'] = '%s sayfanın %s sayfasındasın!'
}
}
diff --git a/libs/utils.lua b/libs/utils.lua
index d062752..fa1c948 100644
--- a/libs/utils.lua
+++ b/libs/utils.lua
@@ -1,515 +1,477 @@
local utils = {}
local redis = require('libs.redis')
local configuration = require('configuration')
local mattata = {}
local api = {}
local tools = {}
function utils:init()
mattata = self
api = self.api
tools = self.tools
return utils
end
function utils.is_trusted_user(chat_id, user_id)
if redis:sismember('administration:' .. chat_id .. ':trusted', user_id) then
return true
end
return false
end
function utils.get_user_count()
return #redis:keys('user:*:info')
end
function utils.get_group_count()
return #redis:keys('chat:*:info')
end
function utils.get_user_language(user_id)
return redis:hget('chat:' .. user_id .. ':settings', 'language') or 'en_gb'
end
function utils.get_log_chat(chat_id)
local chat = redis:hget('chat:' .. chat_id .. ':settings', 'log chat')
if chat ~= false and chat ~= nil then
return chat
end
return configuration.log_channel or false
end
function utils.set_captcha(chat_id, user_id, text, id, timeout)
local hash = string.format('chat:%s:captcha:%s', tostring(chat_id), tostring(user_id))
redis:hset(hash, 'id', id)
redis:hset(hash, 'text', text)
redis:set('captcha:' .. chat_id .. ':' .. user_id, true)
redis:expire('captcha:' .. chat_id .. ':' .. user_id, timeout)
return true
end
function utils.get_captcha_id(chat_id, user_id)
return redis:hget('chat:' .. chat_id .. ':captcha:' .. user_id, 'id') or false
end
function utils.get_captcha_text(chat_id, user_id)
return redis:hget('chat:' .. chat_id .. ':captcha:' .. user_id, 'text') or false
end
function utils.delete_redis_hash(hash, field)
return redis:hdel(hash, field)
end
function utils.wipe_redis_captcha(chat_id, user_id)
local hash = string.format('chat:%s:captcha:%s', tostring(chat_id), tostring(user_id))
redis:hdel(hash, 'id')
redis:hdel(hash, 'text')
return true
end
function utils.get_missing_languages(delimiter)
local missing_languages = redis:smembers('mattata:missing_languages')
if not missing_languages then
return false
end
local output = {}
for _, v in pairs(missing_languages) do
table.insert(output, v)
end
delimiter = delimiter or ', '
return table.concat(output, delimiter)
end
function utils.purge_user(user)
if type(user) ~= 'table' then
return false
end
user = user.from or user
redis:hdel('user:' .. user.id .. ':info', 'id')
if user.username or redis:hget('user:' .. user.id .. ':info', 'username') then
redis:hdel('user:' .. user.id .. ':info', 'username')
local all = redis:smembers('user:' .. user.id .. ':usernames')
for _, v in pairs(all) do
redis:srem('user:' .. user.id .. ':usernames', v)
end
redis:del('username:' .. user.id)
end
redis:hdel('user:' .. user.id .. ':info', 'first_name')
if user.name or redis:hget('user:' .. user.id .. ':info', 'name') then
redis:hdel('user:' .. user.id .. ':info', 'name')
end
if user.last_name or redis:hget('user:' .. user.id .. ':info', 'last_name') then
redis:hdel('user:' .. user.id .. ':info', 'last_name')
end
if user.language_code or redis:hget('user:' .. user.id .. ':info', 'language_code') then
redis:hdel('user:' .. user.id .. ':info', 'language_code')
end
return true
end
function utils.get_list(name)
name = tostring(name)
local length = redis:llen(name)
return redis:lrange(name, 0, tonumber(length) - 1)
end
function utils.get_inline_help(input, offset)
offset = offset and tonumber(offset) or 0
local inline_help = {}
local count = offset + 1
local plugin_list = mattata.plugin_list
for _, plugin in pairs(mattata.administrative_plugin_list) do
if not tools.table_contains(plugin_list, plugin) then
table.insert(plugin_list, plugin)
end
end
table.sort(plugin_list)
for k, v in pairs(plugin_list) do
-- The bot API only accepts a maximum of 50 results, hence we need the offset.
if k > offset and k < offset + 50 then
v = v:gsub('\n', ' ')
if v:match('^/.- %- .-$') and v:lower():match(input) then
table.insert(inline_help,
{
['type'] = 'article',
['id'] = tostring(count),
['title'] = v:match('^(/.-) %- .-$'),
['description'] = v:match('^/.- %- (.-)$'),
['input_message_content'] = {
['message_text'] = utf8.char(8226) .. ' ' .. v:match('^(/.-) %- .-$') .. ' - ' .. v:match('^/.- %- (.-)$')
}
})
count = count + 1
end
end
end
return inline_help
end
function utils.string_to_time(str, is_temp_ban)
if not str then
return false
end
str = tostring(str):gsub('%s', '')
local base_date = {
['year'] = 1970,
['month'] = 1,
['day'] = 1,
['hour'] = 0,
['min'] = 0,
['sec'] = 0
}
local units = {
['y'] = 'year',
['year'] = 'year',
['years'] = 'year',
['mo'] = 'month',
['month'] = 'month',
['months'] = 'month',
['w'] = '7day',
['week'] = '7day',
['weeks'] = '7day',
['d'] = 'day',
['day'] = 'day',
['days'] = 'day',
['h'] = 'hour',
['hour'] = 'hour',
['hours'] = 'hour',
['m'] = 'min',
['min'] = 'min',
['mins'] = 'min',
['minute'] = 'min',
['minutes'] = 'min',
['s'] = 'sec',
['sec'] = 'sec',
['secs'] = 'sec',
['second'] = 'sec',
['seconds'] = 'sec'
}
for number, unit in str:gmatch('(%d+)(%a+)') do
local amount, field = units[unit]:match('^(%d*)(%a+)$')
base_date[field] = base_date[field] + tonumber(number) * (tonumber(amount) or 1)
end
local final_length = os.time(base_date)
if is_temp_ban and final_length <= 59 then
return false
end
return final_length
end
function utils.get_user_setting(chat_id, user_id, setting)
if not chat_id or not user_id or not setting then
return false
elseif not redis:hexists('user:' .. user_id .. ':' .. chat_id .. ':settings', tostring(setting)) then
return false
end
return true
end
function utils.is_group(message)
if not message or not message.chat or not message.chat.type or message.chat.type == 'private' then
return false
end
return true
end
function utils.input(s)
local mentioned_user = false
if not s then
return false
elseif type(s) == 'table' then
if s.entities and #s.entities >= 2 and s.entities[2].type == 'text_mention' then
mentioned_user = tostring(s.entities[2].user.id)
end
s = s.text
end
if s:lower():match('^mattata search %a+ for .-$') then
return s:lower():match('^mattata search %a+ for (.-)$')
elseif not s:lower():match('^[%%/%%!%%$%%^%%?%%&%%%%]') then
return s
end
local input = s:find(' ')
if not input then
return false
end
s = s:sub(input + 1)
input = s:find(' ')
if mentioned_user then
s = input and mentioned_user .. ' ' .. s:sub(input + 1) or mentioned_user
end
return s
end
function utils.get_input(message, has_reason)
local input = utils.input(message)
if message.reply then
if not message.reply.from or message.reply.forward_from then
return false
elseif has_reason and input then
return message.reply.from.id, input
end
return message.reply.from.id
elseif not input then
return false
elseif has_reason and input:find(' ') then
return input:match('^(.-) '), input:match(' (.-)$')
end
return input
end
function utils.get_chat_id(chat)
if not chat then
return false
end
local success = api.get_chat(chat)
if not success or not success.result then
return false
end
return success.result.id
end
function utils.get_setting(chat_id, setting)
if not chat_id or not setting then
return false
end
return redis:hget('chat:' .. chat_id .. ':settings', tostring(setting))
end
function utils.get_value(chat_id, value)
if not chat_id or not value then
return false
end
return redis:hget('chat:' .. chat_id .. ':info', tostring(value))
end
function utils.set_value(chat_id, key, value)
if not chat_id or not key or not value then
return false
end
return redis:hset('chat:' .. chat_id .. ':info', tostring(key), tostring(value))
end
function utils.log_error(error_message)
error_message = tostring(error_message):gsub('%%', '%%%%')
local output = string.format('%s[31m[Error] %s%s[0m', string.char(27), error_message, string.char(27))
print(output)
end
function utils.set_command_action(chat_id, message_id, command)
local hash = string.format('action:%s:%s', chat_id, message_id)
return redis:set(hash, command)
end
function utils.increase_administrative_action(chat_id, user_id, action, increase_by)
if not increase_by or tonumber(increase_by) == nil then
increase_by = 1
end
local hash = string.format('chat:%s:%s', chat_id, user_id)
return redis:hincrby(hash, action, increase_by)
end
-function utils.is_allowlisted_link(link)
+function utils.is_allowlisted_link(link, chat_id)
if link == 'username' or link == 'isiswatch' or link == 'mattata' or link == 'telegram' then
return true
+ elseif chat_id and redis:get('allowlisted_links:' .. chat_id .. ':' .. link:lower()) then
+ return true
end
return false
end
-function utils.is_valid(message) -- Performs basic checks on the message object to see if it's fit
+function utils.is_valid(message, offset) -- Performs basic checks on the message object to see if it's fit
-- for its purpose. If it's valid, this function will return `true` - otherwise it will return `false`.
if not message then -- If the `message` object is nil, then we'll ignore it.
return false, 'No `message` object exists!'
- elseif message.date < os.time() - 7 then -- We don't want to process old messages, so anything
- -- older than the current system time (giving it a leeway of 7 seconds).
+ elseif message.date < os.time() - (offset or 10) then -- We don't want to process old messages, so anything
+ -- older than the current system time (giving it a leeway of 10 seconds, unless otherwise specified).
return false, 'This `message` object is too old!'
elseif not message.from then -- If the `message.from` object doesn't exist, this will likely
-- break some more code further down the line!
return false, 'No `message.from` object exists!'
end
return true
end
function utils.get_chat_members(chat_id)
return redis:smembers('chat:' .. chat_id .. ':users')
end
function utils.is_privacy_enabled(user_id)
return redis:exists('user:' .. user_id .. ':opt_out')
end
function utils.uses_administration(chat_id)
return utils.get_setting(chat_id, 'use administration')
end
function utils.is_plugin_allowed(plugin, is_blocklisted)
if not is_blocklisted then
return true
end
for _, p in pairs(configuration.blocklist_plugin_exceptions) do
if p == plugin then
return true
end
end
return false
end
function utils.command_action(chat_id, message_id)
if not chat_id or not message_id then
return false
end
return string.format('action:%s:%s', chat_id, message_id)
end
function utils.is_fed_admin(fed_id, user_id)
if not fed_id or not user_id then
return false
end
return redis:sismember('fedadmins:' .. fed_id, user_id)
end
function utils.is_fed_creator(fed_id, user_id)
if not fed_id or not user_id then
return false
end
local creator = redis:hget('fed:' .. fed_id, 'creator')
return tonumber(user_id) == tonumber(creator) and true or false
end
function utils.is_user_fedbanned(chat_id, user_id)
if not chat_id or not user_id then
return false
end
local feds = redis:smembers('chat:' .. chat_id .. ':feds')
if #feds == 0 then
return false
end
for _, fed in pairs(feds) do
if redis:sismember('fedbans:' .. fed, user_id) then
return true
end
end
return false
end
function utils.has_fed(user_id, fed_id)
if not user_id then
return false
end
local feds = redis:smembers('feds:' .. user_id)
if #feds > 0 then
if fed_id then
for _, fed in pairs(feds) do
if fed_id == fed then
return true, fed
end
end
return false
end
return true, feds[1], true
end
return false
end
function utils.fed_ban_chat_member(chat_id, user_id, fed_list)
if not chat_id or not user_id then
return false
end
fed_list = type(fed_list) == 'table' and fed_list or { fed_list }
api.ban_chat_member(chat_id, user_id)
local success
for _, fed in pairs(fed_list) do
success = redis:sadd('fedbans:' .. fed, user_id)
end
return success
end
function utils.fed_unban_chat_member(chat_id, user_id, fed_list)
if not chat_id or not user_id then
return false
end
fed_list = type(fed_list) == 'table' and fed_list or { fed_list }
local success
api.unban_chat_member(chat_id, user_id)
for _, fed in pairs(fed_list) do
success = redis:srem('fedbans:' .. fed, user_id)
end
return success
end
function utils.is_fed_banned(fed_id, user_id)
if not fed_id or not user_id then
return false
end
return redis:sismember('fedbans:' .. fed_id, user_id) and true or false
end
function utils.get_feds(chat_id)
if not chat_id then
return false
end
return redis:smembers('chat:' .. chat_id .. ':feds')
end
function utils.get_fed_bans(fed_id)
if not fed_id then
return false
end
return #redis:smembers('fedbans:' .. fed_id)
end
function utils.fed_allowlist(chat_id, user_id)
if not chat_id or not user_id then
return false
end
return redis:sadd('fedallowlist:' .. chat_id, user_id)
end
function utils.is_user_fed_allowlisted(chat_id, user_id)
if not chat_id or not user_id then
return false
end
return redis:sismember('fedallowlist:' .. chat_id, user_id) and true or false
end
-function utils.is_duplicate(tab, val)
- local seen = {}
- local duplicated = {}
- for i = 1, #tab do
- local element = tab[i]
- if seen[element] then
- duplicated[element] = true
- else
- seen[element] = true
- end
- end
- if val and duplicated[val] then
- return true
- elseif val then
- return false
- end
- return duplicated
-end
-
-function utils.is_valid_url(url, parts, any)
- if not url:match('^[Hh][Tt][Tt][Pp][Ss]?://') and not any then
- url = 'http://' .. url
- end
- -- Thanks to https://stackoverflow.com/questions/23590304/finding-a-url-in-a-string-lua-pattern
- local url, protocol, subdomain, tld, colon, port, slash, path = string.match(url, '^(([%w_.~!*:@&+$/?%%#-]-)(%w[-.%w]*%.)(%w+)(:?)(%d*)(/?)([%w_.~!*:@&+$/?%%#=-]*))$')
- if parts then
- return {
- ['url'] = url,
- ['protocol'] = protocol,
- ['subdomain'] = subdomain,
- ['tld'] = tld,
- ['colon'] = colon,
- ['port'] = port,
- ['slash'] = slash,
- ['path'] = path
- }
- end
- return url and true or false, url
-end
-
return utils
\ No newline at end of file
diff --git a/mattata.lua b/mattata.lua
index a11dc96..5edc8fc 100644
--- a/mattata.lua
+++ b/mattata.lua
@@ -1,1389 +1,1406 @@
--[[
_ _ _
_ __ ___ __ _| |_| |_ __ _| |_ __ _
| '_ ` _ \ / _` | __| __/ _` | __/ _` |
| | | | | | (_| | |_| || (_| | || (_| |
|_| |_| |_|\__,_|\__|\__\__,_|\__\__,_|
- v1.4.1
+ v1.5
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
See LICENSE for details
]]
local mattata = {}
local https = require('ssl.https')
local ltn12 = require('ltn12')
local json = require('dkjson')
local redis = dofile('libs/redis.lua')
local configuration = require('configuration')
local api = require('telegram-bot-lua.core').configure(configuration.bot_token)
local tools = require('telegram-bot-lua.tools')
local socket = require('socket')
local utils = dofile('libs/utils.lua')
local html = require('htmlEntities')
local plugin_list = {}
local administrative_plugin_list = {}
local inline_plugin_list = {}
function mattata:init()
if mattata.is_reloading then
configuration = require('configuration')
mattata.is_reloading = false
end
self.info = api.info -- Set the bot's information to the object fetched from the Telegram bot API.
mattata.info = api.info
self.plugins = {} -- Make a table for the bot's plugins.
self.api = api
self.tools = tools
self.configuration = configuration
self.beta_plugins = {}
+ self.chats = {}
+ self.users = {}
for k, v in ipairs(configuration.plugins) do -- Iterate over all of the configured plugins.
local true_path = v
for _, p in pairs(configuration.administrative_plugins) do
if v == p then
true_path = 'administration.' .. v
end
end
for _, p in pairs(configuration.beta_plugins) do
if v == p then
table.insert(self.beta_plugins, v)
end
end
local plugin = require('plugins.' .. true_path) -- Load each plugin.
if not plugin then
error('Invalid plugin: ' .. true_path)
elseif mattata.is_duplicate(configuration.plugins, v) then
error('Duplicate plugin: ' .. v)
end
plugin.is_administrative = true_path:match('^administration%.') and true or false
self.plugins[k] = plugin
self.plugins[k].name = v
if self.beta_plugins[v] then
plugin.is_beta_plugin = true
end
if plugin.init then -- If the plugin has an `init` function, run it.
plugin.init(self, configuration)
end
plugin.is_administrative = (self.plugins[k].name == 'administration' or true_path:match('^administration%.')) and true or false
-- By default, a plugin doesn't have inline functionality; but, if it does, set it to `true` appropriately.
plugin.is_inline = plugin.on_inline_query and true or false
plugin.commands = plugin.commands or {} -- If the plugin hasn't got any commands configured, then set a blank
-- table, so when it comes to iterating over the commands later on, the bot won't encounter any problems.
if plugin.help and not plugin.is_beta_plugin then -- If the plugin has help documentation, then insert it into other tables (where necessary).
if plugin.is_administrative then
table.insert(administrative_plugin_list, plugin.help)
else
table.insert(plugin_list, plugin.help)
if plugin.is_inline then -- If the plugin is inline and has documentation, then insert the documentation into
-- the `inline_plugin_list` table.
table.insert(inline_plugin_list, plugin.help)
end
end
plugin.help = 'Usage:\n' .. plugin.help:gsub('%. (Alias)', '.\n%1') -- Make the plugin's documentation style all nicely unified, for consistency.
end
self.plugin_list = plugin_list
self.inline_plugin_list = inline_plugin_list
self.administrative_plugin_list = administrative_plugin_list
end
print(configuration.connected_message)
local info_message = '\tUsername: @' .. self.info.username .. '\n\tName: ' .. self.info.name .. '\n\tID: ' .. self.info.id
print('\n' .. info_message .. '\n')
if redis:get('mattata:version') ~= configuration.version then
local success = dofile('migrate.lua')
print(success)
end
self.version = configuration.version
-- Make necessary database changes if the version has changed.
if not redis:get('mattata:version') or redis:get('mattata:version') ~= self.version then
redis:set('mattata:version', self.version)
end
self.last_update = self.last_update or 0 -- If there is no last update known, make it 0 so the bot doesn't encounter any problems when it tries to add the necessary increment.
self.last_backup = self.last_backup or os.date('%V')
self.last_cron = self.last_cron or os.date('%M')
+ self.last_cache = self.last_cache or os.date('%H')
local init_message = '<pre>' .. configuration.connected_message .. '\n\n' .. mattata.escape_html(info_message) .. '\n\n\tPlugins loaded: ' .. #configuration.plugins - #configuration.administrative_plugins .. '\n\tAdministrative plugins loaded: ' .. #configuration.administrative_plugins .. '</pre>'
mattata.send_message(configuration.log_chat, init_message:gsub('\t', ''), 'html')
for _, admin in pairs(configuration.admins) do
mattata.send_message(admin, init_message:gsub('\t', ''), 'html')
end
local shutdown = redis:get('mattata:shutdown')
if shutdown then
local chat_id, message_id = shutdown:match('^(%-?%d+):(%d*)$')
mattata.edit_message_text(chat_id, message_id, 'Successfully rebooted!')
redis:del('mattata:shutdown')
end
return true
end
-- Set a bunch of function aliases, for consistency & compatibility.
for i, v in pairs(api) do
mattata[i] = v
end
for i, v in pairs(tools) do
mattata[i] = v
end
for i, v in pairs(utils) do
if i ~= 'init' then
mattata[i] = v
end
end
function mattata:run(_, token)
-- mattata's main long-polling function which repeatedly checks the Telegram bot API for updates.
-- The objects received in the updates are then further processed through object-specific functions.
token = token or configuration.bot_token
assert(token, 'You need to enter your Telegram bot API token in configuration.lua, or pass it as the second argument when using the mattata:run() function!')
mattata.is_running = mattata.init(self) -- Initialise the bot.
utils.init(self, configuration)
while mattata.is_running do -- Perform the main loop whilst the bot is running.
local success = api.get_updates( -- Check the Telegram bot API for updates.
configuration.updates.timeout,
self.last_update + 1,
configuration.updates.limit,
json.encode(
{
'message',
'edited_message',
'inline_query',
'callback_query'
}
),
configuration.use_beta_endpoint or false
)
if success and success.result then
for _, v in ipairs(success.result) do
self.last_update = v.update_id
self.execution_time = socket.gettime()
if v.message or v.edited_message then
if v.edited_message then
v.message = v.edited_message
v.edited_message = nil
v.message.old_date = v.message.date
v.message.date = v.message.edit_date
v.message.edit_date = nil
v.message.is_edited = true
else
v.message.is_edited = false
end
if v.message.reply_to_message then
v.message.reply = v.message.reply_to_message -- Make the `update.message.reply_to_message`
-- object `update.message.reply` to make any future handling easier.
v.message.reply_to_message = nil -- Delete the old value by setting its value to nil.
end
mattata.on_message(self, v.message)
if configuration.debug then
print(
string.format(
'%s[36m[Update #%s] Message%s from %s to %s: %s%s[0m',
string.char(27),
v.update_id,
v.message.is_edited and ' edit' or '',
v.message.from.id,
v.message.chat.id,
v.message.text,
string.char(27)
)
)
end
elseif v.inline_query then
mattata.on_inline_query(self, v.inline_query)
if configuration.debug then
print(
string.format(
'%s[35m[Update #%s] Inline query from %s%s[0m',
string.char(27),
v.update_id,
v.inline_query.from.id,
string.char(27)
)
)
end
elseif v.callback_query then
if v.callback_query.message and v.callback_query.message.reply_to_message then
v.callback_query.message.reply = v.callback_query.message.reply_to_message
v.callback_query.message.reply_to_message = nil
end
mattata.on_callback_query(self, v.callback_query.message, v.callback_query)
if configuration.debug then
print(
string.format(
'%s[33m[Update #%s] Callback query from %s%s[0m',
string.char(27),
v.update_id,
v.callback_query.from.id,
string.char(27)
)
)
end
end
self.result_time = socket.gettime() - self.execution_time
if configuration.debug then
print('Update #' .. v.update_id .. ' took ' .. self.result_time .. ' seconds to process.')
end
end
else
mattata.log_error('There was an error retrieving updates from the Telegram bot API!')
end
if self.last_backup ~= os.date('%V') then -- If it's been a week since the last backup, perform another backup.
self.last_backup = os.date('%V') -- Set the last backup time to now, since we're
-- now performing one!
print(io.popen('./backup.sh'):read('*all'))
end
if self.last_cron ~= os.date('%M') then -- Perform minutely CRON jobs.
self.last_cron = os.date('%M')
for i = 1, #self.plugins do
local plugin = self.plugins[i]
if plugin and plugin.cron then
local cron_success, res = pcall(function()
plugin.cron(self, configuration)
end)
if not cron_success then
mattata.exception(self, res, 'CRON: ' .. i, configuration.log_chat)
end
end
end
end
+ if self.last_cache ~= os.date('%H') then -- Reset the bot's cache.
+ self.last_cache = os.date('%H')
+ self.chats = {}
+ self.users = {}
+ end
end
print(self.info.first_name .. ' is shutting down...')
end
function mattata:on_message(message)
-- If the message is old or is missing necessary fields/values, then we'll stop and allow the bot to start processing the next update(s).
-- If the message was sent from a blocklisted chat, then we'll stop because we don't want the bot to respond there.
if not mattata.is_valid(message) then
return false
elseif redis:get('blocklisted_chats:' .. message.chat.id) then
return mattata.leave_chat(message.chat.id)
end
message = mattata.sort_message(message) -- Process the message.
self.is_user_blocklisted, self.is_globally_blocklisted, self.is_globally_banned = mattata.is_user_blocklisted(message)
-- We only want this functionality if the bot owner has been granted API permission to SpamWatch!
self.is_spamwatch_blocklisted = configuration.keys.spamwatch ~= '' and mattata.is_spamwatch_blocklisted(message) or false
if self.is_globally_banned and message.chat.type ~= 'private' then -- Only for the worst of the worst
mattata.ban_chat_member(message.chat.id, message.from.id)
end
local language = require('languages.' .. mattata.get_user_language(message.from.id))
if mattata.is_group(message) and mattata.get_setting(message.chat.id, 'force group language') then
language = require('languages.' .. (mattata.get_value(message.chat.id, 'group language') or 'en_gb'))
end
self.language = language
if mattata.process_spam(message, configuration) then
return false
end
-- Perform the following actions if the user isn't blocklisted.
if not self.is_user_blocklisted then
- mattata.process_afk(message)
+ mattata.process_afk(self, message)
mattata.process_language(self, message)
if message.text then
message = mattata.process_natural_language(self, message)
end
message = mattata.process_stickers(message)
message = mattata.check_links(message, false, true, false, true)
message = mattata.process_deeplinks(message)
-- If the user isn't current AFK, and they say they're going to be right back, we can
-- assume that they are now going to be AFK, so we'll help them out and set them that
-- way by making the message text the /afk command, which will later trigger the plugin.
if (message.text:lower():match('^i?\'?l?l? ?[bg][rt][bg].?$') and not redis:hget('afk:' .. message.from.id, 'since')) then
message.text = '/afk'
end
-- A boolean value to decide later on, whether the message is intended for the current plugin from the iterated table.
+ message = mattata.process_nicknames(message)
+ if not self.chats[tostring(message.chat.id)] then
+ self.chats[tostring(message.chat.id)] = message.chat
+ self.chats[tostring(message.chat.id)].disabled_plugins = redis:smembers('disabled_plugins:' .. message.chat.id) or {}
+ end
end
self.is_command = false
self.is_command_done = false
self.is_allowed_beta_access = false
self.is_telegram = false
-- If the message is one of those pesky Telegram channel pins, it won't send a service message. We'll trick it.
if message.from.id == 777000 and message.forward_from_chat and message.forward_from_chat.type == 'channel' then
self.is_telegram = true
message.is_service_message = true
message.service_message = 'pinned_message'
message.pinned_message = {
['text'] = message.text,
['date'] = message.date,
['chat'] = message.chat,
['from'] = message.from,
['message_id'] = message.message_id,
['entities'] = message.entities,
['forward_from_message_id'] = message.forward_from_message_id,
['forward_from_chat'] = message.forward_from_chat,
['forward_date'] = message.forward_date
}
end
if message.text:match('^[/!#][%w_]+') and message.chat.type == 'supergroup' then
local command, input = message.text:lower():match('^[/!#]([%w_]+)(.*)$')
local all = redis:hgetall('chat:' .. message.chat.id .. ':aliases')
for alias, original in pairs(all) do
if command == alias then
message.text = '/' .. original .. input
message.is_alias = true
break
end
end
end
-- This is the main loop which iterates over configured plugins and runs the appropriate functions.
for _, plugin in ipairs(self.plugins) do
- if plugin.is_beta_plugin and mattata.is_global_admin(message.from.id) then
- self.is_allowed_beta_access = true
- end
- if not plugin.is_beta_plugin or (plugin.is_beta_plugin and self.is_allowed_beta_access) then
- local commands = #plugin.commands or {}
- for i = 1, commands do
- if message.text:match(plugin.commands[i]) and mattata.is_plugin_allowed(plugin.name, self.is_user_blocklisted, configuration) and not self.is_command_done and not self.is_telegram and (not message.is_edited or mattata.is_global_admin(message.from.id)) then
- self.is_command = true
- message.command = plugin.commands[i]:match('([%w_%-]+)')
- if plugin.on_message and not mattata.is_plugin_disabled(plugin.name, message) then
- local success, result = pcall(function()
- return plugin.on_message(self, message, configuration, language)
- end)
- if not success then
- mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text), configuration.log_chat)
- end
- if mattata.get_setting(message.chat.id, 'delete commands') and self.is_command and not redis:sismember('chat:' .. message.chat.id .. ':no_delete', tostring(plugin.name)) and not message.is_natural_language then
- mattata.delete_message(message.chat.id, message.message_id)
+ if not mattata.is_plugin_disabled(self, plugin.name, message) then
+ if plugin.is_beta_plugin and mattata.is_global_admin(message.from.id) then
+ self.is_allowed_beta_access = true
+ end
+ if not plugin.is_beta_plugin or (plugin.is_beta_plugin and self.is_allowed_beta_access) then
+ local commands = #plugin.commands or {}
+ for i = 1, commands do
+ if message.text:match(plugin.commands[i]) and mattata.is_plugin_allowed(plugin.name, self.is_user_blocklisted, configuration) and not self.is_command_done and not self.is_telegram and (not message.is_edited or mattata.is_global_admin(message.from.id)) then
+ self.is_command = true
+ message.command = plugin.commands[i]:match('([%w_%-]+)')
+ if plugin.on_message then
+ local success, result = pcall(function()
+ return plugin.on_message(self, message, configuration, language)
+ end)
+ if not success then
+ mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text), configuration.log_chat)
+ end
+ if mattata.get_setting(message.chat.id, 'delete commands') and self.is_command and not redis:sismember('chat:' .. message.chat.id .. ':no_delete', tostring(plugin.name)) and not message.is_natural_language then
+ mattata.delete_message(message.chat.id, message.message_id)
+ end
+ self.is_command_done = true
end
- self.is_command_done = true
end
end
end
- end
- -- Allow plugins to handle new chat participants.
- if message.new_chat_members and plugin.on_member_join and not mattata.is_plugin_disabled(plugin.name, message) then
- local success, result = pcall(function()
- return plugin.on_member_join(self, message, configuration, language)
- end)
- if not success then
- mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text),
- configuration.log_chat)
+ -- Allow plugins to handle new chat participants.
+ if message.new_chat_members and plugin.on_member_join then
+ local success, result = pcall(function()
+ return plugin.on_member_join(self, message, configuration, language)
+ end)
+ if not success then
+ mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text),
+ configuration.log_chat)
+ end
end
- end
- -- Allow plugins to handle every new message (handy for anti-spam).
- if (message.text or message.is_media) and plugin.on_new_message and not mattata.is_plugin_disabled(plugin.name, message) then
- local success, result = pcall(function()
- return plugin.on_new_message(self, message, configuration, language)
- end)
- if not success then
- mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text or tostring(message.media_type),
- configuration.log_chat))
+ -- Allow plugins to handle every new message (handy for anti-spam).
+ if (message.text or message.is_media) and plugin.on_new_message then
+ local success, result = pcall(function()
+ return plugin.on_new_message(self, message, configuration, language)
+ end)
+ if not success then
+ mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text or tostring(message.media_type),
+ configuration.log_chat))
+ end
end
- end
- -- Allow plugins to handle service messages, and pass the type of service message before the message object.
- if message.is_service_message and plugin.on_service_message and not mattata.is_plugin_disabled(plugin.name, message) then
- local success, result = pcall(function()
- return plugin.on_service_message(self, message.service_message:gsub('_', ' '), message, configuration, language)
- end)
- if not success then
- mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text or tostring(message.media_type),
- configuration.log_chat))
+ -- Allow plugins to handle service messages, and pass the type of service message before the message object.
+ if message.is_service_message and plugin.on_service_message then
+ local success, result = pcall(function()
+ return plugin.on_service_message(self, message.service_message:gsub('_', ' '), message, configuration, language)
+ end)
+ if not success then
+ mattata.exception(self, result, string.format('%s: %s', message.from.id, message.text or tostring(message.media_type),
+ configuration.log_chat))
+ end
end
end
end
- mattata.process_message(self, message, language)
+ mattata.process_message(self, message)
self.is_done = true
self.is_command_done = false
self.is_ai = false
return
end
function mattata:on_inline_query(inline_query)
if not inline_query.from then
return false, 'No `inline_query.from` object was found!'
elseif redis:get('global_blocklist:' .. inline_query.from.id) then
return false, 'This user is globally blocklisted!'
end
local language = require('languages.' .. mattata.get_user_language(inline_query.from.id))
inline_query.offset = inline_query.offset and tonumber(inline_query.offset) or 0
for _, plugin in ipairs(self.plugins) do
local plugins = plugin.commands or {}
for i = 1, #plugins do
local command = plugin.commands[i]
if not inline_query then
return false, 'No `inline_query` object was found!'
end
if inline_query.query:match(command)
and plugin.on_inline_query
then
local success, result = pcall(
function()
return plugin.on_inline_query(self, inline_query, configuration, language)
end
)
if not success then
local exception = string.format('%s: %s', inline_query.from.id, inline_query.query)
mattata.exception(self, result, exception, configuration.log_chat)
return false, result
elseif not result then
return api.answer_inline_query(
inline_query.id,
api.inline_result()
:id()
:type('article')
:title(configuration.errors.results)
:description(plugin.help)
:input_message_content(api.input_text_message_content(plugin.help))
)
end
end
end
end
if not inline_query.query or inline_query.query:gsub('%s', '') == '' then
local offset = inline_query.offset and tonumber(inline_query.offset) or 0
local list = mattata.get_inline_list(self.info.username, offset)
if #list == 0 then
local title = 'No more results found!'
local description = 'There were no more inline features found. Use @' .. self.info.username .. ' <query> to search for more information about commands matching the given search query.'
return mattata.send_inline_article(inline_query.id, title, description)
end
return mattata.answer_inline_query(inline_query.id, json.encode(list), 0, false, tostring(offset + 50))
end
local help = require('plugins.help')
return help.on_inline_query(self, inline_query, configuration, language)
end
function mattata:on_callback_query(message, callback_query)
if not callback_query.from then return false end
if not callback_query.message or not callback_query.message.chat then
message = {
['chat'] = {},
['message_id'] = callback_query.inline_message_id,
['from'] = callback_query.from
}
else
message = callback_query.message
message.exists = true
+ message = mattata.process_nicknames(message)
+ end
+ if not self.chats[tostring(message.chat.id)] then
+ self.chats[tostring(message.chat.id)] = message.chat
+ self.chats[tostring(message.chat.id)].disabled_plugins = redis:smembers('disabled_plugins:' .. message.chat.id) or {}
end
local language = require('languages.' .. mattata.get_user_language(callback_query.from.id))
if message.chat.id and mattata.is_group(message) and mattata.get_setting(message.chat.id, 'force group language') then
language = require('languages.' .. (mattata.get_value(message.chat.id, 'group language') or 'en_gb'))
end
self.language = language
if redis:get('global_blocklist:' .. callback_query.from.id) and not callback_query.data:match('^join_captcha') and not mattata.is_global_admin(callback_query.from.id) then
return false, 'This user is globally blocklisted!'
elseif message and message.exists then
if message.reply and message.chat.type ~= 'channel' and callback_query.from.id ~= message.reply.from.id and not callback_query.data:match('^game:') and not callback_query.data:match('^report:') and not mattata.is_global_admin(callback_query.from.id) then
local output = 'Only ' .. message.reply.from.first_name .. ' can use this!'
return mattata.answer_callback_query(callback_query.id, output)
end
end
for _, plugin in ipairs(self.plugins) do
if not callback_query.data or not callback_query.from then
return false
elseif plugin.name == callback_query.data:match('^(.-):.-$') and plugin.on_callback_query then
callback_query.data = callback_query.data:match('^[%a_]+:(.-)$')
if not callback_query.data then
plugin = callback_query.data
callback_query = ''
end
local success, result = pcall(
function()
return plugin.on_callback_query(self, callback_query, message or false, configuration, language)
end
)
if not success then
mattata.send_message(configuration.admins[1], json.encode(callback_query, {indent=true}))
-- mattata.answer_callback_query(callback_query.id, language['errors']['generic'])
local exception = string.format('%s: %s', callback_query.from.id, callback_query.data)
mattata.exception(self, result, exception, configuration.log_chat)
return false, result
end
end
end
return true
end
mattata.send_message = api.send_message
-- A variant of mattata.send_message(), optimised for sending a message as a reply that forces a
-- reply back from the user.
function mattata.send_force_reply(message, text, parse_mode, disable_web_page_preview, token)
local success = api.send_message(
message,
text,
parse_mode,
disable_web_page_preview,
false,
message.message_id,
'{"force_reply":true,"selective":true}',
token
)
return success
end
function mattata.get_chat(chat_id, only_api, token)
+ local user = mattata.get_user(chat_id)
+ if user then
+ return user
+ end
local success = api.get_chat(chat_id, token)
if only_api then -- stops antispam using usernames stored in the database
return success
- elseif success and success.result and success.result.type and success.result.type == 'private' then
+ elseif success and success.result.type == 'private' then
mattata.process_user(success.result)
- elseif success and success.result then
+ elseif success then
mattata.process_chat(success.result)
end
+ chat_id = success and success.result.id or chat_id
+ local result = redis:hgetall('chat:' .. tostring(chat_id) .. ':info')
+ if not result or type(result) == 'table' and not next(result) then
+ return false
+ end
+ success.result = result
+ if not success.result.id then
+ success.result.id = chat_id
+ redis:hset('chat:' .. chat_id .. ':info', 'id', chat_id)
+ end
return success
end
-function mattata.is_plugin_disabled(plugin, message, is_administrative)
+function mattata:is_plugin_disabled(plugin, message)
if not plugin or not message then
return false
- elseif type(message) == 'table' and message.chat.type == 'supergroup' and mattata.is_group_admin(message.chat.id, message.from.id) and mattata.get_setting(message.chat.id, 'enable plugins for admins') then
- return false
end
- is_administrative = is_administrative or false
plugin = plugin:lower():gsub('^administration/', '')
- if type(message) == 'table' and message.chat then
- message = message.chat.id
- end
if mattata.table_contains(configuration.permanent_plugins, plugin) then
return false
+ elseif type(message) ~= 'table' then
+ message = {
+ ['chat'] = {
+ ['id'] = message
+ }
+ }
+ if tostring(message.chat.id):match('^%-100') then
+ message.chat.type = 'supergroup'
+ else
+ message.chat.type = 'private'
+ end
end
- if is_administrative and not mattata.get_setting(message, 'use administration') and plugin ~= 'administration' then
- return true
+ if not self.chats[tostring(message.chat.id)] then
+ self.chats[tostring(message.chat.id)] = message.chat
+ end
+ if not self.chats[tostring(message.chat.id)].disabled_plugins then
+ self.chats[tostring(message.chat.id)].disabled_plugins = redis:smembers('disabled_plugins:' .. message.chat.id)
+ end
+ if not mattata.table_contains(self.chats[tostring(message.chat.id)].disabled_plugins, plugin) then
+ return false
end
- local exists = redis:sismember('disabled_plugins:' .. message, plugin)
+ local exists = redis:sismember('disabled_plugins:' .. message.chat.id, plugin)
return exists and true or false
end
function mattata:exception(err, message, log_chat)
local output = string.format(
'[%s]\n%s: %s\n%s\n',
os.date('%X'),
self.info.username,
mattata.escape_html(err) or '',
mattata.escape_html(message)
)
if log_chat then
return mattata.send_message(
log_chat,
string.format('<pre>%s</pre>', output),
'html'
)
end
return output
end
function mattata.is_group_admin(chat_id, user_id, is_real_admin)
if not chat_id or not user_id then
return false
elseif mattata.is_global_admin(chat_id) or mattata.is_global_admin(user_id) then
return true
elseif not is_real_admin and mattata.is_group_mod(chat_id, user_id) then
return true
end
local user, res = mattata.get_chat_member(chat_id, user_id)
if not user or not user.result then
return false, res
elseif user.result.status == 'creator' or user.result.status == 'administrator' then
return true, res
end
return false, user.result.status
end
function mattata.is_group_mod(chat_id, user_id)
if not chat_id or not user_id then
return false
elseif redis:sismember('administration:' .. chat_id .. ':mods', user_id) then
return true
end
return false
end
function mattata.process_chat(chat)
chat.id_str = tostring(chat.id)
if chat.type == 'private' then
return mattata.process_user(chat)
end
if not redis:hexists('chat:' .. chat.id .. ':info', 'id') then
print(
string.format(
'%s[34m[+] Added the chat %s to the database!%s[0m',
string.char(27),
chat.username and '@' .. chat.username or chat.id,
string.char(27)
)
)
end
redis:hset('chat:' .. chat.id .. ':info', 'title', chat.title)
redis:hset('chat:' .. chat.id .. ':info', 'type', chat.type)
if chat.username then
chat.username = chat.username:lower()
redis:hset('chat:' .. chat.id .. ':info', 'username', chat.username)
redis:set('username:' .. chat.username, chat.id)
if not redis:sismember('chat:' .. chat.id .. ':usernames', chat.username) then
redis:sadd('chat:' .. chat.id .. ':usernames', chat.username)
end
end
redis:hset('chat:' .. chat.id .. ':info', 'id', chat.id)
return chat
end
function mattata.process_user(user)
if not user then return user end
if not user.id or not user.first_name then return false end
redis:hset('user:' .. user.id .. ':info', 'id', user.id)
local new = false
user.name = user.first_name
if user.last_name then
user.name = user.name .. ' ' .. user.last_name
end
if not redis:hget('user:' .. user.id .. ':info', 'id') and configuration.debug then
print(
string.format(
'%s[34m[+] Added the user %s to the database!%s%s[0m',
string.char(27),
user.username and '@' .. user.username or user.id,
user.language_code and ' Language: ' .. user.language_code or '',
string.char(27)
)
)
new = true
elseif configuration.debug then
print(
string.format(
'%s[34m[+] Updated information about the user %s in the database!%s%s[0m',
string.char(27),
user.username and '@' .. user.username or user.id,
user.language_code and ' Language: ' .. user.language_code or '',
string.char(27)
)
)
end
redis:hset('user:' .. user.id .. ':info', 'type', 'private')
redis:hset('user:' .. user.id .. ':info', 'name', user.name)
redis:hset('user:' .. user.id .. ':info', 'first_name', user.first_name)
if user.last_name then
redis:hset('user:' .. user.id .. ':info', 'last_name', user.last_name)
else
redis:hdel('user:' .. user.id .. ':info', 'last_name')
end
if user.username then
user.username = user.username:lower()
redis:hset('user:' .. user.id .. ':info', 'username', user.username)
redis:set('username:' .. user.username, user.id)
if not redis:sismember('user:' .. user.id .. ':usernames', user.username) then
redis:sadd('user:' .. user.id .. ':usernames', user.username)
end
else
redis:hdel('user:' .. user.id .. ':info', 'username')
end
if user.language_code then
if mattata.does_language_exist(user.language_code) and not redis:hget('chat:' .. user.id .. ':settings', 'language') then
-- If a translation exists for the user's language code, and they haven't selected
-- a language already, then set it as their primary language!
redis:hset('chat:' .. user.id .. ':settings', 'language', user.language_code)
end
redis:hset('user:' .. user.id .. ':info', 'language_code', user.language_code)
else
redis:hdel('user:' .. user.id .. ':info', 'language_code')
end
redis:hset('user:' .. user.id .. ':info', 'is_bot', tostring(user.is_bot))
if new then
redis:hset('user:' .. user.id .. ':info', 'id', user.id)
end
if redis:get('nick:' .. user.id) then
user.first_name = redis:get('nick:' .. user.id)
user.name = user.first_name
user.last_name = nil
end
return user, new
end
function mattata.sort_message(message)
message.is_natural_language = false
message.text = message.text or message.caption or '' -- Ensure there is always a value assigned to message.text.
message.text = message.text:gsub('^/(%a+)%_', '/%1 ')
if message.text:match('^[/!#]start .-$') then -- Allow deep-linking through the /start command.
message.text = '/' .. message.text:match('^[/!#]start (.-)$')
end
message.is_media = mattata.is_media(message)
message.media_type = mattata.media_type(message)
message.file_id = mattata.file_id(message)
message.is_alias = false -- We sort this later.
message.is_service_message, message.service_message = mattata.service_message(message)
if message.caption_entities then
message.entities = message.caption_entities
message.caption_entities = nil
end
if message.from.language_code then
message.from.language_code = message.from.language_code:lower():gsub('%-', '_') -- make it fit with the names of our language files
if message.from.language_code:len() == 2 and message.from.language_code ~= 'en' then
message.from.language_code = message.from.language_code .. '_' .. message.from.language_code
elseif message.from.language_code:len() == 2 or message.from.language_code == 'root' then -- not sure why but some english users were having `root` return as their language
message.from.language_code = 'en_us'
end
end
message.reply = message.reply and mattata.sort_message(message.reply) or nil
if message.from then
message.from = mattata.process_user(message.from)
end
if message.reply then
message.reply.from = mattata.process_user(message.reply.from)
end
if message.forward_from then
message.forward_from = mattata.process_user(message.forward_from)
end
if message.chat and message.chat.type ~= 'private' then
-- Add the user to the set of users in the current chat.
if configuration.administration.store_chat_members and message.from then
if not redis:sismember('chat:' .. message.chat.id .. ':users', message.from.id) then
redis:sadd('chat:' .. message.chat.id .. ':users', message.from.id)
end
end
if message.new_chat_members then
message.chat = mattata.process_chat(message.chat)
for i = 1, #message.new_chat_members do
if configuration.administration.store_chat_users then
redis:sadd('chat:' .. message.chat.id .. ':users', message.new_chat_members[i].id) -- add users to the chat's set in the database
end
message.new_chat_members[i] = mattata.process_user(message.new_chat_members[i])
end
elseif message.left_chat_member then -- if they've left the chat then there's no need for them to be in the set anymore
message.chat = mattata.process_chat(message.chat)
message.left_chat_member = mattata.process_user(message.left_chat_member)
if configuration.administration.store_chat_users then
redis:srem('chat:' .. message.chat.id .. ':users', message.left_chat_member.id)
end
end
end
if message.text and message.chat and message.reply and message.reply.from and message.reply.from.id == api.info.id then
local action = redis:get('action:' .. message.chat.id .. ':' .. message.reply.message_id)
-- If an action was saved for the replied-to message (as part of a multiple step command), then
-- we'll get information about the action.
if action then
message.text = action .. ' ' .. message.text -- Concatenate the saved action's command
-- with the new `message.text`.
message.reply = nil -- This caused some issues with administrative commands which would
-- prioritise replied-to users over users given by arguments.
redis:del(action) -- Delete the action for this message, since we've done what we needed to do
-- with it now.
end
end
if message.entities then
for n, entities in pairs(message.entities) do
if entities.type == 'text_mention' then
message.text = message.text:gsub(message.entities[n].user.first_name, message.entities[n].user.id)
end
end
end
return message
end
function mattata.is_global_admin(id)
for _, v in pairs(configuration.admins) do
if id == v then
return true
end
end
return false
end
function mattata.get_user(input, force_api, is_id_plugin, cache_only)
if tonumber(input) == nil and input then -- check it's not an ID
input = input:match('^%@?(.-)$')
input = redis:get('username:' .. input:lower())
end
if not input or tonumber(input) == nil then -- if it's still not an ID then we'll give up
return false
end
local user = redis:hgetall('user:' .. tostring(input) .. ':info')
if is_id_plugin and user.id then
local success = mattata.get_chat(user.id) -- Try and get latest info about the user for the ID plugin
if success then
return success
end
end
if user.username and not cache_only then
local scrape, scrape_res = https.request('https://t.me/' .. user.username)
if scrape_res == 200 then
local bio = scrape:match('%<div class="tgme_page_description "%>(.-)%</div%>')
if bio then
bio = bio:gsub('%b<>', '')
bio = html.decode(bio)
user.bio = bio
end
end
end
if user.id then
return {
['result'] = {
['id'] = tonumber(user.id),
['type'] = user.type,
['name'] = user.name,
['first_name'] = user.first_name,
['last_name'] = user.last_name,
['username'] = user.username,
['is_bot'] = user.is_bot,
['bio'] = user.bio
}
}
end
if force_api then
return mattata.get_chat(input)
end
return false
end
function mattata.get_inline_list(username, offset)
offset = offset and tonumber(offset) or 0
local inline_list = {}
table.sort(inline_plugin_list)
for k, v in pairs(inline_plugin_list) do
if k > offset and k < offset + 50 then -- The bot API only accepts a maximum of 50 results, hence we need the offset.
v = v:gsub('\n', ' ')
table.insert(
inline_list,
mattata.inline_result()
:type('article')
:id(tostring(k))
:title(v:match('^(/.-) %- .-$'))
:description(v:match('^/.- %- (.-)$'))
:input_message_content(
mattata.input_text_message_content(
string.format(
'• %s - %s\n\nTo use this command inline, you must use the syntax:\n@%s %s',
v:match('^(/.-) %- .-$'),
v:match('^/.- %- (.-)$'),
username,
v:match('^(/.-) %- .-$')
)
)
)
:reply_markup(
mattata.inline_keyboard():row(
mattata.row():switch_inline_query_button('Show me how!', v:match('^(/.-) '))
)
)
)
end
end
return inline_list
end
-function mattata.get_help(is_administrative, chat_id)
+function mattata:get_help(is_administrative, chat_id)
local list_to_use = is_administrative == true and administrative_plugin_list or plugin_list
local help = {}
local count = 1
table.sort(list_to_use)
for _, v in pairs(list_to_use) do
if v:match('^/.- %- .-$') then
-- Do some replacement for plugins that have different primary commands to their plugin name.
local to_match = v:gsub('/np', '/lastfm'):gsub('/r/', '/reddit '):gsub('/s/', '/sed '):gsub('(/cat)', '%1s')
local plugin = to_match:match('^/([%w_]+) .-$')
- if not chat_id or not mattata.is_plugin_disabled(plugin, chat_id) then
+ if not chat_id or not mattata.is_plugin_disabled(self, plugin, chat_id) then
local command, description = v:match('^(.-) %- (.-)$')
local parameters = ' '
if not command then mattata.send_message(configuration.admins[1], v) end
if command:match(' [%[<]') then
command, parameters = command:match('^(.-)( .-)$')
parameters = '<code>' .. mattata.escape_html(parameters) .. '</code> '
end
local output = command .. parameters .. '- <em>' .. mattata.escape_html(description) .. '</em>'
table.insert(help, utf8.char(8226) .. ' ' .. output)
count = count + 1
end
end
end
return help
end
function mattata.format_time(seconds)
if not seconds or tonumber(seconds) == nil then
return false
end
seconds = tonumber(seconds) -- Make sure we're handling a numerical value
local minutes = math.floor(seconds / 60)
if minutes == 0 then
return seconds ~= 1 and seconds .. ' seconds' or seconds .. ' second'
elseif minutes < 60 then
return minutes ~= 1 and minutes .. ' minutes' or minutes .. ' minute'
end
local hours = math.floor(seconds / 3600)
if hours == 0 then
return minutes ~= 1 and minutes .. ' minutes' or minutes .. ' minute'
elseif hours < 24 then
return hours ~= 1 and hours .. ' hours' or hours .. ' hour'
end
local days = math.floor(seconds / 86400)
if days == 0 then
return hours ~= 1 and hours .. ' hours' or hours .. ' hour'
elseif days < 7 then
return days ~= 1 and days .. ' days' or days .. ' day'
end
local weeks = math.floor(seconds / 604800)
if weeks == 0 then
return days ~= 1 and days .. ' days' or days .. ' day'
else
return weeks ~= 1 and weeks .. ' weeks' or weeks .. ' week'
end
end
function mattata.does_language_exist(language)
return pcall( -- nice and simple, perform a pcall to require the language, and if it errors then it doesn't exist
function()
return require('languages.' .. language)
end
)
end
function mattata.save_to_file(content, file_path)
if not content then
return false
end
file_path = file_path or ('/tmp/temp_' .. os.time() .. '.txt')
local file = io.open(file_path, 'w+')
file:write(tostring(content))
file:close()
return true
end
function mattata.insert_keyboard_row(keyboard, first_text, first_callback, second_text, second_callback, third_text, third_callback)
-- todo: get rid of this function as it's dirty, who only allows 3 buttons in a row??
table.insert(
keyboard['inline_keyboard'],
{
{
['text'] = first_text,
['callback_data'] = first_callback
},
{
['text'] = second_text,
['callback_data'] = second_callback
},
{
['text'] = third_text,
['callback_data'] = third_callback
}
}
)
return keyboard
end
function mattata.is_user_blocklisted(message)
if not message or not message.from or not message.chat then
return false, false, false
elseif mattata.is_global_admin(message.from.id) then
return false, false, false
end
local gbanned = redis:get('global_ban:' .. message.from.id) -- Check if the user is globally
-- blocklisted from using the bot.
local group = redis:get('group_blocklist:' .. message.chat.id .. ':' .. message.from.id) -- Check
-- if the user is blocklisted from using the bot in the current group.
local gblocklisted = redis:get('global_blocklist:' .. message.from.id)
return group, gblocklisted, gbanned
end
function mattata.is_spamwatch_blocklisted(message, force_check)
if tonumber(message) ~= nil then -- Add support for passing just the user ID too!
message = {
['from'] = {
['id'] = tonumber(message)
}
}
elseif not message or not message.from then
return false, nil, 'No valid message object was passed! It needs to have a message.from as well!', 404
end
local is_cached = redis:get('not_blocklisted:' .. message.from.id)
if is_cached and not force_check then -- We don't want to perform an HTTPS call every time the bot sees a chat!
return false, nil, 'That user is cached as not blocklisted!', 404
end
local response = {}
local _ = https.request(
{
['url'] = 'https://api.spamwat.ch/banlist/' .. message.from.id,
['method'] = 'GET',
['headers'] = {
['Authorization'] = 'Bearer ' .. configuration.keys.spamwatch
},
['sink'] = ltn12.sink.table(response)
}
)
response = table.concat(response)
local jdat = json.decode(response)
if not jdat then
return false, nil, 'The server appears to be offline', 521
elseif jdat.error then
if jdat.code == 404 then -- The API returns a 404 code when the user isn't in the SpamWatch database
redis:set('not_blocklisted:' .. message.from.id, true)
redis:expire('not_blocklisted:' .. message.from.id, 604800) -- Let the key last a week!
end
return false, jdat, jdat.error, jdat.code
elseif jdat.id then
return true, jdat, 'Success', 200
end
return false, jdat, 'Error!', jdat.code or 404
end
-function mattata.process_afk(message) -- Checks if the message references an AFK user and tells the
+function mattata:process_afk(message) -- Checks if the message references an AFK user and tells the
-- person mentioning them that they are marked AFK. If a user speaks and is currently marked as AFK,
-- then the bot will announce their return along with how long they were gone for.
if message.from.username
and redis:hget('afk:' .. message.from.id, 'since')
- and not mattata.is_plugin_disabled('afk', message)
+ and not mattata.is_plugin_disabled(self, 'afk', message)
and not message.text:match('^[/!#]afk')
and not message.text:lower():match('^i?\'?l?l? ?[bg][rt][bg].?$')
then
local since = os.time() - tonumber(redis:hget('afk:' .. message.from.id, 'since'))
redis:hdel('afk:' .. message.from.id, 'since')
redis:hdel('afk:' .. message.from.id, 'note')
local keys = redis:keys('afk:' .. message.from.id .. ':replied:*')
if #keys > 0 then
for _, key in pairs(keys) do
redis:del(key)
end
end
local output = message.from.first_name .. ' has returned, after being /AFK for ' .. mattata.format_time(since) .. '.'
mattata.send_message(message.chat.id, output)
elseif (message.text:match('@[%w_]+') -- If a user gets mentioned, check to see if they're AFK.
or message.reply) and not redis:get('afk:' .. message.from.id .. ':replied:' .. message.chat.id) then
local username = message.reply and message.reply.from.id or message.text:match('@([%w_]+)')
local success = mattata.get_user(username)
if not success or not success.result or not success.result.id then
return false
end
local exists = redis:hexists('afk:' .. success.result.id, 'since')
if success and success.result and exists then -- If all the checks are positive, the mentioned user is AFK, so we'll tell the person mentioning them that this is the case!
if message.reply then
redis:set('afk:' .. message.from.id .. ':replied:' .. message.chat.id, true)
end
- mattata.send_reply(message, success.result.first_name .. ' is currently AFK!')
+ local output = success.result.first_name .. ' is currently AFK!'
+ local note = redis:hget('afk:' .. message.from.id, 'note')
+ if note then
+ output = output .. '\nNote: ' .. note
+ end
+ mattata.send_reply(message, output)
end
end
end
function mattata.process_stickers(message)
if message.chat.type == 'supergroup' and message.sticker then
-- Process each sticker to see if they are one of the configured, command-performing stickers.
for _, v in pairs(configuration.stickers.ban) do
if message.sticker.file_unique_id == v then
message.text = '/ban'
end
end
for _, v in pairs(configuration.stickers.warn) do
if message.sticker.file_unique_id == v then
message.text = '/warn'
end
end
for _, v in pairs(configuration.stickers.kick) do
if message.sticker.file_unique_id == v then
message.text = '/kick'
end
end
end
return message
end
function mattata:process_natural_language(message)
local text = message.text:lower()
local name = self.info.first_name:lower()
if text:match(name .. '.- ban @?[%w_-]+ ?') then
message.text = '/ban ' .. text:match(name .. '.- ban (@?[%w_-]+) ?')
elseif text:match(name .. '.- warn @?[%w_-]+ ?') then
message.text = '/warn ' .. text:match(name .. '.- warn (@?[%w_-]+) ?')
elseif text:match(name .. '.- kick @?[%w_-]+ ?') then
message.text = '/kick ' .. text:match(name .. '.- kick (@?[%w_-]+) ?')
elseif text:match(name .. '.- unban @?[%w_-]+ ?') then
message.text = '/unban ' .. text:match(name .. '.- unban (@?[%w_-]+) ?')
elseif text:match(name .. '.- resume my music') then
local myspotify = require('plugins.myspotify')
local success = myspotify.reauthorise_account(message.from.id, configuration)
local output = success and myspotify.play(message.from.id) or 'An error occured whilst trying to connect to your Spotify account, are you sure you\'ve connected me to it?'
mattata.send_message(message.chat.id, output)
end
message.is_natural_language = true
return message
end
function mattata.process_spam(message)
if message.forward_from then return false end
local msg_count = tonumber(
redis:get('antispam:' .. message.chat.id .. ':' .. message.from.id) -- Check to see if the user
-- has already sent 1 or more messages to the current chat, in the past 5 seconds.
)
or 1 -- If this is the first time the user has posted in the past 5 seconds, we'll make it 1 accordingly.
redis:setex(
'antispam:' .. message.chat.id .. ':' .. message.from.id,
configuration.administration.global_antispam.ttl, -- set the TTL
msg_count + 1 -- Increase the current message count by 1.
)
if msg_count == configuration.administration.global_antispam.message_warning_amount -- If the user has sent x messages in the past y seconds, send them a warning.
-- and not mattata.is_global_admin(message.from.id)
and message.chat.type == 'private' then
-- Don't run the antispam plugin if the user is configured as a global admin in `configuration.lua`.
mattata.send_reply( -- Send a warning message to the user who is at risk of being blocklisted for sending
-- too many messages.
message,
string.format(
'Hey %s, please don\'t send that many messages, or you\'ll be forbidden to use me for 24 hours!',
message.from.username and '@' .. message.from.username or message.from.name
)
)
elseif msg_count == configuration.administration.global_antispam.message_blocklist_amount -- If the user has sent x messages in the past y seconds, blocklist them globally from
-- using the bot for 24 hours.
-- and not mattata.is_global_admin(message.from.id) -- Don't blocklist the user if they are configured as a global
-- admin in `configuration.lua`.
then
redis:set('global_blocklist:' .. message.from.id, true)
if configuration.administration.global_antispam.blocklist_length ~= -1 and configuration.administration.global_antispam.blocklist_length ~= 'forever' then
redis:expire('global_blocklist:' .. message.from.id, configuration.administration.global_antispam.blocklist_length)
end
return mattata.send_reply(
message,
string.format(
'Sorry, %s, but you have been blocklisted from using me for the next 24 hours because you have been spamming!',
message.from.username and '@' .. message.from.username or message.from.name
)
)
end
return false
end
function mattata:process_language(message)
if message.from.language_code then
if not mattata.does_language_exist(message.from.language_code) then
if not redis:sismember('mattata:missing_languages', message.from.language_code) then -- If we haven't stored the missing language file, add it into the database.
redis:sadd('mattata:missing_languages', message.from.language_code)
end
if (message.text == '/start' or message.text == '/start@' .. self.info.username) and message.chat.type == 'private' then
mattata.send_message(
message.chat.id,
'It appears that I haven\'t got a translation in your language (' .. message.from.language_code .. ') yet. If you would like to voluntarily translate me into your language, please join <a href="https://t.me/mattataDev">my official development group</a>. Thanks!',
'html'
)
end
elseif redis:sismember('mattata:missing_languages', message.from.language_code) then
-- If the language file is found, yet it's recorded as missing in the database, it's probably
-- new, so it is deleted from the database to prevent confusion when processing this list!
redis:srem('mattata:missing_languages', message.from.language_code)
end
end
end
function mattata.process_deeplinks(message)
if message.text:match('^/[%a_]+_%-%d+$') and message.chat.type == 'private' then
message.text = message.text:gsub('^(/[%a_]+)_(.-)$', '%1 %2')
end
return message
end
function mattata.toggle_setting(chat_id, setting, value)
value = (type(value) ~= 'string' and tostring(value) ~= 'nil') and value or true
if not chat_id or not setting then
return false
elseif not redis:hexists('chat:' .. chat_id .. ':settings', tostring(setting)) then
return redis:hset('chat:' .. chat_id .. ':settings', tostring(setting), value)
end
return redis:hdel('chat:' .. chat_id .. ':settings', tostring(setting))
end
function mattata.get_usernames(user_id)
if not user_id then
return false
elseif tonumber(user_id) == nil then
user_id = tostring(user_id):match('^@(.-)$') or tostring(user_id)
user_id = redis:get('username:' .. user_id:lower())
if not user_id then
return false
end
end
return redis:smembers('user:' .. user_id .. ':usernames')
end
function mattata.check_links(message, get_links, only_valid, allowlist, return_message, delete)
message.is_invite_link = false
+ message.is_valid_invite_link = false
local links = {}
if message.entities then
for i = 1, #message.entities do
if message.entities[i].type == 'text_link' then
message.text = message.text .. ' ' .. message.entities[i].url
end
end
end
for n in message.text:gmatch('%@[%w_]+') do
table.insert(links, n:match('^%@([%w_]+)$'))
end
for n in message.text:gmatch('[Tt]%.[Mm][Ee]/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+') do
table.insert(links, n:match('/([Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+)$'))
end
for n in message.text:gmatch('[Tt]%.[Mm][Ee]/[%w_]+') do
if not n:match('/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]$') then
table.insert(links, n:match('/([%w_]+)$'))
end
end
for n in message.text:gmatch('[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]%.[Mm][Ee]/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+') do
table.insert(links, n:match('/([Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+)$'))
end
for n in message.text:gmatch('[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]%.[Mm][Ee]/[%w_]+') do
if not n:match('/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]$') then
table.insert(links, n:match('/([%w_]+)$'))
end
end
for n in message.text:gmatch('[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]%.[Dd][Oo][Gg]/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+') do
table.insert(links, n:match('/([Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/[%w_]+)$'))
end
for n in message.text:gmatch('[Tt][Ee][Ll][Ee][Gg][Rr][Aa][Mm]%.[Dd][Oo][Gg]/[%w_]+') do
if not n:match('/[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]$') then
table.insert(links, n:match('/([%w_]+)$'))
end
end
for n in message.text:gmatch('[Tt][Gg]://[Jj][Oo][Ii][Nn]%?[Ii][Nn][Vv][Ii][Tt][Ee]=[%w_]+') do
table.insert(links, '[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/' .. n:match('=([%w_]+)$'))
end
for n in message.text:gmatch('[Tt][Gg]://[Rr][Ee][Ss][Oo][Ll][Vv][Ee]%?[Dd][Oo][Mm][Aa][Ii][Nn]=[%w_]+') do
table.insert(links, n:match('=([%w_]+)$'))
end
if allowlist then
local count = 0
for _, v in pairs(links) do
v = v:match('^[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]') and v or v:lower()
if delete then
redis:del('allowlisted_links:' .. message.chat.id .. ':' .. v)
else
redis:set('allowlisted_links:' .. message.chat.id .. ':' .. v, true)
end
count = count + 1
end
return string.format(
'%s link%s ha%s been %s in this chat!',
count,
count == 1 and '' or 's',
count == 1 and 's' or 've',
delete and 'blocklisted' or 'allowlisted'
)
end
local checked = {}
local valid = {}
for _, v in pairs(links) do
- if not redis:get('allowlisted_links:' .. message.chat.id .. ':' .. v:lower()) and not mattata.is_allowlisted_link(v:lower()) then
+ if not mattata.is_allowlisted_link(v:lower(), message.chat.id) then
if v:match('^[Jj][Oo][Ii][Nn][Cc][Hh][Aa][Tt]/') then
message.is_invite_link = true
if only_valid then
local str, res = https.request('https://t.me/' .. v)
if res == 200 and str and str:match('tgme_page_title') then
table.insert(valid, v)
+ message.is_valid_invite_link = true
end
end
if not get_links then
return return_message and message or true
end
elseif not mattata.table_contains(checked, v:lower()) then
if not mattata.get_user(v:lower()) then
local success = mattata.get_chat('@' .. v:lower(), true)
if success and success.result and success.result.type ~= 'private' and success.result.id ~= message.chat.id then
message.is_invite_link = true
if not get_links then
return return_message and message or true
end
table.insert(valid, v:lower())
end
table.insert(checked, v:lower())
end
end
end
end
if get_links then
if only_valid then
return valid
end
return checked
end
return return_message and message or false
end
-function mattata:process_message(message, language)
- local break_cycle = false
+function mattata:process_message(message)
if not message.chat then
return true
- elseif self.is_command and not mattata.is_plugin_disabled('commandstats', message.chat.id) and not self.is_blocklisted then
- local command = message.text:match('^([!/#][%w_]+)')
- if command then
- redis:incr('commandstats:' .. message.chat.id .. ':' .. command)
- if not redis:sismember('chat:' .. message.chat.id .. ':commands', command) then
- redis:sadd('chat:' .. message.chat.id .. ':commands', command)
- end
- end
end
- if message.chat and message.chat.type ~= 'private' and not mattata.service_message(message) and not mattata.is_plugin_disabled('statistics', message) and not mattata.is_privacy_enabled(message.from.id) and not self.is_blocklisted then
+ if message.chat and message.chat.type ~= 'private' and not mattata.service_message(message) and not mattata.is_plugin_disabled(self, 'statistics', message) and not mattata.is_privacy_enabled(message.from.id) and not self.is_blocklisted then
redis:incr('messages:' .. message.from.id .. ':' .. message.chat.id)
end
if message.new_chat_members and mattata.get_setting(message.chat.id, 'use administration') and mattata.get_setting(message.chat.id, 'antibot') and not mattata.is_group_admin(message.chat.id, message.from.id) and not mattata.is_global_admin(message.from.id) then
local kicked = {}
local usernames = {}
for _, v in pairs(message.new_chat_members) do
if v.username and v.username:lower():match('bot$') and v.id ~= message.from.id and v.id ~= self.info.id and tostring(v.is_bot) == 'true' then
local success = mattata.kick_chat_member(message.chat.id, v.id)
if success then
table.insert(kicked, mattata.escape_html(v.first_name) .. ' [' .. v.id .. ']')
table.insert(usernames, '@' .. v.username)
end
end
end
if #kicked > 0 and #usernames > 0 and #kicked == #usernames then
local log_chat = mattata.get_log_chat(message.chat.id)
mattata.send_message(log_chat, string.format('<pre>%s [%s] has kicked %s from %s [%s] because anti-bot is enabled.</pre>', mattata.escape_html(self.info.first_name), self.info.id, table.concat(kicked, ', '), mattata.escape_html(message.chat.title), message.chat.id), 'html')
return mattata.send_message(message, string.format('Kicked %s because anti-bot is enabled.', table.concat(usernames, ', ')))
end
end
- if message.chat.type == 'supergroup' and mattata.get_setting(message.chat.id, 'use administration') and mattata.get_setting(message.chat.id, 'word filter') and not mattata.is_group_admin(message.chat.id, message.from.id) and not mattata.is_global_admin(message.from.id) then
- local words = redis:smembers('word_filter:' .. message.chat.id)
- if words and #words > 0 then
- for _, v in pairs(words) do
- local text = message.text:lower()
- if text:match('^' .. v:lower() .. '$') or text:match('^' .. v:lower() .. ' ') or text:match(' ' .. v:lower() .. ' ') or text:match(' ' .. v:lower() .. '$') then
- mattata.delete_message(message.chat.id, message.message_id)
- local action = mattata.get_setting(message.chat.id, 'ban not kick') and mattata.ban_chat_member or mattata.kick_chat_member
- local success = action(message.chat.id, message.from.id)
- if success then
- if mattata.get_setting(message.chat.id, 'log administrative actions') then
- local log_chat = mattata.get_log_chat(message.chat.id)
- mattata.send_message(log_chat, string.format('<pre>%s [%s] has kicked %s [%s] from %s [%s] for sending one or more prohibited words.</pre>', mattata.escape_html(self.info.first_name), self.info.id, mattata.escape_html(message.from.first_name), message.from.id, mattata.escape_html(message.chat.title), message.chat.id), 'html')
- end
- mattata.send_message(message.chat.id, string.format('Kicked %s for sending one or more prohibited words.', message.from.username and '@' .. message.from.username or message.from.first_name))
- break_cycle = true
- end
- end
- end
- if break_cycle then return true end
- end
+end
+
+function mattata.process_nicknames(message)
+ local nickname = redis:hget('user:' .. message.from.id .. ':info', 'nickname')
+ if nickname then
+ message.from.original_name = message.from.name
+ message.from.has_nickname = true
+ message.from.name = nickname
+ message.from.first_name = nickname
+ message.from.last_name = nil
+ else
+ message.from.has_nickname = false
end
- if message.new_chat_members and message.chat.type ~= 'private' and mattata.get_setting(message.chat.id, 'use administration') and mattata.get_setting(message.chat.id, 'welcome message') and not mattata.get_setting(message.chat.id, 'require captcha') then
- if message.new_chat_members[1].id == self.info.id or (message.new_chat_members[1].username and message.new_chat_members[1].username:match('[Bb][Oo][Tt]$')) then
- return false -- we don't want to send a welcome message if it's us or another bot (we're going to assume normal users don't have a username ending in bot...)
- end
- local chat_member = mattata.get_chat_member(message.chat.id, message.new_chat_members[1].id)
- if chat_member.result.can_send_messages == false then
- return mattata.delete_message(message.chat.id, message.message_id)
- end
- local name = message.new_chat_members[1].first_name
- local first_name = mattata.escape_markdown(name)
- if message.new_chat_members[1].last_name then
- name = name .. ' ' .. message.new_chat_members[1].last_name
- end
- name = name:gsub('%%', '%%%%')
- name = mattata.escape_markdown(name)
- local title = message.chat.title:gsub('%%', '%%%%')
- title = mattata.escape_markdown(title)
- local username = message.new_chat_members[1].username and '@' .. message.new_chat_members[1].username or name
- local welcome_message = mattata.get_value(message.chat.id, 'welcome message') or configuration.join_messages
- if type(welcome_message) == 'table' then -- if it's a configured selection of welcome messages we'll just pick a random one
- welcome_message = welcome_message[math.random(#welcome_message)]:gsub('NAME', name)
- end
- welcome_message = welcome_message:gsub('%$user_id', message.new_chat_member.id):gsub('%$chat_id', message.chat.id):gsub('%$first_name', first_name):gsub('%$name', name):gsub('%$title', title):gsub('%$username', username)
- local keyboard = nil
- if mattata.get_setting(message.chat.id, 'send rules on join') then
- keyboard = mattata.inline_keyboard():row(mattata.row():url_button(utf8.char(128218) .. ' ' .. language['welcome']['1'], 'https://t.me/' .. self.info.username .. '?start=' .. message.chat.id .. '_rules'))
+ if message.reply then
+ nickname = redis:hget('user:' .. message.reply.from.id .. ':info', 'nickname')
+ if nickname then
+ message.reply.from.original_name = message.reply.from.name
+ message.reply.from.has_nickname = true
+ message.reply.from.name = nickname
+ message.reply.from.first_name = nickname
+ message.reply.from.last_name = nil
+ else
+ message.reply.from.has_nickname = false
end
- return mattata.send_message(message, welcome_message, 'markdown', true, false, nil, keyboard)
end
- return false
+ return message
end
return mattata
\ No newline at end of file
diff --git a/plugins/administration/join_captcha.lua b/plugins/administration/join_captcha.lua
index 28c9857..b62a356 100644
--- a/plugins/administration/join_captcha.lua
+++ b/plugins/administration/join_captcha.lua
@@ -1,157 +1,160 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local join_captcha = {}
local mattata = require('mattata')
local redis = require('libs.redis')
local captcha_lib = require('captcha')
function join_captcha.cron(_, configuration)
local keys = redis:keys('chat:*:captcha:*')
for _, key in pairs(keys) do
local chat_id, user_id = key:match('^chat:(%-?%d+):captcha:(%d+)$')
if not redis:get('captcha:' .. chat_id .. ':' .. user_id) then
local message_id = redis:hget(key, 'id')
mattata.delete_message(chat_id, message_id)
local user = mattata.get_user(user_id, nil, nil, true)
local kicked_user = mattata.get_formatted_user(user_id, user.result.first_name, 'html')
local action = mattata.get_setting(chat_id, 'ban not kick')
local punishment = action and 'Banned' or 'Kicked'
local timeout = mattata.get_setting(chat_id, 'captcha timeout') or configuration.administration.captcha.timeout.default
timeout = math.floor(timeout)
if punishment == 'Banned' then
action = mattata.ban_chat_member
else action = mattata.kick_chat_member end
local success = action(chat_id, user_id)
if not success then
mattata.wipe_redis_captcha(chat_id, user_id)
else
local output = punishment .. ' ' .. kicked_user .. ' <code>[' .. user_id .. ']</code> %sbecause they didn\'t complete the CAPTCHA within %s minutes!'
if mattata.get_setting(chat_id, 'log administrative actions') then
local chat = mattata.get_chat(chat_id)
local log_output = output
if chat then
local title = mattata.escape_html(chat.result.title)
title = 'from ' .. title .. ' <code>[' .. chat.result.id .. ']</code> '
log_output = string.format(log_output, title, timeout)
log_output = log_output .. '\n#chat' .. tostring(chat.result.id):gsub('^%-100', '') .. ' #user' .. user_id
else
log_output = string.format(log_output, '')
end
mattata.send_message(mattata.get_log_chat(chat_id), log_output, 'html')
else
output = string.format(output, '', timeout)
mattata.send_message(chat_id, output, 'html')
end
mattata.wipe_redis_captcha(chat_id, user_id)
end
end
end
end
function join_captcha.on_callback_query(_, callback_query, message)
if not callback_query.data:match('^.-:.-:.-$') then
return false
end
local chat_id, user_id, guess = callback_query.data:match('^(.-):(.-):(.-)$')
if callback_query.from.id ~= tonumber(user_id) then
return mattata.answer_callback_query(callback_query.id, 'This isn\'t your CAPTCHA!')
end
local correct = mattata.get_captcha_text(chat_id, callback_query.from.id)
+ if not correct then
+ return mattata.answer_callback_query(callback_query.id, 'An error occurred. Please contact an admin if this keeps happening!', true)
+ end
local message_id = mattata.get_captcha_id(chat_id, callback_query.from.id)
- local default_permissions = mattata.get_chat(message.chat.id)
+ local default_permissions = mattata.get_chat(message.chat.id, true)
if guess:lower() == correct:lower() then
local success
if not default_permissions then
success = mattata.restrict_chat_member(chat_id, callback_query.from.id, 'forever', true, true, true, true, true, false, false, false)
else
success = mattata.restrict_chat_member(chat_id, callback_query.from.id, 'forever', default_permissions.result.permissions)
end
if not success then
return mattata.send_message(message.chat.id, 'I could not give a user their permissions. You may have to do this manually!')
end
mattata.wipe_redis_captcha(chat_id, callback_query.from.id)
mattata.answer_callback_query(callback_query.id, 'Success! You may now speak!')
return mattata.delete_message(chat_id, message_id)
else
if mattata.get_setting(chat_id, 'log administrative actions') then
local failed_username = mattata.get_formatted_user(callback_query.from.id, callback_query.from.first_name, 'html')
local chat_title = mattata.escape_html(message.chat.title)
local output = '%s <code>[%s]</code> failed the CAPTCHA in %s <code>[%s]</code>. They guessed <code>%s</code> but the correct answer was <code>%s</code>.\n#chat%s #user%s'
output = string.format(output, failed_username, user_id, chat_title, chat_id, guess, correct, tostring(chat_id):gsub('^%-100', ''), user_id)
local log_chat = mattata.get_log_chat(chat_id)
mattata.send_message(log_chat, output, 'html')
end
mattata.wipe_redis_captcha(chat_id, callback_query.from.id)
mattata.answer_callback_query(callback_query.id, 'You got it wrong! Re-join the group and try again, or consult an admin if you wish to be unmuted!')
return mattata.delete_message(chat_id, message_id)
end
end
function join_captcha.on_member_join(_, message, configuration)
if not mattata.get_setting(message.chat.id, 'require captcha') or message.new_chat_participant.is_bot then
return false
elseif mattata.get_captcha_id(message.chat.id, message.new_chat_participant.id) then
return mattata.send_reply(message, 'You still need to complete your CAPTCHA in order to speak!')
end
local chat_member = mattata.get_chat_member(message.chat.id, message.new_chat_participant.id)
if not chat_member then -- we can't even get info about the user? abort! abort!
return false
end
local download_location = configuration.download_location
if download_location:match('/$') then
download_location = download_location:match('^(.-)/$')
end
local new_captcha = captcha_lib.new()
local size = mattata.get_setting(message.chat.id, 'captcha size') or configuration.administration.captcha.size.default
size = math.floor(size)
local length = mattata.get_setting(message.chat.id, 'captcha length') or configuration.administration.captcha.length.default
length = math.floor(length)
local captchas = configuration.administration.captcha.files
local current = mattata.get_setting(message.chat.id, 'captcha font') or 1
current = math.floor(current)
local font = captchas[current] or captchas[1]
local timeout = mattata.get_setting(message.chat.id, 'captcha timeout') or configuration.administration.captcha.timeout.default
new_captcha:setlength(length)
new_captcha:setfontsize(size)
new_captcha:setpath(download_location)
new_captcha:setformat('jpg')
new_captcha:setfontsfolder(configuration.fonts_directory .. '/' .. font)
local generated_captcha, correct = new_captcha:generate()
- local username = message.new_chat_participant.username and '@' .. message.new_chat_participant.username or false
- local msg = string.format('Hey, [%s](tg://user?id=%s)! Please enter the above CAPTCHA using the buttons below before you can speak! You will be removed in 5 minutes if you don\'t do this.\n_Click to expand the image on Android devices!_', username or mattata.escape_markdown(message.new_chat_participant.first_name), message.new_chat_participant.id)
+ local username = mattata.get_formatted_user(message.new_chat_participant.id, message.new_chat_participant.first_name)
+ local msg = string.format('Hey, %s! Please enter the above CAPTCHA using the buttons below before you can speak! You will be removed in 5 minutes if you don\'t do this.\n_Click to expand the image on Android devices!_', username)
captchas = mattata.random_string(length, 5)
table.insert(captchas, correct)
table.sort(captchas)
local callback_data = string.format('join_captcha:%s:%s', message.chat.id, message.new_chat_participant.id)
local keyboard = mattata.inline_keyboard():row(
mattata.row()
:callback_data_button(captchas[1], callback_data .. ':' .. captchas[1])
:callback_data_button(captchas[2], callback_data .. ':' .. captchas[2])
:callback_data_button(captchas[3], callback_data .. ':' .. captchas[3])
):row(
mattata.row()
:callback_data_button(captchas[4], callback_data .. ':' .. captchas[4])
:callback_data_button(captchas[5], callback_data .. ':' .. captchas[5])
:callback_data_button(captchas[6], callback_data .. ':' .. captchas[6])
)
local success = mattata.send_photo(message.chat.id, generated_captcha, msg, 'markdown', false, nil, keyboard)
if not success then
error('No success!')
os.execute('rm ' .. generated_captcha)
return false
end
os.execute('rm ' .. generated_captcha)
local restrict = mattata.restrict_chat_member(message.chat.id, message.new_chat_participant.id, 'forever', false, false, false, false, false, false, false, false)
if restrict then
mattata.set_captcha(message.chat.id, message.new_chat_participant.id, correct, success.result.message_id, math.floor(timeout * 60))
mattata.delete_message(message.chat.id, message.message_id)
else
error('Could not restrict ChatMember!')
end
return
end
return join_captcha
\ No newline at end of file
diff --git a/plugins/administration/staff.lua b/plugins/administration/staff.lua
index 4071a32..3029f28 100644
--- a/plugins/administration/staff.lua
+++ b/plugins/administration/staff.lua
@@ -1,104 +1,90 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local staff = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function staff:init()
staff.commands = mattata.commands(self.info.username):command('staff'):command('admins').table
staff.help = '/staff - Displays the staff members in the current chat. Alias: /admins.'
end
function staff.format_admin_list(output, chat_id)
local creator = ''
local admin_count = 1
local admins = ''
for _, admin in pairs(output.result) do
local user
local branch = ' ├ '
if admin.status == 'creator' then
- creator = mattata.escape_html(admin.user.first_name)
- if admin.user.username then
- creator = string.format(
- '<a href="https://t.me/%s">%s</a>',
- admin.user.username,
- creator
- )
- end
+ creator = mattata.get_formatted_user(admin.user.id, admin.user.first_name, 'html')
elseif admin.status == 'administrator' then
- user = mattata.escape_html(admin.user.first_name)
- if admin.user.username then
- user = string.format(
- '<a href="https://t.me/%s">%s</a>',
- admin.user.username,
- user
- )
- end
+ user = mattata.get_formatted_user(admin.user.id, admin.user.first_name, 'html')
admin_count = admin_count + 1
if admin_count == #output.result then
branch = ' └ '
end
admins = admins .. branch .. user .. '\n'
end
end
local mod_list = redis:smembers('administration:' .. chat_id .. ':mods')
local mod_count = 0
local mods = ''
if next(mod_list) then
local branch = ' ├ '
local user
for i = 1, #mod_list do
user = mattata.get_linked_name(mod_list[i])
if user then
if i == #mod_list then
branch = ' └ '
end
mods = mods .. branch .. user .. '\n'
mod_count = mod_count + 1
end
end
end
if creator == '' then
creator = '-'
end
if admins == '' then
admins = '-'
end
if mods == '' then
mods = '-'
end
return string.format(
'<b>👤 Creator</b>\n└ %s\n\n<b>👥 Admins</b> (%d)\n%s\n<b>👥 Moderators</b> (%d)\n%s',
creator,
admin_count - 1,
admins,
mod_count,
mods
)
end
function staff.on_message(_, message)
local input = mattata.input(message.text)
local chat_id = message.chat.id
local success
if input then
local chat = mattata.get_chat(input)
if not chat then
return mattata.send_reply(message, 'That\'s not a valid chat.')
end
chat_id = chat.result.id
success = mattata.get_chat_administrators(chat_id)
else
success = mattata.get_chat_administrators(message.chat.id)
end
if not success then
local output = input and 'I wasn\'t able to get information about that chat\'s administrators.' or 'I couldn\'t get a list of administrators in this chat.'
return mattata.send_reply(message, output)
end
return mattata.send_message(message.chat.id, staff.format_admin_list(success, chat_id), 'html')
end
return staff
\ No newline at end of file
diff --git a/plugins/administration/triggers.lua b/plugins/administration/triggers.lua
index 2a516e1..98e1c37 100644
--- a/plugins/administration/triggers.lua
+++ b/plugins/administration/triggers.lua
@@ -1,256 +1,281 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local triggers = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function triggers:init()
triggers.commands = mattata.commands(self.info.username):command('triggers'):command('trigger'):command('custom').table
triggers.help = '/triggers - Allows admins to view and delete existing word triggers. Aliases: /trigger, /custom.'
end
function triggers:on_new_message(message)
if message.command or message.is_media or self.is_ai then
return false
end
local matches = redis:hgetall('triggers:' .. message.chat.id)
if not next(matches) == 0 then
return false
end
for trigger, value in pairs(matches) do
if message.text:lower():match(trigger:lower()) then
local trail
if trigger:lower() == 'ayy' and value:lower() == 'lmao' then
trail = message.text:lower():match('(ayy+)'):gsub('^ay', '')
value = 'lma' .. string.rep('o', trail:len())
elseif trigger:lower() == 'lmao' and value:lower() == 'ayy' then
trail = message.text:lower():match('(lmao+)'):gsub('^lma', '')
value = 'ay' .. string.rep('y', trail:len())
end
if value:len() > 4096 then
- value = value:sub(1, 4096)
+ value = value:sub(1, 4093) .. '...'
+ end
+ if value:match('%b{}') then
+ for k, v in pairs(message.from) do
+ if type(v) == 'string' then
+ message.from[k] = v:gsub('%%', '%%%%')
+ end
+ end
+ for k, v in pairs(message.chat) do
+ if type(v) == 'string' then
+ message.chat[k] = v:gsub('%%', '%%%%')
+ end
+ end
+ local last_name = message.from.last_name or ''
+ local username = message.from.username and '@' .. message.from.username or ''
+ value = value:gsub('{name}', message.from.name):gsub('{firstname}', message.from.first_name):gsub('{userid}', message.from.id):gsub('{lastname}', last_name):gsub('{username}', username)
+ if message.chat.type == 'supergroup' then
+ value = value:gsub('{title}', message.chat.title):gsub('{chatid}', message.chat.id)
+ local user_count = ''
+ if value:match('{usercount}') then
+ user_count = mattata.get_chat_members_count(message.chat.id).result
+ end
+ local invite_link = redis:hget('chat:' .. message.chat.id .. ':info', 'link') or ''
+ local chat_username = message.chat.username and '@' .. message.chat.username or ''
+ value = value:gsub('{usercount}', user_count):gsub('{invitelink}', invite_link):gsub('{chatusername}', chat_username)
+ end
end
if not message.is_edited then
local success = mattata.send_message(message.chat.id, value)
if success then
redis:set('bot:' .. message.chat.id .. ':' .. message.message_id, success.result.message_id)
end
return success
else
local message_id = redis:get('bot:' .. message.chat.id .. ':' .. message.message_id)
if message_id then
return mattata.edit_message_text(message.chat.id, message_id, value)
end
end
end
end
return
end
function triggers.get_trigger(chat_id, trigger)
local get = redis:hget('triggers:' .. chat_id, trigger)
if not get then
return 'This trigger doesn\'t exist!'
end
return get
end
function triggers.get_confirmation_keyboard(chat_id, trigger, page)
if not redis:hget('triggers:' .. chat_id, trigger) then
return false
end
return mattata.inline_keyboard():row(
mattata.row()
:callback_data_button(
mattata.symbols.back .. ' Back',
'triggers:' .. chat_id .. ':back:' .. page
)
:callback_data_button(
'Delete',
'triggers:' .. chat_id .. ':delete:' .. trigger
)
)
end
function triggers.get_triggers(chat_id)
local all = redis:hgetall('triggers:' .. chat_id)
if not next(all) then
return false
end
local output = {}
for trigger, _ in pairs(all) do
table.insert(output, trigger)
end
return output
end
function triggers.get_keyboard(chat_id, page, columns, per_page)
page = page or 1
local toggleable = triggers.get_triggers(chat_id)
if not toggleable then
return false
end
local page_count = math.floor(#toggleable / per_page)
if page_count < #toggleable / per_page then
page_count = page_count + 1
end
if page < 1 then
page = page_count
elseif page > page_count then
page = 1
end
local start_res = (page * per_page) - (per_page - 1)
local end_res = start_res + (per_page - 1)
if end_res > #toggleable then
end_res = #toggleable
end
local trigger_pos = 0
local output = {}
for _, v in pairs(toggleable) do
trigger_pos = trigger_pos + 1
if trigger_pos >= start_res and trigger_pos <= end_res then
table.insert(output, v)
end
end
local keyboard = {
['inline_keyboard'] = {
{}
}
}
local columns_per_page = math.floor(#output / columns)
if columns_per_page < (#output / columns) then
columns_per_page = columns_per_page + 1
end
local rows_per_page = math.floor(#output / columns_per_page)
if rows_per_page < (#output / columns_per_page) then
rows_per_page = rows_per_page + 1
end
local current_row = 1
local count = 0
for n in pairs(output) do
count = count + 1
if count == (rows_per_page * current_row) + 1 then
current_row = current_row + 1
table.insert(keyboard.inline_keyboard, {})
end
table.insert(keyboard.inline_keyboard[current_row], {
['text'] = output[n],
['callback_data'] = string.format(
'triggers:%s:%s:%s', chat_id,
output[n], page
)
})
end
if page_count > 1 then
table.insert(keyboard.inline_keyboard, {{
['text'] = mattata.symbols.back .. ' Previous',
['callback_data'] = string.format(
'triggers:%s:page:%s',
chat_id,
page - 1
)
}, {
['text'] = string.format(
'%s/%s',
page,
page_count
),
['callback_data'] = 'triggers:nil'
}, {
['text'] = 'Next ' .. mattata.symbols.next,
['callback_data'] = string.format(
'triggers:%s:page:%s',
chat_id,
page + 1
)
}})
end
if count <= 0 then
return false
end
return keyboard
end
function triggers.on_callback_query(_, callback_query, message)
if not callback_query.data:match('^.-:.-:.-$') then
return
end
local chat_id, callback_type, page = callback_query.data:match('^(.-):(.-):(.-)$')
if not mattata.is_group_admin(chat_id, callback_query.from.id) then
return mattata.answer_callback_query(callback_query.id, 'You are not allowed to use this!')
end
if callback_type == 'back' or callback_type == 'page' then
local success = mattata.edit_message_text(
message.chat.id,
message.message_id,
'Please select a trigger:',
nil, false,
triggers.get_keyboard(
chat_id,
tonumber(page), 2, 10
)
)
if not success then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
'All triggers saved for this chat have already been deleted!'
)
end
return mattata.answer_callback_query(callback_query.id)
elseif callback_type == 'delete' then
local all = redis:hgetall('triggers:' .. chat_id)
if not next(all) then
return mattata.answer_callback_query(callback_query.id, 'All triggers saved for this chat have already been deleted!')
end
local selected = all[page]
if not selected then
return mattata.answer_callback_query(callback_query.id, 'This trigger no longer exists!')
end
redis:hdel('triggers:' .. chat_id, page)
return mattata.answer_callback_query(callback_query.id, 'That trigger has been deleted from my database!')
elseif callback_type == 'back' then
return mattata.edit_message_reply_markup(
message.chat.id,
message.message_id,
nil,
triggers.get_keyboard(
chat_id,
tonumber(page), 2, 10
)
)
end
local keyboard = triggers.get_confirmation_keyboard(
chat_id,
callback_type,
page
)
local value = triggers.get_trigger(chat_id, callback_type)
value = mattata.escape_html(value)
local success = mattata.edit_message_text(
message.chat.id,
message.message_id,
'<b>' .. callback_type .. '</b> is set to trigger <em>' .. value .. '</em>', 'html', false,
keyboard
)
if not success then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
'All triggers saved for this chat have already been deleted!'
)
end
end
function triggers.on_message(_, message)
local keyboard = triggers.get_keyboard(message.chat.id, 1, 2, 10)
if not keyboard then
return mattata.send_reply(message, 'This chat does\'t have any triggers saved in my database! Use /addtrigger <trigger> <value> to add one!')
end
return mattata.send_message(message.chat.id, 'Please select a trigger:', nil, true, false, nil, keyboard)
end
return triggers
\ No newline at end of file
diff --git a/plugins/ai.lua b/plugins/ai.lua
index 493844a..b17a22a 100644
--- a/plugins/ai.lua
+++ b/plugins/ai.lua
@@ -1,48 +1,46 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local ai = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function ai:on_new_message(message)
if not message.text or message.text:match('^[/!#]') then
return false
elseif redis:get('chatroulette:' .. message.from.id) then
return false
elseif message.text and message.reply and message.reply.text and message.reply.from.id == self.info.id and not message.reply.entities then
return ai.on_message(self, message)
end
local triggers = {
'^' .. self.info.first_name:lower() .. ',? ',
'^@?' .. self.info.username:lower() .. ',? '
}
for _, trigger in pairs(triggers) do
if message.text:lower():match(trigger) then
return ai.on_message(self, message)
end
end
if message.chat.type == 'private' and message.text then
return ai.on_message(self, message)
- elseif math.random(30) == 30 and not message.reply then
- return ai.on_message(self, message)
end
return
end
function ai:on_message(message)
self.is_ai = true
local text = message.text:gsub('^' .. self.info.first_name:lower() .. ',? ', ''):gsub('^@?' .. self.info.username:lower() .. ',? ', '')
text = text:gsub(self.info.first_name:lower(), 'you'):gsub('@?' .. self.info.username:lower(), 'you')
local language = mattata.get_setting(message.chat.id, 'force group language') and 'en' or mattata.get_user_language(message.from.id):match('^(..)')
if message.reply and message.reply.text and message.reply.from.id == self.info.id and not message.reply.entities then
redis:hset('ai:' .. message.chat.id .. ':' .. message.message_id, 'reply', message.reply.text)
end
redis:hset('ai:' .. message.chat.id .. ':' .. message.message_id, 'text', text)
redis:hset('ai:' .. message.chat.id .. ':' .. message.message_id, 'language', language)
return
end
return ai
\ No newline at end of file
diff --git a/plugins/commandstats.lua b/plugins/commandstats.lua
index 16d1ecc..b5d6ac5 100644
--- a/plugins/commandstats.lua
+++ b/plugins/commandstats.lua
@@ -1,81 +1,93 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local commandstats = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function commandstats:init()
commandstats.commands = mattata.commands(self.info.username):command('commandstats'):command('cmdstats').table
commandstats.help = '/commandstats - Shows statistical information about the current chat\'s top ten commands (ordered by message count). Alias: /cmdstats.'
end
+function commandstats:on_new_message(message)
+ if self.is_command then
+ local command = message.text:match('^([!/#][%w_]+)')
+ if command then
+ redis:incr('commandstats:' .. message.chat.id .. ':' .. command)
+ if not redis:sismember('chat:' .. message.chat.id .. ':commands', command) then
+ redis:sadd('chat:' .. message.chat.id .. ':commands', command)
+ end
+ end
+ end
+end
+
function commandstats.reset_command_stats(chat_id)
if not chat_id or tonumber(chat_id) == nil then
return false
end
local messages = redis:keys('commandstats:' .. chat_id .. ':*')
for _, v in pairs(messages) do
redis:del(v)
end
return true
end
function commandstats.get_command_stats(chat_id, title, language)
local commands = redis:smembers('chat:' .. chat_id .. ':commands')
local statistics = {}
for i = 1, #commands do
local command = commands[i]
local command_info = {
['command'] = command
}
command_info.count = redis:get('commandstats:' .. chat_id .. ':' .. command)
if command_info.count and tonumber(command_info.count) ~= nil then
table.insert(statistics, command_info)
end
end
table.sort(statistics, function(a, b)
if a.count and b.count then
return tonumber(a.count) > tonumber(b.count)
end
end)
local total = 0
for _, v in pairs(statistics) do
total = total + v.count
end
local text = ''
local output = {}
for i = 1, 10 do
table.insert(output, statistics[i])
end
for _, v in pairs(output) do
local percent = tostring(mattata.round((v.count / total) * 100, 1))
text = text .. mattata.escape_html(v.command) .. ': <b>' .. mattata.comma_value(v.count) .. '</b> [' .. percent .. '%]\n'
end
if not text or text == '' then
return language['commandstats']['1']
end
return string.format(
language['commandstats']['2'],
mattata.escape_html(title), text,
mattata.comma_value(total):gsub('%..-$', '')
)
end
function commandstats.on_message(_, message, _, language)
if message.chat.type == 'private' then
return mattata.send_message(message.chat.id, language.errors.supergroup)
end
local input = mattata.input(message.text)
local output
if input and input:lower() == 'reset' and mattata.is_group_admin(message.chat.id, message.from.id) then
output = commandstats.reset_command_stats(message.chat.id) and language['commandstats']['3'] or language['commandstats']['4']
return mattata.send_message(message.chat.id, output)
end
output = commandstats.get_command_stats(message.chat.id, message.chat.title, language)
return mattata.send_message(message.chat.id, output, 'html')
end
return commandstats
\ No newline at end of file
diff --git a/plugins/fileid.lua b/plugins/fileid.lua
new file mode 100644
index 0000000..17dc7a5
--- /dev/null
+++ b/plugins/fileid.lua
@@ -0,0 +1,42 @@
+--[[
+ Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
+ This code is licensed under the MIT. See LICENSE for details.
+]]
+
+local fileid = {}
+local mattata = require('mattata')
+local id = require('plugins.id')
+
+function fileid:init()
+ fileid.commands = mattata.commands(self.info.username):command('fileid'):command('fid').table
+ fileid.help = '/fileid - Returns available information about the replied-to media. Alias: /fid.'
+end
+
+function fileid.on_message(_, message, _, language)
+ if not message.reply or not message.reply.is_media then
+ return mattata.send_reply(message, 'You must use this command in reply to a type of media!')
+ end
+ local info = mattata.unpack_file_id(message.reply.file_id, message.reply.media_type)
+ if not next(info) then
+ return mattata.send_reply(message, language.errors.generic)
+ end
+ local output = {}
+ for k, v in pairs(info) do
+ table.insert(output, k:gsub('_', ' '):gsub('^%l', string.upper) .. ': <code>' .. v .. '</code>')
+ end
+ if info.user_id then
+ local lookup = id.resolve_chat(info.user_id, language, nil, nil, nil, true)
+ if lookup then
+ table.insert(output, '\nInfo I found about the user:\n')
+ for _, line in pairs(lookup) do
+ table.insert(output, line)
+ end
+ else
+ table.insert(output, '\nI couldn\'t find information about that user because they haven\'t spoken to me before - try using another ID lookup bot!')
+ end
+ end
+ output = table.concat(output, '\n')
+ return mattata.send_reply(message, output, 'html')
+end
+
+return fileid
\ No newline at end of file
diff --git a/plugins/help.lua b/plugins/help.lua
index dc3d314..1ad4870 100644
--- a/plugins/help.lua
+++ b/plugins/help.lua
@@ -1,402 +1,402 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local help = {}
local mattata = require('mattata')
function help:init(configuration)
help.commands = mattata.commands(self.info.username):command('help'):command('start').table
help.help = '/help [plugin] - A help-orientated menu is sent if no arguments are given. If arguments are given, usage information for the given plugin is sent instead. Alias: /start.'
help.per_page = configuration.limits.help.per_page
end
function help.get_initial_keyboard()
return mattata.inline_keyboard():row(
mattata.row():callback_data_button(
'Links',
'help:links'
):callback_data_button(
'Admin Help',
'help:acmds'
):callback_data_button(
'Commands',
'help:cmds'
)
):row(
mattata.row():switch_inline_query_button(
'Inline Mode',
'/'
):callback_data_button(
'Settings',
'help:settings'
):callback_data_button(
'Channels',
'help:channels'
)
)
end
function help.get_plugin_page(arguments_list, page)
local plugin_count = #arguments_list
local page_begins_at = tonumber(page) * help.per_page - (help.per_page - 1)
local page_ends_at = tonumber(page_begins_at) + (help.per_page - 1)
if tonumber(page_ends_at) > tonumber(plugin_count) then
page_ends_at = tonumber(plugin_count)
end
local page_plugins = {}
for i = tonumber(page_begins_at), tonumber(page_ends_at) do
local plugin = arguments_list[i]
if i < tonumber(page_ends_at) then
plugin = plugin .. '\n'
end
table.insert(page_plugins, plugin)
end
return table.concat(page_plugins, '\n')
end
function help.get_back_keyboard()
return mattata.inline_keyboard():row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' Back',
'help:back'
)
)
end
function help.on_inline_query(_, inline_query, _, language)
local offset = inline_query.offset and tonumber(inline_query.offset) or 0
local output = mattata.get_inline_help(inline_query.query, offset)
if not next(output) and offset == 0 then
output = string.format(language['help']['2'], inline_query.query)
return mattata.send_inline_article(inline_query.id, language['help']['1'], output)
end
offset = tostring(offset + 50)
return mattata.answer_inline_query(inline_query.id, output, 0, false, offset)
end
function help:on_callback_query(callback_query, message, _, language)
if callback_query.data == 'cmds' then
- local arguments_list = mattata.get_help(false, message.chat.id)
+ local arguments_list = mattata.get_help(self, false, message.chat.id)
local plugin_count = #arguments_list
local page_count = math.floor(tonumber(plugin_count) / help.per_page)
if math.floor(tonumber(plugin_count) / help.per_page) ~= tonumber(plugin_count) / help.per_page then
page_count = page_count + 1
end
local output = help.get_plugin_page(arguments_list, 1)
output = output .. mattata.escape_html(string.format(language['help']['3'], self.info.username))
return mattata.edit_message_text(
message.chat.id,
message.message_id,
output,
'html',
true,
mattata.inline_keyboard():row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['4'],
'help:results:0'
):callback_data_button(
'1/' .. page_count,
'help:pages:1:' .. page_count
):callback_data_button(
language['help']['5'] .. ' ' .. mattata.symbols.next,
'help:results:2'
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
):switch_inline_query_current_chat_button(
'🔎 ' .. language['help']['7'],
'/'
)
)
)
elseif callback_query.data:match('^results:%d*$') then
local new_page = callback_query.data:match('^results:(%d*)$')
- local arguments_list = mattata.get_help(false, message.chat.id)
+ local arguments_list = mattata.get_help(self, false, message.chat.id)
local plugin_count = #arguments_list
local page_count = math.floor(tonumber(plugin_count) / help.per_page)
if math.floor(tonumber(plugin_count) / help.per_page) ~= tonumber(plugin_count) / help.per_page then
page_count = page_count + 1
end
if tonumber(new_page) > tonumber(page_count) then
new_page = 1
elseif tonumber(new_page) < 1 then
new_page = tonumber(page_count)
end
local output = help.get_plugin_page(arguments_list, new_page)
output = output .. mattata.escape_html(string.format(language['help']['3'], self.info.username))
return mattata.edit_message_text(
message.chat.id,
message.message_id,
output,
'html',
true,
mattata.inline_keyboard():row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['4'],
'help:results:' .. math.floor(tonumber(new_page) - 1)
):callback_data_button(
new_page .. '/' .. page_count,
'help:pages:' .. new_page .. ':' .. page_count
):callback_data_button(
language['help']['5'] .. ' ' .. mattata.symbols.next,
'help:results:' .. math.floor(tonumber(new_page) + 1)
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
):switch_inline_query_current_chat_button(
'🔎 ' .. language['help']['7'],
'/'
)
)
)
elseif callback_query.data == 'acmds' then
- local arguments_list = mattata.get_help(true, message.chat.id)
+ local arguments_list = mattata.get_help(self, true, message.chat.id)
local plugin_count = #arguments_list
local page_count = math.floor(tonumber(plugin_count) / help.per_page)
if math.floor(tonumber(plugin_count) / help.per_page) ~= tonumber(plugin_count) / help.per_page then
page_count = page_count + 1
end
local output = help.get_plugin_page(arguments_list, 1)
output = output .. mattata.escape_html(string.format(language['help']['3'], self.info.username))
return mattata.edit_message_text(
message.chat.id,
message.message_id,
output,
'html',
true,
mattata.inline_keyboard():row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['4'],
'help:aresults:0'
):callback_data_button(
'1/' .. page_count,
'help:pages:1:' .. page_count
):callback_data_button(
language['help']['5'] .. ' ' .. mattata.symbols.next,
'help:aresults:2'
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
)
)
)
elseif callback_query.data:match('^aresults:%d*$') then
local new_page = callback_query.data:match('^aresults:(%d*)$')
- local arguments_list = mattata.get_help(true, message.chat.id)
+ local arguments_list = mattata.get_help(self, true, message.chat.id)
local plugin_count = #arguments_list
local page_count = math.floor(tonumber(plugin_count) / help.per_page)
if math.floor(tonumber(plugin_count) / help.per_page) ~= tonumber(plugin_count) / help.per_page then
page_count = page_count + 1
end
if tonumber(new_page) > tonumber(page_count) then
new_page = 1
elseif tonumber(new_page) < 1 then
new_page = tonumber(page_count)
end
local output = help.get_plugin_page(arguments_list, new_page)
output = output .. mattata.escape_html(string.format(language['help']['3'], self.info.username))
return mattata.edit_message_text(
message.chat.id,
message.message_id,
output,
'html',
true,
mattata.inline_keyboard():row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['4'],
'help:aresults:' .. math.floor(tonumber(new_page) - 1)
):callback_data_button(
new_page .. '/' .. page_count,
'help:pages:' .. new_page .. ':' .. page_count
):callback_data_button(
language['help']['5'] .. ' ' .. mattata.symbols.next,
'help:aresults:' .. math.floor(tonumber(new_page) + 1)
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
)
)
)
elseif callback_query.data:match('^pages:%d*:%d*$') then
local current_page, total_pages = callback_query.data:match('^pages:(%d*):(%d*)$')
return mattata.answer_callback_query(
callback_query.id,
string.format(language['help']['8'], current_page, total_pages)
)
elseif callback_query.data:match('^ahelp:') then
return mattata.answer_callback_query(callback_query.id, 'This is an old keyboard, please request a new one using /help!')
elseif callback_query.data == 'links' then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
language['help']['12'],
nil,
true,
mattata.inline_keyboard():row(
mattata.row():url_button(
language['help']['13'],
'https://t.me/mattataDev'
):url_button(
language['help']['14'],
'https://t.me/mattata'
):url_button(
language['help']['15'],
'https://t.me/mattataSupport'
)
):row(
mattata.row():url_button(
language['help']['16'],
'https://t.me/mattataFAQ'
):url_button(
language['help']['17'],
'https://github.com/wrxck/mattata'
):url_button(
language['help']['18'],
'https://paypal.me/wrxck'
)
):row(
mattata.row():url_button(
language['help']['19'],
'https://t.me/storebot?start=mattatabot'
):url_button(
language['help']['20'],
'https://t.me/mattataLog'
):url_button(
'Twitter',
'https://twitter.com/intent/user?screen_name=matt__hesketh'
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
)
)
)
elseif callback_query.data == 'channels' then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
language['help']['12'],
nil,
true,
mattata.inline_keyboard():row(
mattata.row():url_button(
'no context',
'https://t.me/no_context'
)
):row(
mattata.row():callback_data_button(
mattata.symbols.back .. ' ' .. language['help']['6'],
'help:back'
)
)
)
elseif callback_query.data == 'settings' then
if message.chat.type == 'supergroup' and not mattata.is_group_admin(message.chat.id, callback_query.from.id) then
return mattata.answer_callback_query(callback_query.id, language['errors']['admin'])
end
return mattata.edit_message_reply_markup(
message.chat.id,
message.message_id,
nil,
(
message.chat.type == 'supergroup'
and mattata.is_group_admin(
message.chat.id,
callback_query.from.id
)
)
and mattata.inline_keyboard()
:row(
mattata.row():callback_data_button(
language['help']['21'], 'administration:' .. message.chat.id .. ':page:1'
):callback_data_button(
language['help']['22'], 'plugins:' .. message.chat.id .. ':page:1'
)
)
:row(
mattata.row():callback_data_button(
language['help']['6'],
'help:back'
)
) or mattata.inline_keyboard():row(
mattata.row():callback_data_button(
language['help']['22'], 'plugins:' .. message.chat.id .. ':page:1'
)
):row(
mattata.row():callback_data_button(
language['help']['6'], 'help:back'
)
)
)
elseif callback_query.data == 'back' then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
string.format(
language['help']['23'],
mattata.escape_html(callback_query.from.first_name),
mattata.escape_html(self.info.first_name),
utf8.char(128513),
utf8.char(128161),
message.chat.type ~= 'private' and ' ' .. language['help']['24'] .. ' ' .. mattata.escape_html(message.chat.title) or '',
utf8.char(128176)
),
'html',
true,
help.get_initial_keyboard(message.chat.type == 'supergroup' and message.chat.id or false)
)
end
end
function help:on_message(message, _, language)
local input = mattata.input(message.text)
if input and input:match('^[/!]?%w+$') then
local plugin_documentation = false
input = input:match('^/') and input or '/' .. input
for _, v in pairs(self.plugin_list) do
if v:match(input) then
plugin_documentation = v
end
end
if not plugin_documentation then -- if it wasn't a normal plugin, it might be an administrative one
for _, v in pairs(self.administrative_plugin_list) do
if v:match(input) then
plugin_documentation = v
end
end
end
plugin_documentation = plugin_documentation or 'I couldn\'t find a plugin matching that command!'
plugin_documentation = plugin_documentation .. '\n\nTo see all commands, just send /help.'
return mattata.send_reply(message, plugin_documentation)
end
return mattata.send_message(
message.chat.id,
string.format(
language['help']['23'],
mattata.escape_html(message.from.first_name),
mattata.escape_html(self.info.first_name),
utf8.char(128513),
utf8.char(128161),
message.chat.type ~= 'private' and ' ' .. language['help']['24'] .. ' ' .. mattata.escape_html(message.chat.title) or '',
utf8.char(128176)
),
'html',
false,
true,
nil,
help.get_initial_keyboard(message.chat.type == 'supergroup' and message.chat.id or false)
)
end
return help
\ No newline at end of file
diff --git a/plugins/id.lua b/plugins/id.lua
index e4200c1..f40d451 100644
--- a/plugins/id.lua
+++ b/plugins/id.lua
@@ -1,153 +1,158 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local id = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function id:init()
id.commands = mattata.commands(self.info.username):command('id'):command('user'):command('whoami').table
id.help = '/id [chat] - Sends information about the given chat. Input is also accepted via reply. Only /user will display user statistics. Aliases: /user, /whoami.'
end
-function id.resolve_chat(input, language, send_chat_action, current_group, show_user_stats)
+function id.resolve_chat(input, language, send_chat_action, current_group, show_user_stats, api_mode)
local output = {}
if not input then
return false
elseif send_chat_action and current_group then
mattata.send_chat_action(current_group, 'typing')
end
local success = mattata.get_user(input, false, true) or mattata.get_chat(input)
if not success or not success.result then
+ if api_mode then
+ return false
+ end
return language['id']['1']
end
if success.result.type == 'private' then
local name = success.result.first_name
if success.result.last_name then
name = name .. ' ' .. success.result.last_name
end
- table.insert(output, mattata.get_formatted_user(success.result.id, name, 'html') .. ' <code>[' .. success.result.id .. ']</code>')
+ local nickname = redis:hget('user:' .. success.result.id .. ':info', 'nickname')
+ if nickname then
+ nickname = ', AKA <em>' .. mattata.escape_html(nickname) .. '</em>'
+ else
+ nickname = ''
+ end
+ table.insert(output, mattata.get_formatted_user(success.result.id, name, 'html') .. nickname .. ' <code>[' .. success.result.id .. ']</code>')
if success.result.username then
table.insert(output, '@' .. success.result.username)
local previous = redis:smembers('user:' .. success.result.id .. ':usernames')
if #previous > 1 then
for pos, usr in pairs(previous) do
if usr == success.result.username:lower() then
table.remove(previous, pos)
else
previous[pos] = '@' .. previous[pos]:lower()
end
end
previous = table.concat(previous, ', ')
table.insert(output, '<b>Previous Usernames:</b> <code>' .. previous .. '</code>')
end
end
if success.result.bio and success.result.bio ~= '' then
table.insert(output, '<b>Bio:</b> <code>' .. mattata.escape_html(success.result.bio) .. '</code>')
end
local feds = id.get_fed_info(success.result.id)
for _, line in pairs(feds) do
table.insert(output, line)
end
if current_group and show_user_stats then
local chat_member = mattata.get_chat_member(current_group, success.result.id)
if not chat_member or not chat_member.result.status then
table.insert(output, '\n<em>Not seen in this group!</em>')
else
local bans = redis:hget(string.format('chat:%s:%s', current_group, success.result.id), 'bans') or 0
local kicks = redis:hget(string.format('chat:%s:%s', current_group, success.result.id), 'kicks') or 0
local warnings = redis:hget(string.format('chat:%s:%s', current_group, success.result.id), 'warnings') or 0
local unbans = redis:hget(string.format('chat:%s:%s', current_group, success.result.id), 'unbans') or 0
local messages = redis:get('messages:' .. success.result.id .. ':' .. current_group) or 0
local seen = #redis:keys('messages:' .. success.result.id .. ':*')
table.insert(output, '\n<b>Group status:</b> <em>' .. chat_member.result.status .. '</em>')
table.insert(output, '<b>Bans:</b> <em>' .. bans .. '</em>')
table.insert(output, '<b>Kicks:</b> <em>' .. kicks .. '</em>')
table.insert(output, '<b>Warnings:</b> <em>' .. warnings .. '</em>')
table.insert(output, '<b>Unbans:</b> <em>' .. unbans .. '</em>')
table.insert(output, '<b>Messages:</b> <em>' .. messages .. '</em>')
table.insert(output, '<em>Seen in ' .. seen .. ' group(s)</em>')
end
end
else
+ table.insert(output, mattata.escape_html(success.result.title) .. ' <code>[' .. success.result.id .. '</code> (' .. success.result.type .. ')')
+ table.insert(output, '@' .. success.result.username)
if current_group ~= success.result.id then
- table.insert(output, '<b>Title:</b> ' .. mattata.escape_html(success.result.title))
if success.result.description and success.result.description ~= '' then
table.insert(output, '<b>Description:</b> <code>' .. mattata.escape_html(success.result.description) .. '</code>')
end
- else
- table.insert(output, '<b>This group:</b>')
- end
- table.insert(output, '<b>ID:</b> ' .. success.result.id)
- table.insert(output, '<b>Type:</b> ' .. success.result.type)
- if success.result.username then
- table.insert(output, '<b>Username:</b> @' .. success.result.username)
end
end
return output
end
function id.get_fed_info(user_id)
local banned_from = redis:keys('fedban:*:' .. user_id)
local banned_amount = #banned_from
local output = {}
- table.insert(output, 'Banned from <code>' .. banned_amount .. '</code> Feds')
- table.insert(output, '<em>/fbaninfo coming soon...</em>')
+ table.insert(output, 'Banned from <code>' .. banned_amount .. '</code> Fed(s)')
+ if banned_amount > 0 then
+ table.insert(output, '<em>Use /fbaninfo to see why you\'ve been banned!</em>')
+ end
return output
end
function id.on_inline_query(_, inline_query, _, language)
local input = mattata.input(inline_query.query) or inline_query.from.id
local output = id.resolve_chat(input, language)
output = type(output) == 'table' and table.concat(output, '\n') or output
return mattata.answer_inline_query(
inline_query.id,
mattata.inline_result()
:id()
:type('article')
:title(tostring(inline_query.query))
:description(language['id']['4'])
:input_message_content(
mattata.input_text_message_content(output, 'html')
)
)
end
function id.on_message(_, message, _, language)
message.text = message.text:lower()
local is_reply, is_reply_chat, old_chat_object = false, false, message.chat
if message.reply then
is_reply = true
message.from = message.reply.from
message.chat = message.reply.chat
if message.reply.forward_from then
message.from = message.reply.forward_from
end
if message.reply.forward_from_chat then
is_reply_chat = true
message.chat = message.reply.forward_from_chat
end
end
mattata.send_chat_action(old_chat_object.id)
local has_input = mattata.input(message.text)
local input = mattata.input(message.text) or message.from.id
local current_group = message.chat.type == 'supergroup' and message.chat.id or false
local show_user_stats = message.text:match('^[!/#]user') and true or false
local output = id.resolve_chat(input, language, true, current_group, show_user_stats)
if not has_input and message.chat.type ~= 'private' and ((not is_reply) or is_reply_chat) and not show_user_stats then
table.insert(output, '')
local chat = id.resolve_chat(message.chat.id, language, false, current_group)
for _, v in pairs(chat) do
table.insert(output, v)
end
end
if is_reply_chat then
message.chat = old_chat_object
end
output = type(output) == 'table' and table.concat(output, '\n') or output
return mattata.send_message(message.chat.id, output, 'html')
end
return id
\ No newline at end of file
diff --git a/plugins/mock.lua b/plugins/mock.lua
new file mode 100644
index 0000000..16fd614
--- /dev/null
+++ b/plugins/mock.lua
@@ -0,0 +1,49 @@
+--[[
+ Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
+ This code is licensed under the MIT. See LICENSE for details.
+]]
+
+local mock = {}
+local mattata = require('mattata')
+
+function mock:init()
+ mock.commands = mattata.commands(self.info.username):command('mock').table
+ mock.help = '/mock [text] - Repeats the replied-to message in a moCkINg style. Alternatively, input can be given - but this won\'t override a reply.'
+end
+
+function mock.change_case(str)
+ local formatted = ''
+ for i = 1, #str do
+ local byte = str:sub(i, i)
+ if byte:match('%a') then
+ if i % 2 == 1 then
+ formatted = formatted .. byte:upper()
+ else
+ formatted = formatted .. byte:lower()
+ end
+ else -- Support non-alphabetic characters.
+ formatted = formatted .. byte
+ end
+ end
+ return formatted
+end
+
+function mock.on_message(_, message)
+ local input = message.reply and message.reply.text or mattata.input(message.text)
+ if not input then
+ return mattata.send_reply(message, mock.help)
+ end
+ local chars = {}
+ for v in input:gmatch('.') do
+ chars[#chars + 1] = v
+ end
+ local output = mock.change_case(input)
+ if message.reply then
+ mattata.delete_message(message.chat.id, message.message_id)
+ message.message_id = message.reply.message_id
+ return mattata.send_reply(message, output)
+ end
+ return mattata.send_message(message.chat.id, output)
+end
+
+return mock
\ No newline at end of file
diff --git a/plugins/nick.lua b/plugins/nick.lua
new file mode 100644
index 0000000..549f3e6
--- /dev/null
+++ b/plugins/nick.lua
@@ -0,0 +1,34 @@
+--[[
+ Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
+ This code is licensed under the MIT. See LICENSE for details.
+]]
+
+local nick = {}
+local mattata = require('mattata')
+local redis = require('libs.redis')
+
+function nick:init(configuration)
+ nick.commands = mattata.commands(self.info.username):command('nick'):command('nickname'):command('nn'):command('setnick').table
+ nick.help = '/nick <text> - Sets your nickname to the given text. Your nickname can\'t be longer than ' .. configuration.limits.nick .. ' characters in length. Aliases: /nickname, /nn, /setnick.'
+end
+
+function nick.on_message(_, message, configuration)
+ local input = mattata.input(message.text)
+ if not input then
+ local current = redis:hget('user:' .. message.from.id .. ':info', 'nickname')
+ local output, parse_mode = nick.help
+ if current then
+ current = mattata.get_formatted_user(message.from.id, current, 'html')
+ output = 'You are currently known as ' .. current .. '! To change this, send <code>/nick &lt;text&gt;</code>'
+ parse_mode = 'html'
+ end
+ return mattata.send_reply(message, output, parse_mode)
+ elseif input:len() > configuration.limits.nick then
+ return mattata.send_reply(message, 'Your nickname can\'t be longer than ' .. configuration.limits.nick .. ' characters in length!')
+ end
+ redis:hset('user:' .. message.from.id .. ':info', 'nickname', input)
+ local user = mattata.get_formatted_user(message.from.id, input, 'html')
+ return mattata.send_message(message.chat.id, string.format('You\'ll now be known as %s!', user), 'html')
+end
+
+return nick
\ No newline at end of file
diff --git a/plugins/plugins.lua b/plugins/plugins.lua
index 12f2d47..1d01e5f 100644
--- a/plugins/plugins.lua
+++ b/plugins/plugins.lua
@@ -1,321 +1,318 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local plugins = {}
local mattata = require('mattata')
local json = require('dkjson')
local redis = require('libs.redis')
local configuration = require('configuration')
function plugins:init()
plugins.commands = mattata.commands(self.info.username):command('plugins').table
plugins.help = '/plugins - Toggle the plugins you want to use in your chat with a slick inline keyboard, paginated and neatly formatted.'
end
+function plugins:refresh(chat_id)
+ local new = redis:smembers('disabled_plugins:' .. chat_id)
+ if #new == 0 then
+ new = nil
+ end
+ if not self.chats[tostring(chat_id)] then
+ self.chats[tostring(chat_id)] = {}
+ end
+ self.chats[tostring(chat_id)].disabled_plugins = new
+end
+
function plugins.get_toggleable_plugins()
local toggleable = {}
for _, v in pairs(configuration.plugins) do
if not mattata.table_contains(configuration.administrative_plugins, v) then
- if v ~= 'plugins' and v ~= 'control' and v ~= 'bash' and v ~= 'lua' and v ~= 'gallowlist' and v ~= 'gblocklist' and v ~= 'administration' then
+ if v ~= 'plugins' and v ~= 'about' and v ~= 'bash' and v ~= 'lua' and v ~= 'reboot' and v ~= 'administration' then
v = v:gsub('_', ' ')
table.insert(toggleable, v)
end
end
end
table.sort(toggleable)
return toggleable
end
-function plugins.get_keyboard(chat, page, columns, per_page)
+function plugins:get_keyboard(chat, page, columns, per_page)
page = page or 1
local toggleable = plugins.get_toggleable_plugins()
local page_count = math.floor(#toggleable / per_page)
if page_count < #toggleable / per_page then
page_count = page_count + 1
end
if page < 1 then
page = page_count
elseif page > page_count then
page = 1
end
local start_res = (page * per_page) - (per_page - 1)
local end_res = start_res + (per_page - 1)
if end_res > #toggleable then
end_res = #toggleable
end
local plugin = 0
local output = {}
for _, v in pairs(toggleable) do
v = v:lower()
plugin = plugin + 1
if plugin >= start_res and plugin <= end_res then
local status
- if not mattata.is_plugin_disabled(v, chat) then
+ if not redis:sismember('disabled_plugins:' .. chat, v) then
status = utf8.char(9989)
else
status = utf8.char(10060)
end
table.insert(output, {
['plugin'] = v,
['status'] = status
})
end
end
local keyboard = {
['inline_keyboard'] = {
{}
}
}
- local columns_per_page = math.floor(#output / columns)
- if columns_per_page < (#output / columns) then
- columns_per_page = columns_per_page + 1
- end
- local rows_per_page = math.floor(#output / columns_per_page)
- if rows_per_page < (#output / columns_per_page) then
+ local rows_per_page = math.floor(#output / columns)
+ if rows_per_page < (#output / columns) then
rows_per_page = rows_per_page + 1
end
+ local columns_per_page = math.floor(#output / rows_per_page)
+ if columns_per_page < (#output / rows_per_page) then
+ columns_per_page = columns_per_page + 1
+ end
local current_row = 1
local count = 0
for n in pairs(output) do
count = count + 1
- if count == (rows_per_page * current_row) + 1 then
+ if count == (columns_per_page * current_row) + 1 then
current_row = current_row + 1
table.insert(
keyboard.inline_keyboard,
{}
)
end
table.insert(
keyboard.inline_keyboard[current_row],
{
['text'] = output[n].plugin:gsub('^%l', string.upper),
['callback_data'] = string.format(
'plugins:%s:%s:%s',
chat,
output[n].plugin,
page
)
}
)
table.insert(
keyboard.inline_keyboard[current_row],
{
['text'] = output[n].status,
['callback_data'] = string.format(
'plugins:%s:%s:%s',
chat,
output[n].plugin,
page
)
}
)
end
table.insert(
keyboard.inline_keyboard,
{
{
['text'] = utf8.char(8592) .. ' Previous',
['callback_data'] = string.format(
'plugins:%s:page:%s',
chat,
page - 1
)
},
{
['text'] = string.format(
'%s/%s',
page,
page_count
),
['callback_data'] = 'plugins:nil'
},
{
['text'] = 'Next ' .. utf8.char(8594),
['callback_data'] = string.format(
'plugins:%s:page:%s',
chat,
page + 1
)
}
}
)
table.insert(
keyboard.inline_keyboard,
{
{
['text'] = 'Disable All',
['callback_data'] = string.format(
'plugins:%s:disable_all:%s',
chat,
page
)
},
{
['text'] = 'Enable All',
['callback_data'] = string.format(
'plugins:%s:enable_all:%s',
chat,
page
)
}
}
)
table.insert(
keyboard.inline_keyboard,
{
{
['text'] = 'Back',
['callback_data'] = 'help:settings'
}
}
)
return keyboard
end
-function plugins.on_callback_query(_, callback_query, message, _)
+function plugins:on_callback_query(callback_query, message, configuration)
if not callback_query.data:match('^.-:.-:.-$') then
return
end
local chat, callback_type, page = callback_query.data:match('^(.-):(.-):(.-)$')
if (
mattata.get_chat(chat) and mattata.get_chat(chat).result.type ~= 'private'
) and not mattata.is_group_admin(
chat,
callback_query.from.id
) then
return mattata.answer_callback_query(
callback_query.id,
'You must be an administrator to use this!'
)
end
local toggle_status
if callback_type ~= 'page' then
local toggleable = plugins.get_toggleable_plugins()
if callback_type == 'enable_all' then
for _, v in pairs(toggleable) do
redis:srem('disabled_plugins:' .. chat, v)
end
toggle_status = 'All plugins enabled!'
elseif callback_type == 'disable_all' then
for _, v in pairs(toggleable) do
redis:sadd('disabled_plugins:' .. chat, v)
end
toggle_status = 'All plugins disabled!'
elseif callback_type == 'enable_via_message' or callback_type == 'enable' then
redis:srem('disabled_plugins:' .. chat, page)
return mattata.answer_callback_query(
callback_query.id,
page:gsub('^%l', string.upper) .. ' has been enabled!'
)
elseif callback_type == 'dismiss_disabled_message' then
redis:set(
string.format(
'chat:%s:dismiss_disabled_message:%s',
chat,
page
),
true
)
return mattata.answer_callback_query(
callback_query.id,
'You will no longer be notified about this plugin!'
)
else
- if mattata.is_plugin_disabled(callback_type, chat) then
+ if redis:sismember('disabled_plugins:' .. chat, callback_type) then
redis:srem('disabled_plugins:' .. chat, callback_type)
toggle_status = callback_type:gsub('^%l', string.upper) .. ' enabled!'
else
redis:sadd('disabled_plugins:' .. chat, callback_type)
toggle_status = callback_type:gsub('^%l', string.upper) .. ' disabled!'
end
end
end
- local keyboard = plugins.get_keyboard(
- chat,
- tonumber(page),
- 2,
- 10
- )
- mattata.edit_message_reply_markup(
- message.chat.id,
- message.message_id,
- nil,
- json.encode(keyboard)
- )
+ local keyboard = plugins.get_keyboard(self, chat, tonumber(page), configuration.limits.plugins.columns, configuration.limits.plugins.per_page)
+ mattata.edit_message_reply_markup(message.chat.id, message.message_id, nil, keyboard)
+ plugins.refresh(self, chat)
return mattata.answer_callback_query(callback_query.id, toggle_status)
end
-function plugins:on_message(message)
+function plugins:on_message(message, configuration)
if message.chat.type ~= 'private' and not mattata.is_group_admin(
message.chat.id,
message.from.id
) then
return mattata.send_reply(
message,
'You must be an administrator to use this!'
)
elseif message.chat.type == 'private' then
local input = mattata.input(message.text)
if input then
if tonumber(input) == nil and not input:match('^%@') then
input = '@' .. input
end
local resolved = mattata.get_chat(input)
if resolved and mattata.is_group_admin(
resolved.result.id,
message.from.id
) then
message.chat = resolved.result
elseif not resolved then
return mattata.send_reply(
message,
'That\'s not a valid chat!'
)
else
return mattata.send_reply(
message,
'You don\'t appear to be an administrator in that chat!'
)
end
end
end
- local keyboard = plugins.get_keyboard(
- message.chat.id,
- 1,
- 2,
- 10
- )
+ local keyboard = plugins.get_keyboard(self, message.chat.id, 1, configuration.limits.plugins.columns, configuration.limits.plugins.per_page)
local success = mattata.send_message(
message.from.id,
string.format(
'Toggle the plugins for <b>%s</b> using the keyboard below:',
message.chat.title and mattata.escape_html(message.chat.title) or mattata.escape_html(message.chat.first_name)
),
'html',
true,
false,
nil,
json.encode(keyboard)
)
if message.chat.type == 'private' then
return
elseif not success then
return mattata.send_reply(
message,
string.format(
'I couldn\'t send you the plugin management menu, you need to send me a [private message](https://t.me/%s?start=plugins%%20' .. message.chat.id .. ') first, then try using /plugins again.',
self.info.username:lower()
),
'markdown',
true
)
end
return mattata.send_reply(
message,
'I have sent you the plugin management menu via private chat.'
)
end
return plugins
\ No newline at end of file
diff --git a/plugins/pokedex.lua b/plugins/pokedex.lua
index 37109f9..f6459f2 100644
--- a/plugins/pokedex.lua
+++ b/plugins/pokedex.lua
@@ -1,85 +1,206 @@
--[[
Based on a plugin by topkecleon. Licensed under GNU AGPLv3
https://github.com/topkecleon/otouto/blob/master/LICENSE.
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local pokedex = {}
local mattata = require('mattata')
-local http = require('socket.http')
+local https = require('ssl.https')
local url = require('socket.url')
local json = require('dkjson')
function pokedex:init()
- pokedex.commands = mattata.commands(self.info.username)
- :command('pokedex')
- :command('dex').table
- pokedex.help = '/pokedex <query> - Returns a Pokedex entry from pokeapi.co. Alias: /dex.'
+ pokedex.commands = mattata.commands(self.info.username):command('pokedex'):command('pokemon'):command('dex').table
+ pokedex.help = '/pokedex [name|ID] - If no input is given, an interactive Pokédex is sent. If input is given, information about the given Pokémon (either specified by name or ID) is returned. Results are provided by PokéAPI. Aliases: /pokemon, /dex.'
end
-function pokedex:on_message(message, configuration, language)
- local input = mattata.input(message.text:lower())
- if not input
- then
- return mattata.send_reply(
- message,
- pokedex.help
- )
- end
- local jstr, res = http.request('http://pokeapi.co/api/v1/pokemon/' .. url.escape(input))
- if res ~= 200
- then
- return mattata.send_reply(
- message,
- language['errors']['connection']
- )
+function pokedex.get_next_chain(evolution)
+ if not evolution then
+ return false
+ end
+ return evolution.species.name:gsub('^l', string.upper), evolution.evolves_to[1]
+end
+
+function pokedex.get_chain(id)
+ local jstr, res = https.request('https://pokeapi.co/api/v2/pokemon-species/' .. id)
+ if res ~= 200 then
+ return false
end
local jdat = json.decode(jstr)
- local name = jdat.name:gsub('^%l', string.upper)
- local id = '#' .. jdat.national_id
- local description_url = 'http://pokeapi.co' .. jdat.descriptions[math.random(#jdat.descriptions)].resource_uri
- local description_jstr, description_res = http.request(description_url)
- if description_res ~= 200
- then
- return mattata.send_reply(
- message,
- language['errors']['connection']
- )
- end
- mattata.send_chat_action(
- message.chat.id,
- 'upload_photo'
+ if not jdat.evolution_chain then
+ return '<em>This Pokémon doesn\'t evolve to/from anything...</em>'
+ end
+ jstr, res = https.request(jdat.evolution_chain.url)
+ if res ~= 200 then
+ return false
+ end
+ jdat = json.decode(jstr)
+ local name, evolves_to = pokedex.get_next_chain(jdat.chain)
+ local chain = name
+ repeat
+ name, evolves_to = pokedex.get_next_chain(evolves_to)
+ if name then
+ chain = chain .. string.format(' %s %s', mattata.symbols.next, name)
+ end
+ until not name
+ if not chain:match(mattata.symbols.next) then
+ return '<em>This Pokémon doesn\'t evolve to/from anything...</em>'
+ end
+ return 'Evolution chain: <code>' .. chain .. '</code>'
+end
+
+function pokedex.get_keyboard(page, columns, per_page)
+ page = page or 1
+ local offset = math.floor((page - 1) * per_page)
+ local jstr, res = https.request('https://pokeapi.co/api/v2/pokemon?offset=' .. offset .. '&limit=' .. per_page)
+ if res ~= 200 then
+ return false
+ end
+ local jdat = json.decode(jstr)
+ local all = jdat.results
+ local page_count = math.floor(jdat.count / per_page)
+ if page_count < jdat.count / per_page then
+ page_count = page_count + 1
+ end
+ if page < 1 then
+ page = page_count
+ elseif page > page_count then
+ page = 1
+ end
+ local start_res = 1
+ local end_res = per_page
+ if end_res > #all then
+ end_res = #all
+ end
+ local pokemon = 0
+ local output = {}
+ for _, v in pairs(all) do
+ v.name = v.name:lower()
+ pokemon = pokemon + 1
+ if pokemon >= start_res and pokemon <= end_res then
+ table.insert(output, {
+ ['name'] = v.name,
+ ['id'] = v.url:match('pokemon/(%d*)/$')
+ })
+ end
+ end
+ local keyboard = {
+ ['inline_keyboard'] = {{}}
+ }
+ local rows_per_page = math.floor(#output / columns)
+ if rows_per_page < (#output / columns) then
+ rows_per_page = rows_per_page + 1
+ end
+ local columns_per_page = math.floor(#output / rows_per_page)
+ if columns_per_page < (#output / rows_per_page) then
+ columns_per_page = columns_per_page + 1
+ end
+ local current_row = 1
+ local count = 0
+ for n in pairs(output) do
+ count = count + 1
+ if count == (columns_per_page * current_row) + 1 then
+ current_row = current_row + 1
+ table.insert(keyboard.inline_keyboard, {})
+ end
+ table.insert(keyboard.inline_keyboard[current_row], {
+ ['text'] = '#' .. output[n].id .. ': ' .. output[n].name:gsub('^.', string.upper),
+ ['callback_data'] = string.format('pokedex:%s:%s', output[n].name, page)
+ })
+ end
+ local previous_page = page - 1
+ if previous_page < 1 then
+ previous_page = page_count
+ end
+ local next_page = page + 1
+ if next_page > page_count then
+ next_page = 1
+ end
+ table.insert(keyboard.inline_keyboard, {{
+ ['text'] = utf8.char(8592) .. ' Previous',
+ ['callback_data'] = string.format('pokedex:page:%s', previous_page)
+ }, {
+ ['text'] = string.format('%s/%s', page, page_count),
+ ['callback_data'] = 'pokedex:nil'
+ }, {
+ ['text'] = 'Next ' .. utf8.char(8594),
+ ['callback_data'] = string.format('pokedex:page:%s', next_page)
+ }})
+ return keyboard
+end
+
+function pokedex.on_callback_query(_, callback_query, message, _, language)
+ local callback_type, page = callback_query.data:match('^(.-):(.-)$')
+ if not callback_type or not page then
+ return mattata.answer_callback_query(callback_query.id)
+ elseif callback_type == 'page' then
+ local keyboard = pokedex.get_keyboard(tonumber(page), 3, 21)
+ return mattata.edit_message_text(message.chat.id, message.message_id, '<em>Select a Pokémon to view more information about it</em>', 'html', true, keyboard)
+ end
+ local output = pokedex.get_pokemon(callback_type, language)
+ local keyboard = mattata.inline_keyboard():row(
+ mattata.row():callback_data_button(mattata.symbols.back .. ' Back', 'pokedex:page:' .. page)
)
- local description_jdat = json.decode(description_jstr)
- local description = description_jdat.description
- :gsub('POKMON', 'Pokémon')
- :gsub('Pokmon', 'Pokémon')
- :gsub('Pokemon', 'Pokémon')
- :gsub('POKéMON', 'Pokémon')
+ return mattata.edit_message_text(message.chat.id, message.message_id, output, 'html', false, keyboard)
+end
+
+function pokedex.get_pokemon(pokemon, language)
+ if not pokemon then
+ return language.errors.results
+ end
+ local jstr, res = https.request('https://pokeapi.co/api/v2/pokemon/' .. url.escape(pokemon))
+ if res ~= 200 then
+ return 'Please make sure you\'ve specified the Pokémon by its correct name. Alternatively, you can specify it by its Pokédex ID.'
+ end
+ local jdat = json.decode(jstr)
+ local name = jdat.name:gsub('^%l', string.upper)
+ local id = '#' .. jdat.id
+ local descriptions = {}
+ local description = 'Description unavailable'
+ jstr, res = https.request('https://pokeapi.co/api/v2/pokemon-species/' .. jdat.id)
+ if res == 200 then
+ description = json.decode(jstr)
+ for _, v in pairs(description.flavor_text_entries) do
+ if v.language.name == 'en' then
+ table.insert(descriptions, v)
+ end
+ end
+ if next(descriptions) then
+ description = descriptions[#descriptions].flavor_text:gsub('[\n\f]', ' ')
+ end
+ end
+ description = description:gsub('[Pp][Oo][Kk][Eeé]?[Mm][Oo][Nn]', 'Pokémon')
local poke_type
- for _, v in ipairs(jdat.types)
- do
- local type_name = v.name:gsub('^%l', string.upper)
- if not poke_type
- then
+ for _, v in pairs(jdat.types) do
+ local type_name = v.type.name:gsub('^%l', string.upper)
+ if not poke_type then
poke_type = type_name
else
poke_type = poke_type .. ' / ' .. type_name
end
end
poke_type = poke_type .. ' type'
- return mattata.send_photo(
- message.chat.id,
- 'https://img.pokemondb.net/artwork/' .. name:gsub('^%u', string.lower) .. '.jpg',
- string.format(
- language['pokedex']['1'],
- name,
- id,
- poke_type,
- description
- )
- )
+ local output = '<a href="%s">%s</a> <b>%s</b>\n%s\n\n<em>%s</em>'
+ output = string.format(output, 'https://img.pokemondb.net/artwork/' .. name:gsub('^%u', string.lower) .. '.jpg', id, name, poke_type, description)
+ if jdat.species then
+ local species = jdat.species.url:match('species/(%d*)/$')
+ species = pokedex.get_chain(species)
+ if species then
+ output = output .. '\n\n' .. species
+ end
+ end
+ return output
+end
+
+function pokedex.on_message(_, message, _, language)
+ local input = mattata.input(message.text:lower())
+ if not input then
+ return mattata.send_reply(message, 'Please select a Pokémon:', nil, false, pokedex.get_keyboard(1, 3, 21))
+ end
+ local output = pokedex.get_pokemon(input, language)
+ return mattata.send_message(message.chat.id, output, 'html', false, false)
end
return pokedex
\ No newline at end of file
diff --git a/plugins/quotes.lua b/plugins/quotes.lua
index 6e8a4c1..27e7857 100644
--- a/plugins/quotes.lua
+++ b/plugins/quotes.lua
@@ -1,232 +1,258 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local quotes = {}
local mattata = require('mattata')
local redis = require('libs.redis')
function quotes:init()
quotes.commands = mattata.commands(self.info.username):command('quotes').table
quotes.help = '/quotes - Edit which quotes are saved in the database under your name.'
end
function quotes.get_quote(user, quote_number)
quote_number = tonumber(quote_number)
local all = redis:smembers('user:' .. user .. ':quotes')
if not all then
return 'You don\'t have any quotes!'
end
if #all < quote_number then
return 'Invalid quote number!'
end
local output = all[quote_number]
local voice = false
if output:match('^%$voice:.-$') then
output = output:match('^%$voice:(.-)$')
voice = true
end
return output, voice
end
function quotes.get_confirmation_keyboard(user, quote_number, page)
quote_number = tonumber(quote_number)
local all = redis:smembers('user:' .. user .. ':quotes')
if not all then
return {}
elseif not all[quote_number] then
return {}
end
return mattata.inline_keyboard():row(
mattata.row()
:callback_data_button(
mattata.symbols.back .. ' Back',
'quotes:' .. user .. ':back:' .. page
)
:callback_data_button(
'Delete',
'quotes:' .. user .. ':delete:' .. quote_number
)
)
end
function quotes.get_quotes(user)
local all = redis:smembers('user:' .. user .. ':quotes')
if not all then
return false
end
return all
end
-function quotes.get_keyboard(user, page, columns, per_page)
+function quotes.get_pages(user, per_page)
+ local all = quotes.get_quotes(user)
+ if not all then
+ return false
+ end
+ local page_count = math.floor(#all / per_page)
+ if page_count < #all / per_page then
+ page_count = page_count + 1
+ end
+ return all, page_count
+end
+
+function quotes.get_keyboard(all, user, page, columns, per_page)
page = page or 1
- local toggleable = quotes.get_quotes(user)
- if not toggleable then
+ if not all then
return false
end
- local page_count = math.floor(#toggleable / per_page)
- if page_count < #toggleable / per_page then
+ local page_count = math.floor(#all / per_page)
+ if page_count < #all / per_page then
page_count = page_count + 1
end
if page < 1 then
page = page_count
elseif page > page_count then
page = 1
end
local start_res = (page * per_page) - (per_page - 1)
local end_res = start_res + (per_page - 1)
- if end_res > #toggleable then
- end_res = #toggleable
+ if end_res > #all then
+ end_res = #all
end
local quote = 0
local output = {}
- for k, v in pairs(toggleable) do
+ for k, v in pairs(all) do
quote = quote + 1
if v:match('^%$voice:.-$') then
v = '[Voice Message]'
end
if quote >= start_res and quote <= end_res then
table.insert(output, {
['quote_number'] = k,
['quote_text'] = v
})
end
end
local keyboard = {
['inline_keyboard'] = {
{}
}
}
local columns_per_page = math.floor(#output / columns)
if columns_per_page < (#output / columns) then
columns_per_page = columns_per_page + 1
end
local rows_per_page = math.floor(#output / columns_per_page)
if rows_per_page < (#output / columns_per_page) then
rows_per_page = rows_per_page + 1
end
local current_row = 1
local count = 0
for n in pairs(output) do
count = count + 1
if count == (rows_per_page * current_row) + 1 then
current_row = current_row + 1
table.insert(keyboard.inline_keyboard, {})
end
table.insert(keyboard.inline_keyboard[current_row], {
['text'] = tostring(output[n].quote_number) .. ': ' .. output[n].quote_text,
['callback_data'] = string.format(
'quotes:%s:%s:%s', user,
output[n].quote_number, page
)
})
end
if page_count > 1 then
table.insert(keyboard.inline_keyboard, {{
['text'] = mattata.symbols.back .. ' Previous',
['callback_data'] = string.format(
'quotes:%s:page:%s',
user,
page - 1
)
}, {
['text'] = string.format(
'%s/%s',
page,
page_count
),
['callback_data'] = 'quotes:nil'
}, {
['text'] = 'Next ' .. mattata.symbols.next,
['callback_data'] = string.format(
'quotes:%s:page:%s',
user,
page + 1
)
}})
end
if count <= 0 then
return false
end
return keyboard
end
function quotes.on_callback_query(_, callback_query, message)
if not callback_query.data:match('^.-:.-:.-$') then
return
end
local user, callback_type, page = callback_query.data:match('^(.-):(.-):(.-)$')
if tostring(callback_query.from.id) ~= tostring(user) then
return mattata.answer_callback_query(callback_query.id, 'You are not allowed to use this!')
end
+ local all, page_count = quotes.get_pages(callback_query.from.id, 10)
+ page_count = page_count or 1
if callback_type == 'back' or callback_type == 'page' then
+ page = tonumber(page)
+ if page > page_count then
+ page = 1
+ elseif page < 1 then
+ page = page_count
+ end
local success = mattata.edit_message_text(
message.chat.id,
message.message_id,
'Please select a quote:',
nil, false,
quotes.get_keyboard(
- callback_query.from.id,
+ all, callback_query.from.id,
tonumber(page), 2, 10
)
)
if not success then
return mattata.edit_message_text(
message.chat.id,
message.message_id,
'All quotes saved under your database entry have already been deleted!'
)
end
return mattata.answer_callback_query(callback_query.id)
elseif callback_type == 'delete' then
- local all = redis:smembers('user:' .. callback_query.from.id .. ':quotes')
if #all == 0 then
return mattata.answer_callback_query(callback_query.id, 'All quotes saved under your database entry have already been deleted!')
end
page = tonumber(page)
local quote = all[page]
if not quote then
return mattata.answer_callback_query(callback_query.id, 'This quote no longer exists!')
end
redis:srem('user:' .. callback_query.from.id .. ':quotes', quote)
- return mattata.answer_callback_query(callback_query.id, 'That quote has been deleted from my database!')
- elseif callback_type == 'back' then
- return mattata.edit_message_reply_markup(
+ mattata.answer_callback_query(callback_query.id, 'That quote has been deleted from my database!')
+ all = quotes.get_quotes(callback_query.from.id) -- Update the quotes.
+ return mattata.edit_message_text(
message.chat.id,
message.message_id,
- nil, quotes.get_keyboard(
- callback_query.from.id,
+ 'Please select a quote:',
+ nil, false,
+ quotes.get_keyboard(
+ all, callback_query.from.id,
tonumber(page), 2, 10
)
)
+ elseif callback_type == 'back' then
+ return mattata.edit_message_reply_markup(
+ message.chat.id, message.message_id, nil,
+ quotes.get_keyboard(all, callback_query.from.id, tonumber(page), 2, 10)
+ )
end
local keyboard = quotes.get_confirmation_keyboard(
callback_query.from.id,
callback_type,
page
)
local quote, voice = quotes.get_quote(callback_query.from.id, callback_type)
if voice then
local success = mattata.send_voice(message.chat.id, quote)
if success then
quote = 'Please listen to the voice message below:'
else
quote = 'I couldn\'t send that voice message as it\'s no longer on Telegram\'s servers. You might as well delete this!'
end
end
local success = mattata.edit_message_text(message.chat.id, message.message_id, quote, nil, false, keyboard)
if not success then
return mattata.edit_message_text(message.chat.id, message.message_id, 'All quotes saved under your database entry have been deleted!')
end
end
function quotes.on_message(_, message)
- local keyboard = quotes.get_keyboard(message.from.id, 1, 2, 10)
+ local all = quotes.get_pages(message.from.id, 10)
+ local keyboard = quotes.get_keyboard(all, message.from.id, 1, 2, 10)
if not keyboard then
return mattata.send_reply(message, 'You don\'t have any quotes saved in my database! Use /save in reply to one of your messages to save it!')
end
return mattata.send_message(message.chat.id, 'Please select a quote:', nil, true, false, nil, keyboard)
end
return quotes
\ No newline at end of file
diff --git a/plugins/reddit.lua b/plugins/reddit.lua
index ed49f5c..5143f35 100644
--- a/plugins/reddit.lua
+++ b/plugins/reddit.lua
@@ -1,76 +1,92 @@
--[[
Based on a plugin by topkecleon. Licensed under GNU AGPLv3
https://github.com/topkecleon/otouto/blob/master/LICENSE.
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local reddit = {}
local mattata = require('mattata')
local https = require('ssl.https')
-local url = require('socket.url')
local json = require('dkjson')
function reddit:init()
reddit.commands = mattata.commands(self.info.username, { '^/r/' }):command('r/'):command('reddit').table
reddit.help = '/r/subreddit - Returns the latest posts from the given subreddit.'
end
-function reddit.format_results(posts)
+function reddit.format_results(posts, limit)
local output = {}
if #posts == 0 then
return false
end
- for k, v in pairs(posts) do
+ local count = 0
+ for _, v in pairs(posts) do
+ count = count + 1
+ if count > limit then
+ break
+ end
local post = v.data
local title = post.title
if title:len() > 250 then
title = mattata.trim(title:sub(1, 250)) .. '...'
end
local short_url = 'redd.it/' .. post.id
local result = '<a href="' .. mattata.escape_html(short_url) .. '">' .. mattata.escape_html(title) .. '</a>'
if post.domain and not post.is_self then
post.url = mattata.escape_html(post.url)
post.domain = mattata.escape_html(post.domain)
result = mattata.symbols.bullet .. ' <code>[</code><a href="' .. post.url .. '">' .. post.domain .. '</a><code>]</code> ' .. result
- table.insert(output, result)
+ else
+ result = mattata.symbols.bullet .. ' ' .. result
end
+ table.insert(output, result)
end
return table.concat(output, '\n')
end
-function reddit:on_message(message, configuration, language)
- local limit = message.chat.type ~= 'private' and 4 or 8
+function reddit.on_message(_, message, configuration, language)
+ local limit = message.chat.type ~= 'private' and configuration.limits.reddit.public or configuration.limits.reddit.private
local input = mattata.input(message.text)
local subreddit = message.text:match('^/r/([%w][%w_]+)%s?')
if input and not subreddit then
subreddit = input
elseif not input and not subreddit then
return mattata.send_reply(message, reddit.help)
end
if not subreddit or subreddit:len() > 21 or subreddit:len() < 2 then
return mattata.send_reply(message, 'That\'s not a valid subreddit!')
end
- local output = '<b>/r/' .. subreddit .. '</b>\n'
local request_url = 'https://www.reddit.com/.json?limit=' .. limit
+ local old_timeout = https.TIMEOUT
+ https.TIMEOUT = 1
+ if subreddit == 'random' or subreddit == 'randnsfw' then
+ if message.chat.type ~= 'private' and subreddit == 'randnsfw' then
+ subreddit = 'random'
+ end
+ local _, _, headers = https.request({
+ ['url'] = 'https://www.reddit.com/r/' .. subreddit .. '.json?limit=1',
+ ['redirect'] = false
+ })
+ subreddit = headers.location and headers.location:match('r/(.-)/%.json') or 'all'
+ end
if subreddit ~= 'all' then
request_url = 'https://www.reddit.com/r/' .. subreddit .. '/.json?limit=' .. limit
end
- local old_timeout = https.TIMEOUT
- https.TIMEOUT = 1
+ local output = '<b>/r/' .. subreddit .. '</b>\n'
local jstr, res = https.request(request_url)
https.TIMEOUT = old_timeout
if res == 404 or res == 'wantread' then
return mattata.send_reply(message, language['errors']['results'])
elseif res ~= 200 then
return mattata.send_reply(message, language['errors']['connection'])
end
local jdat = json.decode(jstr)
if not jdat or not jdat.data or #jdat.data.children < 1 then
return mattata.send_reply(message, language['errors']['results'])
end
- output = output .. reddit.format_results(jdat.data.children)
+ output = output .. reddit.format_results(jdat.data.children, limit)
return mattata.send_message(message.chat.id, output, 'html', true)
end
return reddit
\ No newline at end of file
diff --git a/plugins/sed.lua b/plugins/sed.lua
index 82adcf1..7848bea 100644
--- a/plugins/sed.lua
+++ b/plugins/sed.lua
@@ -1,162 +1,160 @@
--[[
Based on a plugin by topkecleon. Licensed under GNU AGPLv3
https://github.com/topkecleon/otouto/blob/master/LICENSE.
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local sed = {}
local mattata = require('mattata')
local re = require('re')
local regex = require('rex_pcre')
function sed:init()
- sed.commands = { '^%/?[sS]%/.-%/.-%/?$' }
- sed.help = '/s/pattern/substitution - Replaces all occurences, of text matching a given Lua pattern, with the given substitution.'
+ sed.commands = { '^[sS]/.-/.-/?.?$' }
+ sed.help = 's/pattern/substitution - Replaces all occurences, of text matching a given Lua pattern, with the given substitution.'
end
local compiled = re.compile[[
invocation <- 's/' {~ pcre ~} '/' {~ replace ~} ('/' modifiers)? !.
pcre <- ( [^\/] / slash / '\' )*
replace <- ( [^\/%$] / percent / slash / capture / '\' / '$' )*
modifiers <- { flags? } {~ matches? ~} {~ probability? ~}
flags <- ('i' / 'm' / 's' / 'x' / 'U' / 'X')+
matches <- ('#' {[0-9]+}) -> '%1'
probability <- ('%' {[0-9]+}) -> '%1'
slash <- ('\' '/') -> '/'
percent <- '%' -> '%%%%'
capture <- ('$' {[0-9]+}) -> '%%%1'
]]
function sed:on_callback_query(callback_query, message, configuration, language)
if not message.reply then
return mattata.delete_message(message.chat.id, message.message_id)
elseif mattata.is_global_admin(callback_query.from.id) then -- we'll pull a sneaky on them
callback_query.from = message.reply.from
elseif message.reply.from.id ~= callback_query.from.id then
return mattata.answer_callback_query(callback_query.id, 'That\'s not your place to say!')
end
local output = string.format(
'<b>%s:</b>\n%s',
message.text:match('^(.-):'),
message.text:match(':\n(.-)$')
)
if callback_query.data:match('^no$') then
output = string.format(
language['sed']['1'],
output,
mattata.escape_html(callback_query.from.first_name)
)
elseif callback_query.data:match('^yes$') then
output = string.format(
language['sed']['2'],
output,
mattata.escape_html(callback_query.from.first_name)
)
elseif callback_query.data:match('^maybe$') then
output = string.format(
language['sed']['3'],
output,
mattata.escape_html(callback_query.from.first_name)
)
end
return mattata.edit_message_text(
message.chat.id,
message.message_id,
output,
'html'
)
end
function sed:on_message(message, _, language)
if not message.reply then
return false
elseif message.reply.from.id == self.info.id then
return mattata.send_reply(
message,
language['sed']['4'],
'html'
)
end
local input = message.reply.text
- local text = message.text:match('^/?(.*)$')
+ local text = message.text:match('^[sS]/(.*)$')
if not text then
return false
end
+ text = 's/' .. text
local pattern, replace, flags, matches, probability = compiled:match(text)
if not pattern then
return false
end
if matches then matches = tonumber(matches) end
if probability then probability = tonumber(probability) end
if probability then
if not matches then
matches = function()
return math.random() * 100 < probability
end
else
local remaining = matches
matches = function()
local temp
if remaining > 0 then
temp = nil
else
temp = 0
end
remaining = remaining - 1
return math.random() * 100 < probability, temp
end
end
end
local success, result, matched = pcall(function ()
return regex.gsub(input, pattern, replace, matches, flags)
end)
if success == false then
return mattata.send_reply(
message,
string.format(
'%s is invalid PCRE regex syntax!',
mattata.escape_html(text)
),
'html'
)
elseif matched == 0 then
return
end
result = mattata.trim(result)
if not result or result == '' then
return false
end
return mattata.send_message(
message.chat.id,
string.format(
language['sed']['6'],
mattata.escape_html(message.reply.from.first_name),
mattata.escape_html(result)
),
'html',
true,
false,
message.reply.message_id,
mattata.inline_keyboard():row(
- mattata.row()
- :callback_data_button(
- language['sed']['7'],
+ mattata.row():callback_data_button(
+ utf8.char(128077),
'sed:yes'
- )
- :callback_data_button(
- language['sed']['8'],
+ ):callback_data_button(
+ utf8.char(128078),
'sed:no'
- )
- :callback_data_button(
- language['sed']['9'],
+ ):callback_data_button(
+ '¯\\_(ツ)_/¯',
'sed:maybe'
)
)
)
end
return sed
\ No newline at end of file
diff --git a/plugins/spamwatch.lua b/plugins/spamwatch.lua
index 221cc08..94f0da8 100644
--- a/plugins/spamwatch.lua
+++ b/plugins/spamwatch.lua
@@ -1,51 +1,51 @@
--[[
Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
This code is licensed under the MIT. See LICENSE for details.
]]
local spamwatch = {}
local mattata = require('mattata')
function spamwatch:init()
spamwatch.commands = mattata.commands(self.info.username):command('spamwatch'):command('sw').table
spamwatch.help = '/spamwatch [user] - Returns SpamWatch information for the given user, either specified or replied-to. Alias: /sw.'
end
-function spamwatch:on_new_message(message, configuration, language)
- if message.chat.type == 'private' then
+function spamwatch:on_new_message(message)
+ if message.chat.type ~= 'supergroup' then
return false
elseif not mattata.get_setting(message.chat.id, 'ban spamwatch users') then
return false
elseif self.is_spamwatch_blocklisted then
mattata.ban_chat_member(message.chat.id, message.from.id)
end
return false
end
-function spamwatch:on_message(message, configuration, language)
+function spamwatch:on_message(message)
local input = message.reply and message.reply.from.id or mattata.input(message.text)
if not input then
return mattata.send_reply(message, spamwatch.help)
end
local user = mattata.get_user(input)
if not user then
if not input:match('^%d+$') then
return mattata.send_reply(message, 'I couldn\'t get any information about that user. To teach me who they are, forward a message from them. This will only work if they don\'t have forward privacy enabled!')
end
user = { ['result'] = { ['id'] = input:match('^(%d+)$') } }
end
user = user.result.id
local res, jdat = mattata.is_spamwatch_blocklisted(user)
if not res then
return mattata.send_reply(message, 'That user isn\'t in the SpamWatch database!')
end
local output = {
'<b>ID:</b> ' .. jdat.id,
'<b>Reason:</b> ' .. mattata.escape_html(jdat.reason),
'<b>Date banned:</b> ' .. os.date('%x', jdat.date)
}
output = table.concat(output, '\n')
return mattata.send_reply(message, output, 'html')
end
return spamwatch
\ No newline at end of file
diff --git a/plugins/transcribe.lua b/plugins/transcribe.lua
new file mode 100644
index 0000000..9396844
--- /dev/null
+++ b/plugins/transcribe.lua
@@ -0,0 +1,47 @@
+--[[
+ Copyright 2020 Matthew Hesketh <matthew@matthewhesketh.com>
+ This code is licensed under the MIT. See LICENSE for details.
+]]
+
+local transcribe = {}
+local mattata = require('mattata')
+local json = require('dkjson')
+local redis = require('libs.redis')
+
+function transcribe:init()
+ transcribe.commands = mattata.commands(self.info.username):command('transcribe'):command('tts').table
+ transcribe.help = '/transcribe - Transcribes the replied-to voice message using wit.ai. Alias: /tts.'
+end
+
+function transcribe.is_valid(message)
+ local voice = message.reply and message.reply.voice or message.voice
+ if voice.mime_type ~= 'audio/ogg' then
+ return false
+ elseif voice.duration > 20 then
+ return false
+ elseif voice.file_size >= 20000000 then
+ return false
+ end
+ return true
+end
+
+function transcribe.on_new_message(_, message)
+ if message.chat.type == 'private' or not message.voice or not transcribe.is_valid(message) then
+ return false
+ end
+ redis:set('transcribe:' .. message.chat.id .. ':' .. message.message_id, json.encode(message))
+ return
+ end
+
+ function transcribe.on_message(_, message)
+ if not message.reply then
+ return mattata.send_reply(message, transcribe.help)
+ elseif not message.reply.voice then
+ return mattata.send_reply(message, 'You can only use this message in reply to voice messages!')
+ elseif not transcribe.is_valid(message) then
+ return mattata.send_reply(message, 'The voice message must meet the following conditions:\n1. It must be 20 seconds or less in length\n2. It must be 20MB or less in file size\n3. It must be of the audio/ogg MIME type')
+ end
+ return redis:set('transcribe:' .. message.chat.id .. ':' .. message.message_id, json.encode(message.reply))
+end
+
+return transcribe
\ No newline at end of file
diff --git a/ai.sh b/transcribe.sh
similarity index 78%
copy from ai.sh
copy to transcribe.sh
index d43f645..8bed4b3 100644
--- a/ai.sh
+++ b/transcribe.sh
@@ -1,12 +1,12 @@
#!/bin/sh
if [ ! -f ./configuration.lua ]
then
echo "Please insert the required variables into configuration.example.lua. Then, you need to rename configuration.example.lua to configuration.lua!"
else
cd helpers/
while true; do
- lua ai.lua
- echo "AI has stopped!"
+ lua transcribe.lua
+ echo "Transcribe helper has stopped!"
sleep 3s
done
fi

File Metadata

Mime Type
text/x-diff
Expires
Fri, Sep 12, 8:20 PM (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
42931
Default Alt Text
(602 KB)

Event Timeline