您当前的位置: 首页 >  golang

MateZero

暂无认证

  • 1浏览

    0关注

    92博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Golang编写一个在Mac通知栏上显示ETH价格的小工具

MateZero 发布时间:2020-04-15 17:50:49 ,浏览量:1

目录
    • 一、前言
    • 二、准备工作
    • 三、创建工程
    • 四、处理logo
    • 五、编写主程序
    • 六、编译运行
    • 七、设置开机自动运行
    • 八、注销重登录

一、前言

作为一个刚接触Go语言的初学者,总得写点代码练习一下。考虑到自身需求,就写了个这么一个小工具。记录在这里和大家一起分享,给有需求的同志提供一点参考。

这个工具很简单,用网上现成的库,并将附带的示例稍微修改下就可以了。

二、准备工作
  1. 打开https://github.com/getlantern/systray并git clone,我们工作就是在它给出的example中进行修改。
  2. 网上下载一张以太坊的Logo(PNG格式的)
  3. 安装最新版本go(1.13以上)并设置GOPATH,这个可以去官网看教程
  4. 设置GOPROXY="https://goproxy.io"。建议在.bash_profile里设置。
三、创建工程

打开终端,建立工程目录并使用go module。如下示例:

➜  ~ cd work/
➜  work mkdir ethprice
➜  work cd ethprice/
➜  ethprice go mod init ethprice
go: creating new go.mod: module ethprice
➜  ethprice 

注意这里的work不要在GOPATH目录下。使用vscode打开刚才的ethprice文件夹,在根目录下建立main.go文件和icon文件夹,并将以太坊logo改名为logo.png放入icon文件夹下。将如下图: 在这里插入图片描述

四、处理logo

将前面下载的systray中example\icon\make_icon.sh也copy到icon目录下。在vscode里打开终端,切换到该目录并运行sh ./make_icon.sh logo.png,它会在当前目录下生成一个iconunix.go的文件,这就是我们小工具所需要的logo。下面是make_icon.sh里的代码:

#/bin/sh

if [ -z "$GOPATH" ]; then
    echo GOPATH environment variable not set
    exit
fi

if [ ! -e "$GOPATH/bin/2goarray" ]; then
    echo "Installing 2goarray..."
    go get github.com/cratonica/2goarray
    if [ $? -ne 0 ]; then
        echo Failure executing go get github.com/cratonica/2goarray
        exit
    fi
fi

if [ -z "$1" ]; then
    echo Please specify a PNG file
    exit
fi

if [ ! -f "$1" ]; then
    echo $1 is not a valid file
    exit
fi    

OUTPUT=iconunix.go
echo Generating $OUTPUT
echo "//+build linux darwin" > $OUTPUT
echo >> $OUTPUT
cat "$1" | $GOPATH/bin/2goarray Data icon >> $OUTPUT
if [ $? -ne 0 ]; then
    echo Failure generating $OUTPUT
    exit
fi
echo Finished

可以看到,它安装了一个2goarray库并且将转换后的数据输出到iconunix.go中,变量名为Data,包名为icon。这里也可以自己修改为不同的名字。

五、编写主程序

参照systray中的示例,我们在main.go中写入如下代码:

package main

import (
	"encoding/json"
	"ethprice/icon"
	"fmt"
	"net/http"
	"time"

	"github.com/getlantern/systray"
)

const URL = "https://api.pro.coinbase.com/products/ETH-USD/ticker"

type EthPrice struct {
	Price string `json:price`
}
type Callback func(s string)

var priceInfo = new(EthPrice)
var t *time.Ticker

var step = 15

func backgroundTask(cb Callback) {
	t = time.NewTicker(time.Duration(step) * time.Second)
	for range t.C {
		cb(fetchPrice())
	}
}

func fetchPrice() string {
	resp, err := http.Get(URL)
	if err != nil {
		return "-"
	}
	defer resp.Body.Close()
	json.NewDecoder(resp.Body).Decode(priceInfo)
	return fmt.Sprintf("ETH $%s(每%d秒)", priceInfo.Price, step)
}

func main() {
	systray.Run(onReady, onExit)
}

func onReady() {
	go backgroundTask(systray.SetTitle)
	systray.SetIcon(icon.Data)
	systray.SetTitle(fmt.Sprintf("ETH $%s(每%d秒)", priceInfo.Price, step))
	systray.SetTooltip("定时刷新ETH价格")
	oneMinite := systray.AddMenuItem("每分钟", "每分钟刷新一次")
	halfMinite := systray.AddMenuItem("每半分钟", "每30秒刷新一次")
	quartor := systray.AddMenuItem("每15秒", "每15秒刷新一次")
	mQuit := systray.AddMenuItem("退出", "退出程序")
	systray.SetTitle(fetchPrice())

	go func() {
		for {
			select {
			case             
关注
打赏
1648304347
查看更多评论
0.0375s