diff --git a/addons/game_base/models/__init__.py b/addons/game_base/models/__init__.py index e83e93a..a05fd5d 100644 --- a/addons/game_base/models/__init__.py +++ b/addons/game_base/models/__init__.py @@ -2,5 +2,6 @@ from . import game_employee from . import game_achievement from . import game_mail from . import chat +from . import sensitive_word from . import page from . import asset diff --git a/addons/game_base/models/chat.py b/addons/game_base/models/chat.py index 192ecfd..87ee25f 100644 --- a/addons/game_base/models/chat.py +++ b/addons/game_base/models/chat.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import re -from odoo import models, fields +from odoo import api, models, fields # 游戏助手的展示昵称(前后端共用,落库消息的作者名) GUIDE_NAME = '游戏助手' @@ -29,6 +29,24 @@ class GameChatChannel(models.Model): creator_id = fields.Many2one('res.users', string='创建者') member_ids = fields.Many2many('res.users', string='成员') message_ids = fields.One2many('game.chat.message', 'channel_id', string='消息') + message_count = fields.Integer(string='消息数量', compute='_compute_message_count') + + @api.depends('message_ids') + def _compute_message_count(self): + for rec in self: + rec.message_count = len(rec.message_ids) + + def action_view_messages(self): + """从频道列表跳转查看该频道全部消息。""" + self.ensure_one() + return { + 'type': 'ir.actions.act_window', + 'name': '频道消息', + 'res_model': 'game.chat.message', + 'view_mode': 'list,form', + 'domain': [('channel_id', '=', self.id)], + 'context': dict(self.env.context), + } def generate_guide_reply(self, question): """内置游戏知识引擎(零外部依赖):按关键词检索 game.rule / game.rule.category 作答。 @@ -104,3 +122,12 @@ class GameChatMessage(models.Model): author_id = fields.Many2one('res.users', string='发送者') author_name = fields.Char(string='昵称') body = fields.Text(string='内容', required=True) + + @api.model_create_multi + def create(self, vals_list): + """创建消息时自动过滤敏感词。""" + sanitize = self.env['game.sensitive.word'].sanitize + for vals in vals_list: + if vals.get('body'): + vals['body'] = sanitize(vals['body']) + return super(GameChatMessage, self).create(vals_list) diff --git a/addons/game_base/models/sensitive_word.py b/addons/game_base/models/sensitive_word.py new file mode 100644 index 0000000..1171351 --- /dev/null +++ b/addons/game_base/models/sensitive_word.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +import re +from odoo import api, models, fields + + +class GameSensitiveWord(models.Model): + _name = 'game.sensitive.word' + _description = '聊天敏感词' + _order = 'name' + + name = fields.Char(string='敏感词', required=True, index=True) + active = fields.Boolean(string='启用', default=True) + replacement = fields.Char(string='替换为', default='**') + + _sql_constraints = [ + ('name_uniq', 'unique(name)', '敏感词不能重复'), + ] + + @api.model + def sanitize(self, text): + """将文本中的敏感词替换为对应替换字符(默认 **)。""" + if not text: + return text + words = self.search([('active', '=', True)]) + if not words: + return text + result = text + for w in words: + pat = re.escape(w.name) + repl = w.replacement or '**' + result = re.sub(pat, repl, result, flags=re.IGNORECASE) + return result diff --git a/addons/game_base/security/ir.model.access.csv b/addons/game_base/security/ir.model.access.csv index 8cb7c17..2fa3d5d 100644 --- a/addons/game_base/security/ir.model.access.csv +++ b/addons/game_base/security/ir.model.access.csv @@ -9,6 +9,8 @@ access_game_chat_channel,game.chat.channel public,model_game_chat_channel,base.g access_game_chat_channel_user,game.chat.channel user,model_game_chat_channel,base.group_user,1,1,1,1 access_game_chat_message,game.chat.message public,model_game_chat_message,base.group_public,1,0,0,0 access_game_chat_message_user,game.chat.message user,model_game_chat_message,base.group_user,1,1,1,1 +access_game_sensitive_word,game.sensitive.word public,model_game_sensitive_word,base.group_public,1,0,0,0 +access_game_sensitive_word_user,game.sensitive.word user,model_game_sensitive_word,base.group_user,1,1,1,1 access_game_page,game.page public,model_game_page,base.group_public,1,0,0,0 access_game_page_user,game.page user,model_game_page,base.group_user,1,1,1,1 access_game_page_item,game.page.item public,model_game_page_item,base.group_public,1,0,0,0 diff --git a/addons/game_base/views/chat_views.xml b/addons/game_base/views/chat_views.xml index 977bffe..6e40056 100644 --- a/addons/game_base/views/chat_views.xml +++ b/addons/game_base/views/chat_views.xml @@ -1,10 +1,11 @@ - + 世界聊天 - 10 + + 95 @@ -28,7 +29,8 @@ - + +