前幾天,馬斯克不僅發推文表示自己最喜歡的加密貨幣可能是狗狗幣,其還把自己的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) } }
}創建ToolWindowToolWindow是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 **
求關注掘金:https://juejin.cn/user/3650034331820743