写点什么

马斯克说狗币牛逼,我说 idea 插件助你盯盘摸鱼

发布于: 2021 年 02 月 10 日
马斯克说狗币牛逼,我说idea插件助你盯盘摸鱼

老马和老马




前几天,马斯克不仅发推文表示自己最喜欢的加密货币可能是狗狗币,其还把自己的 Twitter 账户简介改为了“狗狗币前 CEO ”。


一代“带货达人”,“硅谷钢铁侠”,好像当了首富之后有点任性啊,这和马老板有的一拼啊,两个老马都这么让人眼前一亮,这让我想起了宋丹丹小品中的一句话:“他们名人都这样”,有钱之后就任性,这玩意好像写在人们的基因里了。


马斯克为币圈的一阵摇旗呐喊,直接带起了一波上涨行情,有人欢喜有人愁,真是太热闹了。当然,小弟作为一个不炒币的小屌丝,别人的热闹,与我无关,毕竟又穷又胆小,但是,作为一个上班的 IT 男,如何在老板眼皮子低下对数字货币盯盘,这个还是可以考虑考虑的,毕竟这是个分分钟几百万上下的生意,为韭菜服务是一个很重要的使命。


怎样躲老板




作为一个 android 开发者,你的工作就是在 android studio 上写代码,离开了 android studio 页面,基本上就可以认为你摸鱼了,而 android studio 又是基于 idea 开发的,如何摸鱼盯盘又不被发现,idea 插件无疑就是一个最好的选择了。


开发




效果



由效果可以看出,这里在 idea 中创建了一个 ToolWindow,在 ToolWindow 中展示货币信息,每隔 30 秒进行一次刷新。


API 的获取


行情信息的 api 通过非小号公共 api 获取的,文档见: https://github.com/xiaohao2019/API-docs/blob/master/PublicApi_CN.md


数据的获取


通过上面的 api,定时获取加密货币的行情数据,然后通过 EventBus 将数据用事件包装发出去,然后在 BitCoinWindow 中接收数据并展示。


object TickerNetDataApi {
private var isStart = false
private var lastTickerDataList: List<TickerData>? = null
fun scheduleGetTickerData() { if (!isStart) { val scheduledExecutorService = Executors.newSingleThreadScheduledExecutor() scheduledExecutorService.scheduleAtFixedRate(Runnable { getTickerData() }, 0, 30, TimeUnit.SECONDS) isStart = true } }
fun getTickerData() { val uri = "https://fxhapi.feixiaohao.com/public/v1/ticker" val paratmers: MutableList<NameValuePair> = ArrayList() paratmers.add(BasicNameValuePair("start", "0")) paratmers.add(BasicNameValuePair("limit", "100")) try { val tickerDataList = makeAPICall(uri, paratmers) tickerDataList?.let { val lastData = lastTickerDataList if (lastData == null || lastData[0].last_updated > it[0].last_updated) { org.greenrobot.eventbus.EventBus.getDefault().post(TickerDataEvent(tickerDataList)) } } } catch (e: Exception) { e.printStackTrace() }
}
@Throws(URISyntaxException::class, IOException::class) fun makeAPICall(uri: String, parameters: List<NameValuePair?>?): List<TickerData>? { var responseContent: String? = "" val query = URIBuilder(uri) query.addParameters(parameters) val client = HttpClients.createDefault() val request = HttpGet(query.build()) request.setHeader(HttpHeaders.ACCEPT, "application/json") val response = client.execute(request) response.use { response -> println(response.statusLine) val entity = response.entity responseContent = EntityUtils.toString(entity) EntityUtils.consume(entity) } return responseContent?.let { GsonUtil.fromJson(it, object : TypeToken<List<TickerData>>() { }.type) } }

}
复制代码


创建 ToolWindow


ToolWindow 是 ide 的子 window,通常用来展示一些信息,比较常见的就是 android 开发过程中的项目结构目录

创建 ToolWindow 的方法还是很简单的,首先要创建 BitCoinToolWindowFactory 继承自 ToolWindowFactory


class BitCoinToolWindowFactory : ToolWindowFactory {
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { val bitCoinWindow = BitCoinWindow() val contentFactory = ContentFactory.SERVICE.getInstance() val content = contentFactory.createContent(bitCoinWindow.getContent(), "", false) toolWindow.contentManager.addContent(content) TickerNetDataApi.scheduleGetTickerData() }
}
复制代码


其中 BitCoinWindow 就是用来展示信息的 UI,idea 插件一般是使用 swing 来构建 UI 的,这里用 JTableLayout 进行 UI 表格的展示


package com.skateboard.coinsplugin.ui
import com.skateboard.coinsplugin.data.TickerDataEventimport org.greenrobot.eventbus.EventBusimport org.greenrobot.eventbus.Subscribeimport org.greenrobot.eventbus.ThreadModeimport java.util.*import javax.swing.JPanelimport javax.swing.JScrollPaneimport javax.swing.JTableimport javax.swing.table.DefaultTableModelimport javax.swing.table.TableColumn
class BitCoinWindow {
private lateinit var contentPanel: JPanel
private lateinit var contentScrollPane: JScrollPane
private lateinit var coinsTable: JTable
private val columnList = listOf("排名", "名称", "最新价格", "24h的成交额", "流通市值", "流通数量", "总发行量", "最大发行量", "1小时涨跌幅", "24小时涨跌幅", "7天涨跌幅", "更新时间")
init { EventBus.getDefault().register(this) val tableModel = coinsTable.model as DefaultTableModel for (index in columnList.indices) { val column = columnList[index] tableModel.addColumn(column) } coinsTable.autoResizeMode = JTable.AUTO_RESIZE_OFF }
fun getContent(): JPanel = contentPanel
//更新数据 @Subscribe(threadMode = ThreadMode.MAIN) fun onTickerDataEvent(event: TickerDataEvent) { if (coinsTable.rowCount <= 0) { for (tickerData in event.tickerDataList) { val tableModel = coinsTable.model as DefaultTableModel tableModel.addRow(tickerData.toArray()) } } else { val tableModel = coinsTable.model as DefaultTableModel val rowVector = Vector<Vector<String>>() for (tickerData in event.tickerDataList) { rowVector.add(tickerData.toVector()) } tableModel.setDataVector(rowVector, Vector(columnList)) coinsTable.repaint() } fitTableColumns(coinsTable) }
//适配表格宽度 private fun fitTableColumns(myTable: JTable) { val header = myTable.tableHeader val rowCount = myTable.rowCount val columns = myTable.columnModel.columns while (columns.hasMoreElements()) { val column = columns.nextElement() as TableColumn val col = header.columnModel.getColumnIndex(column.identifier); var width = (myTable.tableHeader.defaultRenderer.getTableCellRendererComponent( myTable, column.identifier , false, false, -1, col ).preferredSize.getWidth()).toInt() for (row in 0 until rowCount) { val preferedWidth = (myTable.getCellRenderer(row, col).getTableCellRendererComponent( myTable, myTable.getValueAt(row, col), false, false, row, col ).preferredSize.getWidth()).toInt() width = width.coerceAtLeast(preferedWidth) } header.resizingColumn = column column.width = width + myTable.intercellSpacing.width; } }}
复制代码


在配置文件中注册


在 plugin.xml 中注册刚才创建的 BitCoinToolWindowFactory


<idea-plugin>    <id>org.example.bitcoinplugin</id>    <name>比特币行情插件</name>    <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
<description><![CDATA[ Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> ]]></description>
<!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html on how to target different products --> <depends>com.intellij.modules.platform</depends>
<extensions defaultExtensionNs="com.intellij"> <toolWindow id="绿油油" secondary="true" icon="AllIcons.General.Modified" anchor="right" factoryClass="com.skateboard.coinsplugin.ui.BitCoinToolWindowFactory"/> </extensions>
<actions> <!-- Add your actions here --> </actions></idea-plugin>
复制代码


这里 ToolWindow 的名称叫做绿油油,这个名称感觉和这个插件的气质比较符合。


最后




当然,这个插件不可能作为真正的盯盘工具的,因为这个接口有些不稳定,而且不够及时,只是作为 idea 插件编写的一个小 demo,各位大佬不要太较真,另外附上项目地址

https://github.com/skateboard1991/Chives


求关注





微信公众号:滑板上的老砒霜


发布于: 2021 年 02 月 10 日阅读数: 33
用户头像

还未添加个人签名 2021.02.10 加入

90后android老兵,玩玩滑板,吹吹口琴,在帝都的奶爸程序员。

评论

发布
暂无评论
马斯克说狗币牛逼,我说idea插件助你盯盘摸鱼