15. OOB

OOB(Out of Band) は、動的にロードされるクラスとAIMLのoob要素で指定するOOB機能の名称の組み合わせで実現します。 使用するOOB機能毎に、Pythonクラスを実装し、コンフィグレーションの OOB設定 で、以下の様に機能名と関連付けを行う必要があります。

パラメータ名 説明  
OOBの名称   この項目に設定した名称が、AIMLで指定するOOB名になります。例では’email’がOOB名になります。
  classname 実装を行うOOBのpythonのクラスパスを定義します。OOB内を実装する子要素は実装クラスで定義しており、configで指定する必要はありません。

OOBの実装基底クラスは次のように定義されています。

# programy/oob/defaults/oob.py

import xml.etree.ElementTree as ET

class OutOfBandProcessor(object):

    def __init__(self):
        self._xml = None

    # Override this method to extract the data for your command
    # See actual implementations for details of how to do this
    def parse_oob_xml(self, oob: ET.Element):
        self._xml = oob
        return True

    # Override this method in your own class to do something
    # useful with the command data
    def execute_oob_command(self, client_context):
        raise NotImplementedError()

    def process_out_of_bounds(self, client_context, oob: ET.Element):
        if self.parse_oob_xml(oob) is True:
            return self.execute_oob_command(client_context)
        return ""

電子メールを送信するOOB機能がある場合、OOBを利用するAIMLは次のように記載します。

<oob>
    <email>
        <to>宛先</to>
        <subject>件名</subject>
        <body>本文</body>
    </email>
</oob>

この場合、OOBの処理クラスに渡される引数は以下のXMLになります。

<oob>
    <to>宛先</to>
    <subject>件名</subject>
    <body>本文</body>
</oob>

実装クラスは次のようになります。 parse_oob_xml()メソッドでAIMLのoob要素で指定された内容(XML形式)から引数値を取得し、execute_oob_command()メソッドで実際にメールを送信する処理を実装します。

# programy/oob/email/email.py

from programy.oob.defaults.oob import OutOfBandProcessor

class EmailOutOfBandProcessor(OutOfBandProcessor):

    def __init__(self):
        OutOfBandProcessor.__init__(self)
        self._to = None
        self._subject = None
        self._body = None

    def parse_oob_xml(self, oob: ET.Element):
        for child in oob:
            if child.tag == 'to':
                self._to = child.text
            elif child.tag == 'subject':
                self._subject = child.text
            elif child.tag == 'body':
                self._body = child.text
            else:
                logging.error ("Unknown child element [%s] in email oob"%(child.tag))

            if self._to is not None and \
                self._subject is not None and \
                self.body is not None:
                return True

            logging.error("Invalid email oob command")
            return False

    def execute_oob_command(self, client_context):
        logging.info("EmailOutOfBandProcessor: Emailing=%s", self._to)
        return ""

OOB機能を利用するための定義として、コンフィグレーションで以下の設定を行います。

oob:
    email:
        classname: programy.oob.email.email.EmailOutOfBandProcessor

OOBの詳細設定方法は、 OOBの設定 を参照してください。