summaryrefslogtreecommitdiff
path: root/addons/mail_bot
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail_bot')
-rw-r--r--addons/mail_bot/__manifest__.py2
-rw-r--r--addons/mail_bot/models/mail_bot.py51
-rw-r--r--addons/mail_bot/models/mail_channel.py2
-rw-r--r--addons/mail_bot/models/res_users.py2
-rw-r--r--addons/mail_bot/static/src/scss/odoobot_style.scss8
-rw-r--r--addons/mail_bot/views/assets.xml1
6 files changed, 47 insertions, 19 deletions
diff --git a/addons/mail_bot/__manifest__.py b/addons/mail_bot/__manifest__.py
index c1010924ea6..348754d3f62 100644
--- a/addons/mail_bot/__manifest__.py
+++ b/addons/mail_bot/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': 'OdooBot',
- 'version': '1.0',
+ 'version': '1.1',
'category': 'Productivity/Discuss',
'summary': 'Add OdooBot in discussions',
'description': "",
diff --git a/addons/mail_bot/models/mail_bot.py b/addons/mail_bot/models/mail_bot.py
index 7a4aebee197..6c17d60bbd4 100644
--- a/addons/mail_bot/models/mail_bot.py
+++ b/addons/mail_bot/models/mail_bot.py
@@ -25,7 +25,7 @@ class MailBot(models.AbstractModel):
if len(record) != 1 or values.get("author_id") == odoobot_id:
return
if self._is_bot_pinged(values) or self._is_bot_in_private_channel(record):
- body = values.get("body", "").replace(u'\xa0', u' ').strip().lower().strip(".?!")
+ body = values.get("body", "").replace(u'\xa0', u' ').strip().lower().strip(".!")
answer = self._get_answer(record, body, values, command)
if answer:
message_type = values.get('message_type', 'comment')
@@ -38,42 +38,53 @@ class MailBot(models.AbstractModel):
if self._is_bot_in_private_channel(record):
# main flow
if odoobot_state == 'onboarding_emoji' and self._body_contains_emoji(body):
- self.env.user.odoobot_state = "onboarding_attachement"
- return _("Great! 👍<br/>Now, try to <b>send an attachment</b>, like a picture of your cute dog...")
- elif odoobot_state == 'onboarding_attachement' and values.get("attachment_ids"):
self.env.user.odoobot_state = "onboarding_command"
- return _("Not a cute dog, but you get it 😊<br/>To access special features, <b>start your sentence with '/'</b>. Try to get help.")
+ self.env.user.odoobot_failed = False
+ return _("Great! 👍<br/>To access special commands, <b>start your sentence with</b> <span class=\"o_odoobot_command\">/</span>. Try getting help.")
elif odoobot_state == 'onboarding_command' and command == 'help':
self.env.user.odoobot_state = "onboarding_ping"
- return _("Wow you are a natural!<br/>Ping someone to grab its attention with @nameoftheuser. <b>Try to ping me using @OdooBot</b> in a sentence.")
+ self.env.user.odoobot_failed = False
+ return _("Wow you are a natural!<br/>Ping someone to grab its attention with @username. <b>Try to ping me using</b> <span class=\"o_odoobot_command\">@OdooBot</span> in a sentence.")
elif odoobot_state == 'onboarding_ping' and self._is_bot_pinged(values):
+ self.env.user.odoobot_state = "onboarding_attachement"
+ self.env.user.odoobot_failed = False
+ return _("Yep, I am here! 🎉 <br/>Now, try <b>sending an attachment</b>, like a picture of your cute dog...")
+ elif odoobot_state == 'onboarding_attachement' and values.get("attachment_ids"):
self.env.user.odoobot_state = "idle"
- return _("Yep, I am here! 🎉 <br/>You finished the tour, you can <b>close this chat window</b>. Enjoy discovering Odoo.")
- elif odoobot_state == "idle" and (_('start the tour') in body.lower()):
+ self.env.user.odoobot_failed = False
+ return _("I am a simple bot, but if that's a dog, he is the cutest 😊 <br/>Congratulations, you finished this tour. You can now <b>close this chat window</b>. Enjoy discovering Odoo.")
+ elif odoobot_state in ("idle", "not_initialized") and (_('start the tour') in body.lower()):
self.env.user.odoobot_state = "onboarding_emoji"
return _("To start, try to send me an emoji :)")
# easter eggs
elif odoobot_state == "idle" and body in ['❤️', _('i love you'), _('love')]:
return _("Aaaaaw that's really cute but, you know, bots don't work that way. You're too human for me! Let's keep it professional ❤️")
- elif odoobot_state == "idle" and (('help' in body) or _('help') in body):
- return _("I'm just a bot... :( You can check <a href=\"https://www.odoo.com/page/docs\">our documentation</a>) for more information!")
elif _('fuck') in body or "fuck" in body:
return _("That's not nice! I'm a bot but I have feelings... 💔")
+ # help message
+ elif self._is_help_requested(body) or odoobot_state == 'idle':
+ return _("Unfortunately, I'm just a bot 😞 I don't understand! If you need help discovering our product, please check "
+ "<a href=\"https://www.odoo.com/page/docs\" target=\"_blank\">our documentation</a> or "
+ "<a href=\"https://www.odoo.com/slides\" target=\"_blank\">our videos</a>.")
else:
- #repeat question
+ # repeat question
if odoobot_state == 'onboarding_emoji':
- return _("Not exactly. To continue the tour, send an emoji, <b>type \":)\"</b> and press enter.")
+ self.env.user.odoobot_failed = True
+ return _("Not exactly. To continue the tour, send an emoji: <b>type</b> <span class=\"o_odoobot_command\">:)</span> and press enter.")
elif odoobot_state == 'onboarding_attachement':
- return _("To <b>send an attachment</b>, click the 📎 icon on the right, and select a file.")
+ self.env.user.odoobot_failed = True
+ return _("To <b>send an attachment</b>, click on the <i class=\"fa fa-paperclip\" aria-hidden=\"true\"></i> icon and select a file.")
elif odoobot_state == 'onboarding_command':
- return _("Not sure wat you are doing. Please press / and wait for the propositions. Select \"help\" and press enter")
+ self.env.user.odoobot_failed = True
+ return _("Not sure what you are doing. Please, type <span class=\"o_odoobot_command\">/</span> and wait for the propositions. Select <span class=\"o_odoobot_command\">help</span> and press enter")
elif odoobot_state == 'onboarding_ping':
- return _("Sorry, I am not listening. To get someone's attention, <b>ping him</b>. Write \"@odoobot\" and select me.")
+ self.env.user.odoobot_failed = True
+ return _("Sorry, I am not listening. To get someone's attention, <b>ping him</b>. Write <span class=\"o_odoobot_command\">@OdooBot</span> and select me.")
return random.choice([
- _("I'm not smart enough to answer your question.<br/>To follow my guide, ask") + ": <b>"+_('start the tour') + "</b>",
+ _("I'm not smart enough to answer your question.<br/>To follow my guide, ask: <span class=\"o_odoobot_command\">start the tour</span>."),
_("Hmmm..."),
_("I'm afraid I don't understand. Sorry!"),
- _("Sorry I'm sleepy. Or not! Maybe I'm just trying to hide my unawareness of human language...<br/>I can show you features if you write")+ ": '<b>"+_('start the tour')+"</b>'.",
+ _("Sorry I'm sleepy. Or not! Maybe I'm just trying to hide my unawareness of human language...<br/>I can show you features if you write: <span class=\"o_odoobot_command\">start the tour</span>.")
])
return False
@@ -219,3 +230,9 @@ class MailBot(models.AbstractModel):
if record._name == 'mail.channel' and record.channel_type == 'chat':
return odoobot_id in record.with_context(active_test=False).channel_partner_ids.ids
return False
+
+ def _is_help_requested(self, body):
+ """Returns whether a message linking to the documentation and videos
+ should be sent back to the user.
+ """
+ return any(token in body for token in ['help', _('help'), '?']) or self.env.user.odoobot_failed
diff --git a/addons/mail_bot/models/mail_channel.py b/addons/mail_bot/models/mail_channel.py
index 8b792780971..909696e5618 100644
--- a/addons/mail_bot/models/mail_channel.py
+++ b/addons/mail_bot/models/mail_channel.py
@@ -23,7 +23,7 @@ class Channel(models.Model):
'email_send': False,
'name': 'OdooBot'
})
- message = _("Hello,<br/>Odoo's chat helps employees collaborate efficiently. I'm here to help you discover its features.<br/><b>Try to send me an emoji :)</b>")
+ message = _("Hello,<br/>Odoo's chat helps employees collaborate efficiently. I'm here to help you discover its features.<br/><b>Try to send me an emoji</b> <span class=\"o_odoobot_command\">:)</span>")
channel.sudo().message_post(body=message, author_id=odoobot_id, message_type="comment", subtype_xmlid="mail.mt_comment")
self.env.user.odoobot_state = 'onboarding_emoji'
return channel
diff --git a/addons/mail_bot/models/res_users.py b/addons/mail_bot/models/res_users.py
index f1975df23e4..8468bc16d0f 100644
--- a/addons/mail_bot/models/res_users.py
+++ b/addons/mail_bot/models/res_users.py
@@ -5,6 +5,7 @@ from odoo import models, fields
class Users(models.Model):
_inherit = 'res.users'
+
odoobot_state = fields.Selection(
[
('not_initialized', 'Not initialized'),
@@ -15,6 +16,7 @@ class Users(models.Model):
('idle', 'Idle'),
('disabled', 'Disabled'),
], string="OdooBot Status", readonly=True, required=True, default="not_initialized") # keep track of the state: correspond to the code of the last message sent
+ odoobot_failed = fields.Boolean(readonly=True)
def __init__(self, pool, cr):
""" Override of __init__ to add access rights.
diff --git a/addons/mail_bot/static/src/scss/odoobot_style.scss b/addons/mail_bot/static/src/scss/odoobot_style.scss
new file mode 100644
index 00000000000..aa5e187bb00
--- /dev/null
+++ b/addons/mail_bot/static/src/scss/odoobot_style.scss
@@ -0,0 +1,8 @@
+.o_odoobot_command {
+ background-color: lightgray;
+ border-radius: 4px;
+ padding: 2px;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-weight: bold;
+}
diff --git a/addons/mail_bot/views/assets.xml b/addons/mail_bot/views/assets.xml
index 243fa5228a2..e3d5ee81feb 100644
--- a/addons/mail_bot/views/assets.xml
+++ b/addons/mail_bot/views/assets.xml
@@ -3,6 +3,7 @@
<data>
<template id="assets_backend" name="mailbot assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
+ <link rel="stylesheet" type="text/scss" href="/mail_bot/static/src/scss/odoobot_style.scss"/>
<script type="text/javascript" src="/mail_bot/static/src/js/mailbot_service.js"></script>
<script type="text/javascript" src="/mail_bot/static/src/js/notification_alert.js"></script>
<script type="text/javascript" src="/mail_bot/static/src/js/systray_messaging_menu.js"></script>