Enhance Supybots Calculator/ru

From SHellium Wiki
Jump to: navigation, search
Geographylogo.png In other languages: English | Afrikaans | Albanian | Arabic | Brazilian | Bulgarian | Catalan | Chinese | Croatian | Czech | Danish | Dutch | Esperanto | Estonian | Filipino | Finnish | Flemish | French | German | Greek | Hebrew | Hindi | Hungarian | Indonesian | Italian | Japanese | Latvian | Lithuanian | Macedonian | Malay | Malayalam | Norwegian (Bokmål) | Norwegian (Nynorsk) | Persian | Polish | Portuguese | Romanian | Russian | Serbian | Slovak | Slovenian | Spanish | Swedish | Turkish | Ukrainian | Urdu

Функция "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
Personal tools
Namespaces

Variants
Actions
Navigation
Indexes
SHellium Sites
Toolbox