彩虹屁支持java吗_IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件...
缘起
是否听说过程序员鼓励师,不久前出了一款vscode的插件rainbow-fart,可以在写代码的时候,匹配到特定关键词就疯狂的拍你马屁。
vscode的下载尝试过,但是作为日常将IDEA作为主力生产工具的同学来说,如何体验呢? 于是假期花了一点时间,写了一个idea版本的插件idea-rainbow-fart。
使用说明
默认使用中文语音包,可以在setting里设置
打开设置:
选择第三方语音包:
点击确定生效:
原理
没啥原理,就是一款简单的idea插件,对没写过插件的我来说,需要先看下官方文档,基本上看下面这一篇就OK:
读取语音包
先来看下语音包的设计:
{
"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 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 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 getCandidate(String inputHistory) {
final List 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 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
欢迎大家点赞!
作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
彩虹屁支持java吗_IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件...相关推荐
- IDEA版本彩虹屁插件,一个在你编程时疯狂称赞你的 IDEA扩展插件
缘起 是否听说过程序员鼓励师,不久前出了一款vscode的插件rainbow-fart,可以在写代码的时候,匹配到特定关键词就疯狂的拍你马屁. vscode的下载尝试过,但是作为日常将IDEA作为主力 ...
- IDEA插件系列(92):Rainbow Fart插件——吹彩虹屁
1.插件介绍 Rainbow Fart插件. Rainbow Fart 是一个扩展,可以在您编码时不断给您赞美.它将检查代码中的关键字以播放相关声音.彩虹屁是中文的直译词,意思是夸大的夸奖,甚至有点假 ...
- 关于支持java8的eclipse版本注意事项
我们先打开https://www.eclipse.org/这个官方网站 然后点击右上角的Download按钮,在网站页面寻找一个集成多组件的并且支持java语言的版本,一般选择过去的版本,因为新版本仅 ...
- vscode 程序员鼓励师_程序员鼓励师插件Rainbow Fart(彩虹屁)
程序员鼓励师插件挺火的,我也来凑凑热闹 推荐软件: 只需要下载一个vscode插件就搞定啦!我先来说说我是怎么下载的吧. 1.打开vscode然后在扩展里搜索Rainbow Fart点击安装. 2.安 ...
- 如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本
本文翻译自:How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version I am trying ...
- swift-annotations:java编译时警告主版本 52 比 51 新, 此编译器支持最新的主 版本。
今天在java bean代码中加入swift的注释时,编译时提示了警告: [javac] 警告: J:\facelog\db\sql2java\lib\swift-annotations-0.23.1 ...
- VSCode程序猿彩虹屁插件rainbow fart体验:哇哦我听到有萌妹子夸我ฅ( ˃̶˙ω˙˂̶ ฅ
最近一款VSCode内置语音插件rainbow fart横空出世,rainbow fart翻译过来就是彩虹屁,该插件的定位就是:真*程序员鼓励师,在您枯燥的编程时刻,它可以根据代码关键字播放贴近代码意 ...
- linux开发板显示横向彩虹,给 Linux 终端的输出添加彩虹特效的命令
原标题:给 Linux 终端的输出添加彩虹特效的命令 正文 如果认为Linux命令行很无聊并且没有任何乐趣,那么您错了,真实的Linux多么有趣和淘气. 在本文,我将介绍一个名为" lolc ...
- 微软宣布Azure Functions正式支持Java
微软宣布Azure Functions V2.0支持Java.开发人员现在可以用Java 8编写Function,并利用Visual Studio Code.IntelliJ.Eclipse和跨平台F ...
最新文章
- Python核心资料:Django+Scrapy+Hadoop+数据挖掘+机器学习+精选视频(免费领)
- 《数字逻辑设计与计算机组成》一3.3 加法器
- 64位开源处理器Rocket该人士介绍
- Exchange Server 2010续定证书系列3-将续定后证书导入服务器
- js/jquery判断浏览器的方法总结
- 数组|leetcode59.螺旋矩阵II
- 吃屎是一种什么样的体验?
- cygwin配置git
- java事件类_关于Java事件类的一些思考
- (02)FPGA芯片厂商介绍
- 腾讯人均月薪8万!第一季度财报发布:微信月活数恐怖,游戏平均日赚4亿
- 最大 / 小的K个数
- 为何字节跳动、腾讯、阿里都要用Python?CSDN都要对它下手了!
- php7不解析下载,Centos7 配置apache和php,登陆web提示下载,不解析php文件
- 使用java实现数据库编程 第一章:数据库的设计
- Sage CRM升级注意事项三
- 数字图像处理编程入门笔记
- 如何免费低价获取一切资源?​
- QQ个性装扮气泡免费使用
- html页面用excel打印,excel怎么打印不能全部显示出来
热门文章
- 感悟----程序员需要养成的习惯
- 关于html5音频如何应用及解决方法?
- php里 \r\n换行问题
- Razor视图引擎-基础语法
- 【转载】Fedora网络设置问题解决方法
- sklearn下载方法,如果pycharm下载失败的话,你可以看看这里
- php中常见的错误类型有,JavaScript编程中会出现的错误类型有哪些?错误类型介绍...
- python集合中的元素不能是哪些数据类型_Python内置类型及常见问题
- 外观模式和代理模式的联系和区别_设计模式之代理模式
- Linux 进程优先级以及环境变量