This is a simple chatbot for Tinode using gRPC API. It's written in Python as a demonstration that the API is language-independent.
The chat bot subscribes to events stream using Plugin API and logs in as a regular user. The event stream API is used to listen for creation of new accounts. When a new account is created, the bot initiates a p2p topic with the new user. Then it listens for messages sent to the topic and responds to each with a random quote from quotes.txt
file.
Generated files are provided for convenience in a separate folder. You may re-generate them if needed:
python -m pip install grpcio-tools
python -m grpc_tools.protoc -../../pbx --python_out=. --grpc_python_out=. ../../pbx/model.proto
Chatbot expects gRPC binding to be provided as tinode-grpc
. If you want to use them locally, first copy model_pb2.py
and model_pb2_grpc.py
to the same folder as chatbot.py
then find the lines
from tinode_grpc import pb
from tinode_grpc import pbx
in chatbot.py
and replace them with
import model_pb2 as pb
import model_pb2_grpc as pbx
gRPC requires python 2.7 or 3.4 or higher. Make sure pip 9.0.1 or higher is installed.
$ python -m pip install --upgrade pip
If you cannot upgrade pip due to a system-owned installation, you can run install it in a virtualenv
:
$ python -m pip install virtualenv
$ virtualenv venv
$ source venv/bin/activate
$ python -m pip install --upgrade pip
$ python -m pip install -r requirements.txt
On El Capitan OSX, you may get the following error:
$ OSError: [Errno 1] Operation not permitted: '/tmp/pip-qwTLbI-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
You can work around this using:
$ python -m pip install tinode_grpc --ignore-installed
Start the tinode server first. Then start the chatbot with credentials of the user you want to be your bot, alice
in this example:
python chatbot.py --login-basic=alice:alice123
If you want to run the bot in the background, start it as
nohup python chatbot.py --login-basic=alice:alice123 &
Run python chatbot.py -h
for more options.
If you are using python 2, keep in mind that condition.wait()
is forever buggy. As a consequence of this bug the bot cannot be terminated with a SIGINT. It has to be stopped with a SIGKILL.
You can use cookie file to store credentials. Sample cookie files are provided as basic-cookie.sample
and token-cookie.sample
. Once authenticated the bot will store the token in the cookie file, .tn-cookie
by default. If you have a cookie file with the desired credentials, you can run the bot with no parameters:
python chatbot.py
If the server is configured to use TLS, i.e. running as httpS://my-server.example.com/
, the gRPC endpoint also uses the same SSL certificate. In that case add the --ssl
option when starting the chatbot. If you want the chatbot to connect to the secure server over a local network or under a different name rather than the my-server.example.com
, for instance as localhost
, you must specify the SSL domain name to use, otherwise the server will not be able to find the right SSL certificate:
python chatbot.py --host=localhost:6001 --ssl --ssl-host=my-server.example.com
Quotes are read from quotes.txt
by default. The file is plain text with one quote per line.
Warning! Although the chatbot itself is less than 11KB, the chatbot Docker image is 175MB: the :slim
Python 3 image is about 140MB, gRPC adds another ~30MB.
-
Follow instructions to build and run dockerized Tinode chat server up to and including step 3.
-
In step 4 run the server adding
--env PLUGIN_PYTHON_CHAT_BOT_ENABLED=true
and--volume botdata:/botdata
to the command line:- RethinkDB:
$ docker run -p 6060:18080 -d --name tinode-srv --env PLUGIN_PYTHON_CHAT_BOT_ENABLED=true --volume botdata:/botdata --network tinode-net tinode/tinode-rethink:latest
- MySQL:
$ docker run -p 6060:18080 -d --name tinode-srv --env PLUGIN_PYTHON_CHAT_BOT_ENABLED=true --volume botdata:/botdata --network tinode-net tinode/tinode-mysql:latest
- MongoDB:
$ docker run -p 6060:18080 -d --name tinode-srv --env PLUGIN_PYTHON_CHAT_BOT_ENABLED=true --volume botdata:/botdata --network tinode-net tinode/tinode-mongodb:latest
-
Run the chatbot
$ docker run -d --name tino-chatbot --network tinode-net --volume botdata:/botdata tinode/chatbot:latest
-
Test that the bot is functional by pointing your browser to http://localhost:6060/, login and talk to user
Tino
. The user should respond to every message with a random quote.
You may replace the :latest
with a different tag. See all available tags here:
In general try to use docker images all with the same tag.