缘起

是否听说过程序员鼓励师,不久前出了一款vscode的插件rainbow-fart,可以在写代码的时候,匹配到特定关键词就疯狂的拍你马屁。

vscode的下载尝试过,但是作为日常将IDEA作为主力生产工具的同学来说,如何体验呢? 于是假期花了一点时间,写了一个idea版本的插件idea-rainbow-fart

使用说明

默认使用中文语音包,可以在setting里设置

打开设置:

选择第三方语音包:

可以到 https://github.com/topics/vscode-rainbow-fart 查找语音包。

点击确定生效:

原理

没啥原理,就是一款简单的idea插件,对没写过插件的我来说,需要先看下官方文档,基本上看下面这一篇就OK:

https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started.html

读取语音包

先来看下语音包的设计:


{
"name": "KugimiyaRie",
"display-name": "KugimiyaRie 钉宫理惠 (Japanese)",
"avatar": "louise.png",
"avatar-dark": "shana.png",
"version": "0.0.1",
"description": "傲娇钉宫,鞭写鞭骂",
"languages": [
"javascript"
],
"author": "zthxxx",
"gender": "female",
"locale": "jp",
"contributes": [
{
"keywords": [
"function",
"=>"
],
"voices": [
"function_01.mp3",
"function_02.mp3",
"function_03.mp3"
]
},
...
]
}

对Java来说,定义两个bean类,解析json即可:

/**
* 加载配置
*/
public static void loadConfig() {
try {
//
FartSettings settings = FartSettings.getInstance();
if (!settings.isEnable()) {
return;
}
String json = readVoicePackageJson("manifest.json");
Gson gson = new Gson();
Manifest manifest = gson.fromJson(json, Manifest.class);
// load contributes.json
if (manifest.getContributes() == null) {
String contributesText = readVoicePackageJson("contributes.json");
Manifest contributes = gson.fromJson(contributesText, Manifest.class);
if (contributes.getContributes() != null) {
manifest.setContributes(contributes.getContributes());
}
}
Context.init(manifest); } catch (IOException e) {
}
}

监控用户输入

自定义一个Handler类继承TypedActionHandlerBase即可,需要实现的方法原型是:

public void execute(@NotNull Editor editor, char charTyped, @NotNull DataContext dataContext)

chartTyped就是输入的字符,我们可以简单粗暴的将这些组合到一起即可,用一个list缓存,然后将拼接后的字符串匹配关键词。

     private List<String> candidates = new ArrayList<>();

    @Override
public void execute(@NotNull Editor editor, char charTyped, @NotNull DataContext dataContext) {
candidates.add(String.valueOf(charTyped));
String str = StringUtils.join(candidates, "");
try {
List<String> voices = Context.getCandidate(str);
if (!voices.isEmpty()) {
Context.play(voices);
candidates.clear();
}
}catch (Exception e){
// TODO
candidates.clear();
} if (this.myOriginalHandler != null) {
this.myOriginalHandler.execute(editor, charTyped, dataContext);
}
}

匹配关键词更简单,将读取出来的json,放到hashmap中,然后遍历map,如果包含关键词就作为语音候选:

    public static List<String> getCandidate(String inputHistory) {

        final List<String> candidate = new ArrayList<>();

        FartSettings settings = FartSettings.getInstance();
if (!settings.isEnable()) {
return candidate;
}
if (keyword2Voices != null) {
keyword2Voices.forEach((keyword, voices) -> {
if (inputHistory.contains(keyword)) {
candidate.addAll(voices);
}
});
}
if (candidate.isEmpty()) {
candidate.addAll(findSpecialKeyword(inputHistory));
}
return candidate;
}

如果找到候选,就播放。

播放

为了防止同时播放多个语音,我们用一个单线程线程池来搞定。播放器使用javazoom.jl.player.Player

  /**
* play in a single thread pool
*/
static ExecutorService playerTheadPool;
static {
ThreadFactory playerFactory = new ThreadFactoryBuilder()
.setNameFormat("player-pool-%d").build();
playerTheadPool = new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1024), playerFactory, new ThreadPoolExecutor.AbortPolicy());
} public static void play(List<String> voices) { FartSettings settings = FartSettings.getInstance();
if (!settings.isEnable()) {
return;
}
// play in single thread
playerTheadPool.submit(() -> {
String file = voices.get(new Random().nextInt() % voices.size());
try {
InputStream inputStream = null;
if (StringUtils.isEmpty(settings.getCustomVoicePackage())) {
inputStream = Context.class.getResourceAsStream("/build-in-voice-chinese/" + file);
} else {
File mp3File = Paths.get(settings.getCustomVoicePackage(), file).toFile();
if (mp3File.exists()) {
try {
inputStream = new FileInputStream(mp3File);
} catch (FileNotFoundException e) {
}
} else {
return;
}
}
if (inputStream != null) {
Player player = new Player(inputStream);
player.play();
player.close();
}
} catch (JavaLayerException e) {
}
});
}

end

开源地址: https://github.com/jadepeng/idea-rainbow-fart

欢迎大家点赞!

作者:Jadepeng

出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi

您的支持是对博主最大的鼓励,感谢您的认真阅读。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件的更多相关文章

  1. 为Eclipse安装功能扩展插件

    ---------siwuxie095                 关于 Eclipse 的下载.安装与配置,详见本人博客分类:利剑出鞘, 里面的 Eclipse的配置         本人博客( ...

  2. 自制Chrome扩展插件:用于重定向js

    前言 作为一个前端开发, 在调试生产环境的代码时,是否苦于生产环境代码被压缩,没有sourcemap? 有没有想过将生产环境的js直接重定向为本地开发环境的js? 玩微前端时,有没有想过用本地的子应用 ...

  3. 认识Chrome扩展插件

    1.前言 现如今的时代,绝大多数人都要跟浏览器打交道的,说到浏览器那肯定是Chrome浏览器一家独大,具体数据请看 知名流量监测机构 Statcounter 公布了 7 月份全球桌面浏览器市场份额,主 ...

  4. vscode安装rainbow-fart(彩虹屁)插件,程序员只能自我鼓励了!!!

    2020-7-10更新 Rainbow Fart 插件现以发布到 VSCode 商店,安装过 VSIX 版本的用户请卸载之前的版本,从商店安装. 从 VSCode 扩展商店 下载并安装.(更新vsco ...

  5. dapper 扩展插件: Rainbow

    dapper 扩展插件: Rainbow dapper 是一个效率非常高的orm  框架 ,效率要远远大于 我们大微软的EF .    它只有一个类文件,非常之小. 1,首先下载dapper  这里下 ...

  6. 用python爬虫写一个属于自己的彩虹屁生成器!

    效果图如下:

  7. Sharepoint 2013列表视图和字段权限扩展插件(免费下载)!

    记得2014年春节期间,有博客园的网友通过QQ向我咨询Sharepoint 2013列表视图和字段权限扩展,因为之前他看到我博客介绍Sharepoint 2010列表视图和字段的权限控制扩展使用,问有 ...

  8. 常用网站开发类Firefox扩展插件 (转)

    作为一个 Web 开发人员,你几乎没有理由不喜欢Firefox,因为在Firefox下有很多专门针对开发的扩展插件,非常好用,这里就介绍一些常用的针对网站开发的FireFox扩展,供Web开发人员参考 ...

  9. 100个精选zencart扩展插件

    100个精选zencart扩展插件 特别推荐 1. 数据库备份 2. 产品横向布局. 3. 邮件订阅Newsletter Subscribe. 4. google 翻译google_translate ...

随机推荐

  1. Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

    人生苦短,我用Python.众所周知,Python目前越来越火,学习Python的小伙伴也越来越多.最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了 ...

  2. js循环语句while,do..while,for

    1. while循环 while(循环条件){ 循环体语句块; } 2.do..while循环 do{ 循环体语句块; }while(循环条件) 两者区别:while先判断后执行.循环体语句可能一次都 ...

  3. 自制基于python的DoU log分析脚本

    工作中测试DoU的log需要分析,原先是使用excel,去ctrl c,ctrl v截取数据,整理格式等等.一来,这工作虽然很简单,但是非常耗时,不熟练的人(比如我)一搞搞个半天:二来,不小心还会出现 ...

  4. Java实现蓝桥杯 最短路

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从1号点到其他点的最短路(顶点从1到n编号). 输入格式 第一行两个整数n, m. 接下来的m行,每行有三个 ...

  5. Java实现 LeetCode 736 Lisp 语法解析(递归)

    736. Lisp 语法解析 给定一个类似 Lisp 语句的表达式 expression,求出其计算结果. 表达式语法如下所示: 表达式可以为整数,let 语法,add 语法,mult 语法,或赋值的 ...

  6. Java实现 LeetCode 212 单词搜索 II(二)

    212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...

  7. Java实现 LeetCode 61 旋转链表

    61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...

  8. Java实现 LeetCode 52 N皇后 II

    52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...

  9. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  10. Java实现 蓝桥杯 算法提高 快速排序

    试题 算法提高 快速排序 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 用递归来实现快速排序(quick sort)算法.快速排序算法的基本思路是:假设要对一个数组a进行排序,且a ...