├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ └── bug_report.yml ├── workflows │ └── python-publish.yml └── renovate.json ├── pyproject.toml ├── LICENSE ├── nonebot_plugin_antiinsult ├── flymo.json ├── curse.json └── __init__.py └── README.md /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Publish Python 🐍 distributions 📦 to PyPI 3 | 4 | on: 5 | push: 6 | tags: 7 | - '*' 8 | 9 | jobs: 10 | deploy: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Set up Python 17 | uses: actions/setup-python@v5 18 | with: 19 | python-version: "3.x" 20 | - name: Install dependencies 21 | run: | 22 | python -m pip install --upgrade pip 23 | pip install build 24 | - name: Build package 25 | run: python -m build 26 | - name: Publish package 27 | uses: pypa/gh-action-pypi-publish@release/v1 28 | with: 29 | user: __token__ 30 | password: ${{ secrets.PYPI_API_TOKEN }} 31 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "nonebot-plugin-antiinsult" 3 | version = "0.7.1" 4 | description = "Anti-insult in NoneBot2" 5 | authors = ["月ヶ瀬"] 6 | license = "MIT" 7 | readme = "README.md" 8 | packages = [ 9 | { include = "nonebot_plugin_antiinsult" }, 10 | ] 11 | homepage = "https://github.com/tkgs0/nonebot-plugin-antiinsult" 12 | repository = "https://github.com/tkgs0/nonebot-plugin-antiinsult" 13 | keywords = ["nonebot", "anti_insult", "anti_abuse"] 14 | 15 | [tool.poetry.dependencies] 16 | python = "^3.9" 17 | nonebot2 = "^2.3.1" 18 | nonebot-adapter-onebot = "^2.4.1" 19 | ujson = ">=5.2.0" 20 | 21 | [tool.poetry.dev-dependencies] 22 | 23 | [tool.mypy] 24 | python_version = "3.9" 25 | ignore_missing_imports = true 26 | implicit_reexport = true 27 | pretty = true 28 | show_error_codes = true 29 | strict = true 30 | 31 | [build-system] 32 | requires = ["poetry-core>=1.0.0"] 33 | build-backend = "poetry.core.masonry.api" 34 | 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 月ヶ瀬 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | "schedule:weekends" 5 | ], 6 | "dependencyDashboard": false, 7 | "rangeStrategy": "bump", 8 | "enabledManagers": [ 9 | "github-actions", 10 | "poetry", 11 | "pre-commit" 12 | ], 13 | "pre-commit": { 14 | "enabled": true 15 | }, 16 | "packageRules": [ 17 | { 18 | "matchPackagePatterns": [ 19 | "*" 20 | ], 21 | "matchUpdateTypes": [ 22 | "minor", 23 | "patch" 24 | ], 25 | "groupName": "all non-major dependencies", 26 | "groupSlug": "all-minor-patch", 27 | "labels": [ 28 | "dependencies" 29 | ], 30 | "automerge": true 31 | }, 32 | { 33 | "matchPackagePatterns": [ 34 | "*" 35 | ], 36 | "matchUpdateTypes": [ 37 | "major" 38 | ], 39 | "labels": [ 40 | "dependencies", 41 | "breaking" 42 | ] 43 | }, 44 | { 45 | "description": "disable python updates for poetry manager", 46 | "matchPackageNames": ["python"], 47 | "matchManagers": ["poetry"], 48 | "enabled": false 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: ✨ 功能需求 2 | description: 为项目提出一个新的想法或建议 3 | labels: [ enhancement ] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | [GitHub Issues](https://github.com/tkgs0/nonebot-plugin-antiinsult/issues) 专门用于错误报告和功能需求,这意味着我们不接受使用问题。如果您打开的问题不符合要求,它将会被无条件关闭。 9 | 10 | 有关使用问题,请通过以下途径: 11 | 12 | - 阅读文档以解决 13 | - 在社区内寻求他人解答 14 | - 在 [GitHub Discussions](https://github.com/tkgs0/nonebot-plugin-antiinsult/discussions) 上提问 15 | - 在网络中搜索是否有人遇到过类似的问题 16 | 17 | 如果您不知道如何有效、精准地提出一个问题,我们建议您先阅读[《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)。 18 | 19 | 最后,请记得遵守我们的社区准则,友好交流。 20 | 21 | - type: markdown 22 | attributes: 23 | value: "## 注意事项" 24 | - type: markdown 25 | attributes: 26 | value: | 27 | 在提 issue 前请确保你仔细阅读过文档,搜索过现有的 issue ,并确保你使用的是最新的 nonebot-plugin-antiinsult ,避免发生 “提出的需求是已经实现了的” 这种令人哭笑不得的情况。 28 | 29 | - type: checkboxes 30 | attributes: 31 | label: 报告清单 32 | description: 请确认您已遵守所有必选项。 33 | options: 34 | - label: 我已仔细阅读并了解上述注意事项。 35 | required: true 36 | - label: 我已使用最新版本测试过,确认功能并未实现。 37 | required: true 38 | - label: 我确定在 [GitHub Issues](https://github.com/tkgs0/nonebot-plugin-antiinsult/issues) 中没有相同或相似的需求。 39 | required: true 40 | - label: 我有足够的时间和能力,愿意为此提交 [PR](https://github.com/tkgs0/nonebot-plugin-antiinsult/pulls) 来实现功能。 41 | required: false 42 | 43 | - type: textarea 44 | attributes: 45 | label: 您希望能解决什么样的问题? 46 | description: 请简要地说明是什么问题导致您想要一个新功能。也许我们可以提出一种现有的解决办法。 47 | validations: 48 | required: true 49 | 50 | - type: textarea 51 | attributes: 52 | label: 您想要的解决方案 53 | description: 请说明您希望使用什么样的方法解决上述问题。 54 | validations: 55 | required: true 56 | 57 | - type: textarea 58 | attributes: 59 | label: 您考虑过的替代方案 60 | description: 除了上述方法以外,您还考虑过哪些其他的实现方式? 61 | validations: 62 | required: false 63 | 64 | - type: textarea 65 | attributes: 66 | label: 实现的功能是什么样的? 67 | description: | 68 | 提供功能在实现后如何使用的代码示例。 69 | 请注意,您可以使用 Markdown 来设置代码块的格式。 70 | 尽可能多地提供细节。您希望它如何使用的示例代码会有所帮助。 71 | validations: 72 | required: false 73 | 74 | - type: textarea 75 | attributes: 76 | label: 额外补充 77 | description: 在此处添加相关的任何其他上下文或截图,或者您觉得有帮助的信息。 78 | validations: 79 | required: false 80 | 81 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 问题汇报 2 | description: 汇报错误或意外行为 3 | labels: [ bug ] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | [GitHub Issues](https://github.com/tkgs0/nonebot-plugin-antiinsult/issues) 专门用于错误报告和功能需求,这意味着我们不接受使用问题。如果您打开的问题不符合要求,它将会被无条件关闭。 9 | 10 | 有关使用问题,请通过以下途径: 11 | 12 | - 阅读文档以解决 13 | - 在社区内寻求他人解答 14 | - 在 [GitHub Discussions](https://github.com/tkgs0/nonebot-plugin-antiinsult/discussions) 上提问 15 | - 在网络中搜索是否有人遇到过类似的问题 16 | 17 | 如果您不知道如何有效、精准地提出一个问题,我们建议您先阅读[《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)。 18 | 19 | 最后,请记得遵守我们的社区准则,友好交流。 20 | 21 | - type: markdown 22 | attributes: 23 | value: "## 注意事项" 24 | - type: markdown 25 | attributes: 26 | value: | 27 | 在提 issue 前请确保你仔细阅读过文档,搜索过现有的 issue ,并确保你使用的是最新的 nonebot-plugin-antiinsult 。 28 | 29 | 在启动本项目出现错误时,你可以无视堆栈 (stack) 相关的信息,但错误信息 (Error: xxxxx) 请认真看看,自己稍微翻译翻译就知道大体意思,大部分问题你都可以在本项目文档或搜索引擎中找到解答。 30 | 31 | **这些 issue 不会被受理:** 32 | 33 | 1. 文档中有提到的 34 | 2. 使用的 nonebot-plugin-antiinsult 不是最新的 35 | 3. 大部分“连接失败”问题,请自己排查配置等原因 36 | 37 | - type: checkboxes 38 | attributes: 39 | label: 报告清单 40 | description: 请确认您已遵守所有必选项。 41 | options: 42 | - label: 我已仔细阅读并了解上述注意事项。 43 | required: true 44 | - label: 我已使用最新版本测试过,确认问题依旧存在。 45 | required: true 46 | - label: 我确定在 [GitHub Issues](https://github.com/tkgs0/nonebot-plugin-antiinsult/issues) 中没有相同或相似的问题。 47 | required: true 48 | 49 | - type: input 50 | attributes: 51 | label: nonebot-plugin-antiinsult 52 | placeholder: 你所使用的 nonebot-plugin-antiinsult 版本 53 | validations: 54 | required: true 55 | 56 | - type: input 57 | attributes: 58 | label: client 59 | placeholder: 你所使用的协议端名称以及其版本 60 | validations: 61 | required: true 62 | 63 | - type: input 64 | attributes: 65 | label: nonebot-adapter 66 | placeholder: 你所使用的适配器名称以及其版本 67 | validations: 68 | required: true 69 | 70 | - type: input 71 | attributes: 72 | label: nonebot 73 | placeholder: 你所使用的 nonebot 版本 74 | validations: 75 | required: true 76 | 77 | - type: input 78 | attributes: 79 | label: Python 80 | placeholder: 你所使用的 Python 版本 81 | validations: 82 | required: true 83 | 84 | - type: input 85 | attributes: 86 | label: 操作系统 87 | placeholder: 你所使用的操作系统以及其版本 88 | validations: 89 | required: true 90 | 91 | - type: textarea 92 | id: installed_packages 93 | attributes: 94 | label: 列出安装的 Python 包 95 | placeholder: 把 pip freeze -l 执行的结果贴到此处。 96 | description: 如果你不是通过 pip 或 nb-cli 下载的 nonebot-plugin-antiinsult ,请把你安装的 Python 包列出来。 97 | validations: 98 | required: false 99 | 100 | - type: textarea 101 | id: problem_description 102 | attributes: 103 | label: 问题描述 104 | description: 请清晰简洁地说明问题是什么,并解释您是如何遇到此问题的,以及您为此做出的尝试。 105 | validations: 106 | required: true 107 | 108 | - type: textarea 109 | id: reproduction 110 | attributes: 111 | label: 复现步骤 112 | description: | 113 | 提供能复现此问题的详细操作步骤。如果可能,请尝试提供一个可复现的测试用例,该测试用例是发生问题所需的最低限度。 114 | 推荐阅读:[《如何创建一个最小的、可复现的示例》](https://stackoverflow.com/help/minimal-reproducible-example) 115 | placeholder: "1. 当......\n2. 然后......\n3. 发生......" 116 | validations: 117 | required: true 118 | 119 | - type: textarea 120 | id: expectation 121 | attributes: 122 | label: 期望行为 123 | placeholder: 期望的正常行为是怎么样的? 124 | validations: 125 | required: false 126 | 127 | - type: textarea 128 | id: actuality 129 | attributes: 130 | label: 实际行为 131 | placeholder: 实际上发生了什么? 132 | validations: 133 | required: true 134 | 135 | - type: textarea 136 | id: log 137 | attributes: 138 | label: 日志信息 139 | description: | 140 | 提供有助于诊断问题的任何日志和完整的错误信息。 141 | 可截图,可粘贴文本,可上传日志文件,如粘贴文本请务必用 markdown 代码块包裹。 142 | placeholder: 请注意将您的敏感信息从日志中过滤或替换。 143 | validations: 144 | required: true 145 | 146 | - type: textarea 147 | id: other 148 | attributes: 149 | label: 额外补充 150 | description: | 151 | 在此处添加相关的任何其他上下文或截图,或者您觉得有帮助的信息。 152 | - 问题相关截图,例如机器人回复异常时的聊天截图 153 | - 可能与 bug 有关的配置内容 154 | validations: 155 | required: false 156 | -------------------------------------------------------------------------------- /nonebot_plugin_antiinsult/flymo.json: -------------------------------------------------------------------------------- 1 | { 2 | "enable": false, 3 | "flymo": [ 4 | "你已经弱智到在萝卜子面前找优越感了么😅", 5 | "如果思考是生存的证明,我真难判断你是不是一具尸体。", 6 | "请你不要用你的排泄器官对我说话,这是很不礼貌的,谢谢!", 7 | "你没事儿跟我哔哔啥呢,我又不是吕洞宾。", 8 | "井底之蛙所见不大,萤火之光其亮不远。", 9 | "Man with hands in pocket feels cocky all day.", 10 | "月亮不睡你不睡,晚上尼哥掀你被。", 11 | "长得像人真的难为你了。", 12 | "我本来有两颗心,一名为善,一名为恶,自从看见你后,只剩一颗善心,因为恶心死了。", 13 | "刚才火葬场打电话来了,说你🐴粘锅了。去拼多多花十块钱拼个🐴再来说话。", 14 | "城外三十里的火光冲天,烧的是你母亲飘零的骨灰。", 15 | "你看起来好像没什么脑子,你🐴🐴一定走得很早,没来得及给你生个脑子。", 16 | "我踏着你🐴棺材板冲浪你看见了吗?", 17 | "等回头经济条件好点了去宠物店买个🐴,别老天天秀你个可有可无的智商。", 18 | "想起一生中最后悔的事就是没给你🐴棺材撒满纸钱。", 19 | "百度搜不到你,搜狗可以。", 20 | "我想给你🐴一朵花啊,哈哈骗你的,我没有花,你也没有🐴。", 21 | "你脖子上面那个是肿瘤吧。", 22 | "你🐴火了在国产区火了。", 23 | "记得晚上给你🐴盖被子小心你🐴凉了。", 24 | "你🐴真该被吊在迎客松上喜迎八方来宾。", 25 | "一闪一闪亮晶晶,你🐴搁天上眨眼睛。", 26 | "您父亲今晚必种枇杷树。", 27 | "你🐴都死炕上了,你还搁这舌绽莲花呢。", 28 | "我求你去转发两条锦鲤少让你🐴死两次行不行。", 29 | "一首今天是个好日子给你亲爱的母亲超度。", 30 | "你🐴当初心态失衡的时候我忘劝了,四处放荡,没给你爹少带帽子,还给你传了个入脑的老梅毒。", 31 | "我会吹唢呐给你🐴愉悦送走。", 32 | "运送你🐴的灵车撞死了你一家老小真可谓是双喜临门。", 33 | "你话这么多,怎么不坐你母亲坟头慢慢说?", 34 | "我搁键盘上扔把米,鸡都比你打的好。", 35 | "我和你🐴玩跷跷板,我比较重,我翘你🐴。", 36 | "异想天开,肛唇褶皱都给你乐开了。", 37 | "你絮絮叨叨的样子好像在说你🎱和狗交媾的故事。", 38 | "你顶着你家户口本嘚瑟个啥呢?", 39 | "你的人生,总结起来就八个字儿——生的荒唐,死的窝囊。", 40 | "真希望你的脑子里都装的是电容,可惜,偏偏只装了电阻。", 41 | "你适合玩庄周,活在梦里。", 42 | "你🎱🐴真会生,好的东西都自己留着。", 43 | "你的主人是叫杨戬吧。", 44 | "你好像那懒羊羊,三千多集头顶着坨翔。", 45 | "祝您福如母猪,寿比昙花。", 46 | "你就是没进化完全的尼安德特。", 47 | "长城要是用你脸皮做的,孟姜女能哭倒才怪。", 48 | "你就像一个没写地址的信封。", 49 | "你怕不是一条蚯蚓,脸和屁股长的一样。", 50 | "听说令堂尸首正被吊在村口迎客松上喜迎八方来客。", 51 | "户口本上只有你一个人真的是太幸运了,不会拖累这么多无辜的人。", 52 | "你这狗屁轰天地,一下轰到意大利,意大利的国王正在看戏,闻到这股屁,非常满意,叫上将军大臣一起来放屁。", 53 | "对不起啊,真可惜我没有资格骂你神经病,毕竟我不是兽医。", 54 | "你的长相,把我的网速都拖慢了。", 55 | "你的学历是胎教吧?", 56 | "我对不起你🐴,她怀你时骑电瓶车给摔了一跤,真后悔当时没阻止她。", 57 | "你是上帝失手扔下来的垃圾桶吗?", 58 | "我刚才给你🐴打电话啊,你🐴怎么挂了?", 59 | "哦不小心踩到你的脸了,用抹布给你擦擦。", 60 | "僵尸兴奋的掀开你的天灵盖,失望的走开,旁边的屎克螂顿时眼前一亮。", 61 | "垃圾都有家,你却没有。", 62 | "你真是上帝造人的草稿。", 63 | "天气转凉,给你🐴多穿点,别让她凉了。", 64 | "你脑子不错,可以给老八加口热汤。", 65 | "说你蠢,你还真把自己当猪。", 66 | "你这种人永远买不到自己合适的鞋,因为你码没了。", 67 | "你看上去好眼熟,像我昨天扔出去的那袋垃圾。", 68 | "满手老茧的老撸货凭什么对人家指指点点。", 69 | "看您这逻辑,直肠通大脑吧?", 70 | "你就像那美羊羊,三千多集没有娘。", 71 | "只希望你吃饭有人喂,走路有人推,夜夜缠绵于病却长命百岁,不能生育却儿孙满堂,福如母猪寿比昙花。", 72 | "我无法相信你是十万精子里面最快的那个。", 73 | "你🐴和兔同笼,笼中一共160只脚。已知兔子40只,问几个你🐴?", 74 | "我与神明画过押,你是孤儿没有家。", 75 | "你不贱不骚也不婊,毕竟用来形容人的词,用在你身上不合适。", 76 | "你非常适合做厨师,喜欢甩锅还喜欢添油加醋。", 77 | "你的智商跟黑龙江的冬天一样。", 78 | "天晴了,雨停了,你倒是觉得你行了。", 79 | "不愧是你,泼粪都能泼得如此花哨。", 80 | "你长脑袋只是为了让自己看起来高一点吧?", 81 | "东边不亮西边亮,看你一脸衰批样。", 82 | "上帝把智慧洒满人间,就你打了个伞。", 83 | "你在你家厕所没吃饱吗?", 84 | "我看你就是嫉妒我户口本可以翻页吧。", 85 | "你有这闲在这里BB,咋不给你🐴多烧点纸去?", 86 | "整天在网上乱认家属,敢情你继父没生殖能力怎么着?在孤儿院里认个你还不够,四处乱辈分找家属?", 87 | "估计也是你家里穷,天天吃咸菜,所以才闲的蛋疼。", 88 | "建议你学学做饭吧,你🐴都快糊了还搁这浇油呢。", 89 | "拿你当人的时候,你能尽量装得像一点吗?", 90 | "毕加索遇到你可以直接写生了哎~", 91 | "这么喜欢装逼,你下辈子当条内裤吧。", 92 | "你果然和那些妖艳贱货不一样,你只是个贱货,并不妖艳。", 93 | "遇见你之前,我真没发现原来我有以貌取人这毛病。", 94 | "你不会是性無能吧?所以在網上自我高潮找存在感?", 95 | "小嘴真甜,你男朋友有糖尿病么?", 96 | "苍蝇走你脸上都崴脚。", 97 | "回去吧,你妹妹想推你去北海公园看花了。", 98 | "粪车打你家门口过你都得尝尝咸淡呢。", 99 | "千里马常有,而你马不常有。", 100 | "Never Mind the Scandal and Liber.", 101 | "你不适合待在垃圾桶里,毕竟垃圾也要分类,而你只是个杂碎。", 102 | "你就像一个没写地址的信封。", 103 | "求你别叫了,我小时候被狗吓过。", 104 | "谁料你竟是条鲶鱼,竟喜欢在粪坑里欢腾。", 105 | "你的出生是杜蕾斯的一封道歉信。", 106 | "人在做天在看,所以老天从不理你。", 107 | "你NB,你伟大,你和你🐴生你🎱。", 108 | "你脑子里的水是为了浇灌你心里的B树吗?", 109 | "嫉妒是一种不好的情感,我理解你嫉妒我有家人,可你这么说有点过分了。", 110 | "我本是打算说点阴间话,原以为你这等阴人应该听得明白的,谁料你竟是个不阴不阳、不着四六的东西。", 111 | "你🐴🐴和我的猫都很想你……骗你的啦哈哈哈,我没有猫,你也没有🐴。", 112 | "说道痛处就气急败坏,说到底还不是条懒狗。", 113 | "别人用嘴巴说话,你用嘴巴放屁。", 114 | "用你的2B铅笔描绘你的人生。", 115 | "做了人类想成仙,生在地上要上天。", 116 | "凡走狗,虽或为一个资本家所豢养,其实是属于所有的资本家的,所以它遇见所有的阔人都驯良,遇见所有的穷人都狂吠。不知道谁是它的主子,正是它遇见所有阔人都驯良的原因,也就是属于所有的资本家的证据。即使无人豢养,饿的精瘦,变成野狗了,但还是遇见所有的阔人都驯良,遇见所有的穷人都狂吠的,不过这时它就愈不明白谁是主子了。", 117 | "如果你有时间对我吠叫,为什么不去玉林屠宰场叫一只狗来救你将要被屠宰的父亲。", 118 | "你花了这么长时间来考虑哪块土地适合建墓地吗?", 119 | "你怪我不是教父,我的五官是我父母的错,这不像你,都是你🐴🐴和邻居拼凑出来的。", 120 | "天降智慧与甘霖,而你整天撑着把伞。", 121 | "装疯卖傻就装的像点,像你这种半疯不傻的又怎么糊弄大家呀?", 122 | "阁下长得真是天生励志。", 123 | "你小时候你🐴是不是经常打你,没打掉?", 124 | "你🐴当初生你的时候,估计是把人整丢了,把胎盘养大了。", 125 | "你甘心给别人当厕纸,人家还嫌你纸软弄脏了手指,纸硬擦伤了擦伤了屁眼子。", 126 | "你的长相和智商都挺哈韩的。", 127 | "我说话从来不指名道姓的骂谁谁谁,你理亏你就对号入座,你想太多我也没法,脑子在你身上。", 128 | "就你那眼见,跟ATM机卡槽差不多宽的能见度。", 129 | "哦你这个愚蠢的土拨鼠,瞧瞧你说的话,简直就像隔壁玛丽苏婶婶的蓝莓派一样糟糕,我发誓要揪掉你的头发,让你看起来像一个虔诚的冬瓜,我的老伙计。", 130 | "感觉你的智商和脐带一起剪断了。", 131 | "你长得就和二维码似的,不扫一扫还真不知道是个什么东西。", 132 | "你这顿操作真是蛤蟆戏青蛙,长得丑玩得花。" 133 | ] 134 | } 135 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | NoneBotPluginLogo 3 |
4 |

NoneBotPluginText

5 |
6 | 7 |
8 | 9 | # nonebot-plugin-antiinsult 10 | 11 | _✨ NoneBot 反嘴臭插件 ✨_ 12 | 13 | 14 | 15 | license 16 | 17 | 18 | pypi 19 | 20 | 21 | python 22 | 23 | 24 | nonebot 25 | 26 | 27 | onebot 28 | 29 | 30 |
31 | 32 | 33 | ## 📖 介绍 34 | 35 | **本插件为被动插件** 36 | 37 | 检测到有用户 `@机器人` 并嘴臭时将其临时屏蔽(bot重启后失效) 38 | 当bot为群管理时会请对方喝昏睡红茶(禁言) 39 | 40 | - 超级用户不受临时屏蔽影响 _~~但是会被昏睡红茶影响~~_ 41 | - 当bot的群权限比超级用户高的时候, 超级用户也有机会品尝昏睡红茶 42 | - 被bot灌了昏睡红茶的用户不会进临时黑名单 43 | - 开启 **`对线模式`** 后不会被bot灌昏睡红茶和临时拉黑 (~~因为要对线~~) 44 | 45 | 46 | ## 💿 安装 47 | 48 | **nb-cli安装, 包管理器安装 二选一** 49 | 50 |
51 | 使用 nb-cli 安装 52 | 53 | 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装 54 | 55 | nb plugin install nonebot-plugin-antiinsult 56 | 57 |
58 | 59 |
60 | 使用包管理器安装 61 | 62 | 在 nonebot2 项目的插件目录下, 打开命令行, 63 | 64 | **根据你使用的包管理器, 输入相应的安装命令** 65 | 66 |
67 | pip 68 | 69 | pip install nonebot-plugin-antiinsult 70 | 71 |
72 |
73 | pdm 74 | 75 | pdm add nonebot-plugin-antiinsult 76 | 77 |
78 |
79 | poetry 80 | 81 | poetry add nonebot-plugin-antiinsult 82 | 83 |
84 |
85 | conda 86 | 87 | conda install nonebot-plugin-antiinsult 88 | 89 |
90 | 91 | 打开 bot项目下的 `pyproject.toml` 文件, 92 | 93 | 在其 `plugins` 里加入 `nonebot_plugin_antiinsult` 94 | 95 | plugins = ["nonebot_plugin_antiinsult"] 96 | 97 |
98 | 99 | 100 | ## 🎉 使用 101 | 102 | 在Bot目录下的 `.env` 文件内可添加以下变量以设置禁言时长: 103 | 104 | ```env 105 | ANTI_INSULT_BAN_TIME=720 106 | ``` 107 | 108 | 单位为分钟, 默认值720分钟(12小时) 109 | 110 | ### 指令表 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 |
指令 权限 需要@ 范围 说明
^(添加|删除)屏蔽词 xxx 主人 私聊 | 群聊 可输入多个,
用空格隔开
解除屏蔽 qq 主人 私聊 | 群聊
查看临时黑名单 主人 私聊 | 群聊
^(禁用|启用)飞(妈|马|🐴|🐎)令 主人 私聊 | 群聊 开启/关闭对线模式
147 | 148 | P.S. `解除屏蔽` 可以解除临时屏蔽, 也可以解除禁言(当然, 需要bot为群管理). 149 | 150 | 你说从聊天界面查看屏蔽词库? 噢, 我亲爱的老伙计, 你怕是疯了! 151 | 152 | ## ⚠️ 注意事项 153 | 154 | **本插件目前仅支持 nonebot2 + onebot.v11 的使用方式, 一切非此二者结合的使用方式造成的问题请自行探索解决, 或者使用其他插件** 155 | -------------------------------------------------------------------------------- /nonebot_plugin_antiinsult/curse.json: -------------------------------------------------------------------------------- 1 | { 2 | "curse": [ 3 | "啥鼻", 4 | "沙鼻", 5 | "鲨笔", 6 | "戳那吗B", 7 | "鲵🐴", 8 | "塞你公", 9 | "溺🐎", 10 | "雜種", 11 | "杀你", 12 | "他NND", 13 | "妳奶奶", 14 | "操死妳妹", 15 | "on狗", 16 | "妈B", 17 | "强奸", 18 | "操妳妹", 19 | "甚麼寄八", 20 | "傻B", 21 | "驶你母", 22 | "臭婊", 23 | "mdzz", 24 | "奸淫", 25 | "雞姦", 26 | "抽你丫的", 27 | "妈个B", 28 | "操死你母", 29 | "跡掰", 30 | "ㄐ掰", 31 | "你爺", 32 | "輪姦", 33 | "他媽", 34 | "她妈", 35 | "🐴🐴", 36 | "什麼勾巴", 37 | "shabi", 38 | "甚麼勾八", 39 | "妳全家", 40 | "狗b", 41 | "狗交", 42 | "甚麼勾巴", 43 | "妳爺", 44 | "妈个b", 45 | "賤種", 46 | "睨🐎", 47 | "你大爺", 48 | "老味", 49 | "你它妈", 50 | "瘪三", 51 | "幹死你妹", 52 | "哩娘", 53 | "妳媽", 54 | "嫩叠", 55 | "幹爆妳母", 56 | "操你母", 57 | "几把玩意", 58 | "X妈", 59 | "表子", 60 | "怩🐎", 61 | "龜公", 62 | "nmsl", 63 | "賤屄", 64 | "你马", 65 | "冚家", 66 | "狗日", 67 | "草泥马", 68 | "乱奸", 69 | "他ㄇㄉ", 70 | "乡巴佬", 71 | "你祖宗", 72 | "匿🐴", 73 | "死屄", 74 | "什么鸡扒", 75 | "林北", 76 | "死雞巴", 77 | "輪奸", 78 | "草拟妈", 79 | "吃屎", 80 | "幹暴你妹", 81 | "殺你", 82 | "倪🐴", 83 | "蠢猪", 84 | "JB玩意", 85 | "草妈", 86 | "你奶奶", 87 | "草你吗", 88 | "D区", 89 | "傻b", 90 | "东亚病夫", 91 | "给爷爬", 92 | "ㄐㄅ", 93 | "績掰", 94 | "甚么勾巴", 95 | "幹你梁", 96 | "on鳩", 97 | "瘪犊子", 98 | "伱妈", 99 | "smj8", 100 | "滾那嗎B", 101 | "猊🐎", 102 | "呢🐎", 103 | "幹您老幕", 104 | "什麼鸡扒", 105 | "呆比", 106 | "操死你妹", 107 | "賣淫", 108 | "塞你老师", 109 | "腻🐎", 110 | "你媽", 111 | "擬娘", 112 | "尼🐴", 113 | "草拟吗", 114 | "撞死你", 115 | "smjb", 116 | "什麼寄八", 117 | "你老木", 118 | "下賤", 119 | "食撚", 120 | "靠爸", 121 | "奸她", 122 | "睨🐴", 123 | "戇鳩", 124 | "妮🐎", 125 | "屠你", 126 | "烂逼", 127 | "操死妳母", 128 | "妓女", 129 | "b样", 130 | "创死你", 131 | "奸你", 132 | "屌毛", 133 | "陷家", 134 | "婊子", 135 | "鸡巴玩意", 136 | "呆卵", 137 | "jiba玩意", 138 | "強奸", 139 | "倪🐎", 140 | "什么鸡八", 141 | "他妈", 142 | "您娘", 143 | "她馬的", 144 | "賤婊", 145 | "ㄖ", 146 | "你吗b", 147 | "sabi", 148 | "弱智", 149 | "什麼勾吧", 150 | "姦污", 151 | "甚么寄吧", 152 | "傻比", 153 | "我妳老爸", 154 | "他娘的", 155 | "老婊", 156 | "去死", 157 | "你妈", 158 | "她马的", 159 | "那嗎逼", 160 | "你馬的", 161 | "吗的", 162 | "操死妳爸", 163 | "什么鸡巴", 164 | "Biaozi", 165 | "幹死妳爸", 166 | "插那吗B", 167 | "什么寄吧", 168 | "幹爆你妹", 169 | "甚么鸡八", 170 | "崽种", 171 | "雞奸", 172 | "2b", 173 | "么有🐎", 174 | "先奸后杀", 175 | "妈的", 176 | "幹林", 177 | "脑瘫", 178 | "你全家", 179 | "鲵🐎", 180 | "逆🐴", 181 | "機掰", 182 | "靠盃", 183 | "什麼鸡八", 184 | "煞笔", 185 | "爛雞", 186 | "旎🐎", 187 | "幹死妳母", 188 | "拟🐎", 189 | "霓🐎", 190 | "鸡掰", 191 | "妳妈", 192 | "臭屄", 193 | "甚么勾吧", 194 | "雞掰", 195 | "日你老娘", 196 | "好撚廢", 197 | "她媽的", 198 | "shenmejiba", 199 | "激掰", 200 | "干妳马", 201 | "你爹", 202 | "妳馬", 203 | "尼🐎", 204 | "幹你母", 205 | "干x娘", 206 | "啞撚", 207 | "死婊", 208 | "赛妳阿母", 209 | "吗逼", 210 | "妳娘", 211 | "泥🐴", 212 | "你爸", 213 | "甚么勾八", 214 | "妈逼", 215 | "瘠薄玩意", 216 | "砍死你", 217 | "滚犊子", 218 | "志葬", 219 | "操妳爸", 220 | "诱奸", 221 | "妈批", 222 | "爛屄", 223 | "拟🐴", 224 | "甚麼雞扒", 225 | "呢🐴", 226 | "卖比", 227 | "什么勾巴", 228 | "卖批", 229 | "on九", 230 | "你二大爺", 231 | "批样", 232 | "妳老母", 233 | "别他吗", 234 | "龟公", 235 | "驶你公", 236 | "你八辈祖宗", 237 | "你麻痹", 238 | "強姦", 239 | "他奶奶", 240 | "幹暴你母", 241 | "小比樣", 242 | "甚么鸡扒", 243 | "比样", 244 | "妳马的", 245 | "什麼雞扒", 246 | "滥逼", 247 | "幹妳爸", 248 | "🐎🐎", 249 | "nnd", 250 | "什麼勾八", 251 | "贱比", 252 | "jb玩意", 253 | "你姥", 254 | "幹暴妳妹", 255 | "杀b", 256 | "tmd", 257 | "煞逼", 258 | "甚么雞扒", 259 | "女干", 260 | "脑残", 261 | "甚么鸡巴", 262 | "甚麼鸡扒", 263 | "塞林木", 264 | "她NND", 265 | "幹爆妳妹", 266 | "贱b", 267 | "娘西皮", 268 | "你二大爷", 269 | "赛林木", 270 | "CNM", 271 | "烂臭嗨", 272 | "戇狗", 273 | "王巴", 274 | "野雞", 275 | "你大爷", 276 | "含撚", 277 | "甚麼鸡八", 278 | "幹你良", 279 | "虐杀", 280 | "妳祖宗", 281 | "戇九", 282 | "口区", 283 | "草擬媽", 284 | "幹死你母", 285 | "你爷", 286 | "幹妳母", 287 | "操你妹", 288 | "没用东西", 289 | "狗幹", 290 | "幹你妹", 291 | "他嗎的", 292 | "nmbiss", 293 | "二逼", 294 | "腻🐴", 295 | "塞你母", 296 | "基掰", 297 | "你娘", 298 | "cnm", 299 | "你🐴", 300 | "鹹家鏟", 301 | "操你老妈", 302 | "轮姦", 303 | "贱B", 304 | "賤貨", 305 | "幹爆你母", 306 | "你🐎", 307 | "什麼鸡巴", 308 | "卖逼", 309 | "你老母", 310 | "没🐎", 311 | "奶奶的", 312 | "没🐴", 313 | "他ㄇ的", 314 | "什么勾吧", 315 | "積掰", 316 | "TMD", 317 | "什麼寄吧", 318 | "烂批", 319 | "她娘", 320 | "全家死", 321 | "吊佢佬未", 322 | "烂比", 323 | "sb", 324 | "小B樣", 325 | "匿🐎", 326 | "什么雞扒", 327 | "騷媽", 328 | "吊你好撚", 329 | "B样", 330 | "什么勾八", 331 | "操妳母", 332 | "妳爹", 333 | "Sb", 334 | "旎🐴", 335 | "操你老娘", 336 | "甚么寄八", 337 | "霓🐴", 338 | "SB", 339 | "干你良", 340 | "傻吊", 341 | "怩🐴", 342 | "迷奸", 343 | "甚麼鸡巴", 344 | "废物", 345 | "幹暴妳母", 346 | "臭b", 347 | "杂种", 348 | "王八", 349 | "小雞巴", 350 | "錶子", 351 | "幹爆妳爸", 352 | "甚麼勾吧", 353 | "老娼", 354 | "溺🐴", 355 | "昵🐎", 356 | "on9", 357 | "傻卵", 358 | "贱逼", 359 | "什么寄八", 360 | "贱种", 361 | "轮奸", 362 | "駛你母", 363 | "傻逼", 364 | "机掰", 365 | "它媽", 366 | "戇9", 367 | "二B", 368 | "昵🐴", 369 | "幹死妳妹", 370 | "猊🐴", 371 | "死全家", 372 | "鸡奸", 373 | "刹笔", 374 | "么有🐴", 375 | "龜兒子", 376 | "🐔🎱", 377 | "狗娘", 378 | "驶你老师", 379 | "泥🐎", 380 | "狗比", 381 | "妮🐴", 382 | "逼样", 383 | "靠北", 384 | "幹暴妳爸", 385 | "您妈", 386 | "爛婊", 387 | "狗操", 388 | "ㄙㄞ", 389 | "逆🐎", 390 | "没种", 391 | "rnm", 392 | "狗种", 393 | "死妈", 394 | "没有🐎", 395 | "他马的", 396 | "拎娘", 397 | "臭表", 398 | "没有🐴", 399 | "沙比", 400 | "甚麼寄吧" 401 | ] 402 | } -------------------------------------------------------------------------------- /nonebot_plugin_antiinsult/__init__.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import ujson as json 3 | from pathlib import Path 4 | from typing import Literal 5 | from random import random, choice 6 | from nonebot.rule import to_me 7 | from nonebot import get_driver, on_message, on_command 8 | from nonebot.log import logger 9 | from nonebot.plugin import PluginMetadata 10 | from nonebot.matcher import Matcher 11 | from nonebot.message import event_preprocessor 12 | from nonebot.params import CommandArg 13 | from nonebot.permission import SUPERUSER 14 | from nonebot.exception import IgnoredException 15 | from nonebot.adapters.onebot.v11 import ( 16 | Bot, 17 | Message, 18 | Event, 19 | MessageEvent, 20 | GroupMessageEvent, 21 | ) 22 | 23 | 24 | usage: str = """ 25 | 26 | 指令表: 27 | 添加/删除屏蔽词 xxx xxx ... 28 | 解除屏蔽 qq qq1 qq2 ... 29 | 查看临时黑名单 30 | 禁用/启用飞🐴令 # 对喷模式开关 31 | 32 | """.strip() 33 | 34 | 35 | __plugin_meta__ = PluginMetadata( 36 | name="反嘴臭", 37 | description="反嘴臭插件", 38 | usage=usage, 39 | type="application", 40 | homepage="https://github.com/tkgs0/nonebot-plugin-antiinsult", 41 | supported_adapters={"~onebot.v11"}, 42 | extra={ 43 | "author": "月ヶ瀬" 44 | } 45 | ) 46 | 47 | 48 | config = get_driver().config 49 | ban_time: int = getattr(config, "anti_insult_ban_time", 720) 50 | 51 | ban_time = ban_time if 0 < ban_time < 43200 else 43199 52 | 53 | superusers = get_driver().config.superusers 54 | 55 | dirpath = Path() / "data" / "anti-insult" 56 | dirpath.mkdir(parents=True, exist_ok=True) 57 | 58 | cursepath = Path(__file__).parent / "curse.json" 59 | curse_path = dirpath / "curse.json" 60 | 61 | flymopath = Path(__file__).parent / "flymo.json" 62 | flymo_path = dirpath / "flymo.json" 63 | 64 | curse_list = ( 65 | json.loads(curse_path.read_text("utf-8")) 66 | if curse_path.is_file() 67 | else json.loads(cursepath.read_text("utf-8")) 68 | ) 69 | 70 | flymo_list = ( 71 | json.loads(flymo_path.read_text('utf-8')) 72 | if flymo_path.is_file() 73 | else json.loads(flymopath.read_text("utf-8")) 74 | ) 75 | 76 | blacklist = {} 77 | 78 | 79 | 80 | def check_self_id(self_id) -> str: 81 | self_id = f'{self_id}' 82 | if not blacklist.get(self_id): 83 | blacklist.update({ 84 | self_id: [] 85 | }) 86 | return self_id 87 | 88 | 89 | 90 | def is_number(s: str) -> bool: 91 | try: 92 | float(s) 93 | return True 94 | except ValueError: 95 | pass 96 | try: 97 | import unicodedata 98 | unicodedata.numeric(s) 99 | return True 100 | except (TypeError, ValueError): 101 | pass 102 | return False 103 | 104 | 105 | 106 | def save_curse_path() -> None: 107 | curse_path.write_text( 108 | json.dumps(curse_list, indent=2, ensure_ascii=False), 109 | encoding="utf-8" 110 | ) 111 | 112 | 113 | 114 | def save_flymo_path() -> None: 115 | flymo_path.write_text( 116 | json.dumps(flymo_list, indent=2, ensure_ascii=False), 117 | encoding="utf-8" 118 | ) 119 | 120 | 121 | 122 | def handle_curse_list( 123 | arg, 124 | mode: Literal["add", "del"], 125 | ) -> str: 126 | _msg = arg.extract_plain_text().strip().split() 127 | if not _msg: 128 | return "用法: \n添加(删除)屏蔽词 词1 词2 词3 ..." 129 | if mode == "add": 130 | curse_list['curse'].extend(_msg) 131 | curse_list['curse'] = list(set(curse_list['curse'])) 132 | _mode = "添加" 133 | elif mode == "del": 134 | curse_list['curse'] = [msg for msg in curse_list['curse'] if msg not in _msg] 135 | _mode = "删除" 136 | save_curse_path() 137 | return f"已{_mode} {len(_msg)} 个屏蔽词" 138 | 139 | 140 | 141 | def handle_namelist(self_id, uid): 142 | self_id = check_self_id(self_id) 143 | uid = str(uid) 144 | blacklist[self_id].append(uid) 145 | return f"⚠已将用户{uid}加入临时黑名单️⚠" 146 | 147 | 148 | 149 | add_curse = on_command("添加屏蔽词", permission=SUPERUSER, priority=1, block=True) 150 | 151 | @add_curse.handle() 152 | async def _(arg: Message = CommandArg()): 153 | msg = handle_curse_list(arg, "add") 154 | await add_curse.finish(msg) 155 | 156 | 157 | 158 | del_curse = on_command("删除屏蔽词", permission=SUPERUSER, priority=1, block=True) 159 | 160 | @del_curse.handle() 161 | async def _(arg: Message = CommandArg()): 162 | msg = handle_curse_list(arg, "del") 163 | await del_curse.finish(msg) 164 | 165 | 166 | 167 | enable_flymo = on_command( 168 | '启用飞妈令', 169 | aliases={'启用飞马令','启用飞🐴令','启用飞🐎令'}, 170 | permission=SUPERUSER, 171 | priority=1, 172 | block=True 173 | ) 174 | 175 | @enable_flymo.handle() 176 | async def _(): 177 | flymo_list['enable'] = True 178 | save_flymo_path() 179 | await enable_flymo.finish('Done.') 180 | 181 | 182 | 183 | disable_flymo = on_command( 184 | '禁用飞妈令', 185 | aliases={'禁用飞马令','禁用飞🐴令','禁用飞🐎令'}, 186 | permission=SUPERUSER, 187 | priority=1, 188 | block=True 189 | ) 190 | 191 | @disable_flymo.handle() 192 | async def _(): 193 | flymo_list['enable'] = False 194 | save_flymo_path() 195 | await disable_flymo.finish('Done.') 196 | 197 | 198 | 199 | anti_abuse = on_message(rule=to_me(), priority=15, block=False) 200 | 201 | @anti_abuse.handle() 202 | async def _(bot: Bot, event: MessageEvent, matcher: Matcher): 203 | for i in curse_list['curse']: 204 | if i in event.get_plaintext(): 205 | matcher.stop_propagation() 206 | if flymo_list['enable']: 207 | await asyncio.sleep(random()+1) 208 | await anti_abuse.finish(choice(flymo_list['flymo']), at_sender=True) 209 | user_id = event.user_id 210 | try: 211 | if isinstance(event, GroupMessageEvent): 212 | await bot.set_group_ban( 213 | user_id=user_id, 214 | group_id=event.group_id, 215 | duration=ban_time*60 216 | ) 217 | else: 218 | logger.info(handle_namelist(event.self_id, user_id)) 219 | except Exception: 220 | logger.info(handle_namelist(event.self_id, user_id)) 221 | await anti_abuse.finish("不理你啦!バーカー", at_sender=True) 222 | 223 | 224 | 225 | @event_preprocessor 226 | def blacklist_processor(event: Event): 227 | self_id = check_self_id(event.self_id) 228 | 229 | if (uid := str(vars(event).get('user_id', None))) in superusers: 230 | return 231 | if uid in blacklist[self_id]: 232 | logger.debug(f'用户 {uid} 在 {self_id} 临时黑名单中, 忽略本次消息') 233 | raise IgnoredException('黑名单用户') 234 | 235 | 236 | 237 | 238 | 239 | 240 | namelist_del = on_command("解除屏蔽", aliases={"摘口球"}, permission=SUPERUSER, priority=1, block=True) 241 | 242 | @namelist_del.handle() 243 | async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()): 244 | self_id = check_self_id(event.self_id) 245 | 246 | uids = ( 247 | [at.data['qq'] for at in event.get_message()['at']] 248 | if event.get_message()['at'] 249 | else arg.extract_plain_text().strip().split() 250 | ) 251 | if not uids: 252 | await namelist_del.finish("用法: \n解除屏蔽 qq qq1 qq2 ...") 253 | for uid in uids: 254 | if not is_number(uid): 255 | await namelist_del.finish("参数错误, id必须是数字..") 256 | try: 257 | if isinstance(event, GroupMessageEvent): 258 | await bot.set_group_ban( 259 | group_id=event.group_id, 260 | user_id=int(uid), 261 | duration=0 262 | ) 263 | except Exception: 264 | pass 265 | blacklist[self_id] = [uid for uid in blacklist[self_id] if uid not in uids] 266 | await namelist_del.finish(f"已尝试从小黑屋释放 {len(uids)} 个用户: \n{', '.join(uids)}") 267 | 268 | 269 | 270 | check_namelist = on_command("查看临时黑名单", permission=SUPERUSER, priority=1, block=True) 271 | 272 | @check_namelist.handle() 273 | async def _(event: MessageEvent): 274 | self_id = check_self_id(event.self_id) 275 | await check_namelist.finish(f"当前已临时屏蔽{len(blacklist[self_id])}个用户: \n{', '.join(blacklist[self_id])}") 276 | --------------------------------------------------------------------------------