IDEA版本彩虹屁插件idea-rainbow-fart,一個在你編程時瘋狂稱讚你的 IDEA擴展插件
- 2020 年 6 月 28 日
- 筆記
- idea-rainbow-fart, java編程, 開源
緣起
是否聽說過程式設計師鼓勵師,不久前出了一款vscode的插件rainbow-fart,可以在寫程式碼的時候,匹配到特定關鍵詞就瘋狂的拍你馬屁。
vscode的下載嘗試過,但是作為日常將IDEA作為主力生產工具的同學來說,如何體驗呢? 於是假期花了一點時間,寫了一個idea版本的插件idea-rainbow-fart。
使用說明
默認使用中文語音包,可以在setting里設置
打開設置:
選擇第三方語音包:
可以到 //github.com/topics/vscode-rainbow-fart 查找語音包。
點擊確定生效:
原理
沒啥原理,就是一款簡單的idea插件,對沒寫過插件的我來說,需要先看下官方文檔,基本上看下面這一篇就OK:
//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
開源地址: //github.com/jadepeng/idea-rainbow-fart
歡迎大家點贊!
作者:Jadepeng
出處:jqpeng的技術記事本–//www.cnblogs.com/xiaoqi
您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。