Enhance Supybots Calculator/ru
Функция "calc" из плагина Math, который содержится в общей линейке плагинов ботов Supybot, оставляет желать лучшего. Функция не в состоянии работать с переменными и не может работать с заданным Вами математическим выражением, содержащим специальные символы, которые являются логическими математическими операторами.
Почему не надо использовать отдельное приложение... как например qalc.
Для начала, давайте рассмотрим код этой функции: откройте файл
/usr/share/python-support/supybot/supybot/plugins/Math/plugin.py
def calc(self, irc, msg, args, text):
"""<math expression>
Returns the value of the evaluated <math expression>. The syntax is
Python syntax; the type of arithmetic is floating point. Floating
point arithmetic is used in order to prevent a user from being able to
crash to the bot with something like '10**10**10**10'. One consequence
is that large values such as '10**24' might not be exact.
"""
if text != text.translate(utils.str.chars, '_[]'):
irc.error('There\'s really no reason why you should have '
'underscores or brackets in your mathematical '
'expression. Please remove them.')
return
#text = text.translate(utils.str.chars, '_[] \t')
if 'lambda' in text:
irc.error('You can\'t use lambda in this command.')
return
... lets keep the source short .....
except NameError, e:
irc.error('%s is not a defined function.' % str(e).split()[1])
except Exception, e:
irc.error(str(e))
calc = wrap(calc, ['text'])
Отлично, теперь мы нашли этот нехороший кусок странного кода, в котором была причина.. Давайте это исправим.
Сначала скопируйте полностью весь плагин "Math" в папку, где находятся плагины Вашего бота и снова раскройте для редактирования файл "plugin.py".
Найдите снова функцию "calc" и замените в ней код, который указан выше, на следующий код:
def calc(self, irc, msg, args, text):
"""<math expression>
Returns the value of the evaluated <math expression>. The syntax is
Qalculate syntax.
"""
if text != text.translate(utils.str.chars, '_[]'):
irc.error('There\'s really no reason why you should have '
'underscores or brackets in your mathematical '
'expression. Please remove them.')
return
import os
text = "\"" + text + "\""
irc.reply( os.popen("qalc " + text).read().strip("\n") )
calc = wrap(calc, ['text'])
Вначале, мы остановим вычисление, если математическое выражение задано не верно. Затем, мы к выражению добавляем ковычки, чтобы использовать специальные символы, которые являются математическими операторами, например круглые скобки. Наконец, мы отвечаем первой строкой вывода от qalc :).
Примечание: помните, если запустить qalc однажды как пользователь, это попросит у Вас загрузить дополнительные файлы. Не забывайте, что это приведёт к "заморозке" бота. Во-вторых, настройте supybot с использованием для вашей папки с плагинами высшего приоретета, иначе вы снова загрузите прежний плагин.
Теперь, просто отправьте команду reload Math вашему боту, результат Вас порадует.
[19:05:46] <damentz> .calc 3x^2 + 2x - 8 = 0 [19:05:46] <devastate> damentz: ((3 * (x^2)) + (2 * x) - 8) = 0 = approx. x = 1.3333333 or x = -2 [19:03:45] <damentz> .calc $/CAD [19:03:46] <devastate> damentz: dollar / CAD = approx. 1.2384326