全力で怠けたい

怠けるために全力を尽くしたいブログ。

Pixela の Go クライアント pixela4go を作りました。

Pixela の Go クライアント pixela4go を作りました。

github.com

Pixela とは?

任意の数値を登録してアレのあれっぽくグラフを作れるクールな API サービスです。

詳しくは↓

pixe.la blog.a-know.me

使い方

package main

import (
    "log"
 
    "github.com/ebc-2in2crc/pixela4go"
)

func main() {
    client := pixela.New("YOUR_NAME", "YOUR_TOKEN")

    // 新しいユーザーを作る
    uci := &pixela.UserCreateInput{
        AgreeTermsOfService: pixela.Bool(true),
        NotMinor:            pixela.Bool(true),
        ThanksCode:          pixela.String("thanks-code"),
    }
    result, err := client.User().Create(uci)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }

    // 新しい slack チャンネル を作る
    cci := &pixela.ChannelCreateInput{
        ID:          pixela.String("channel-id"),
        Name:        pixela.String("channel-name"),
        Type:        pixela.String(pixela.ChannelTypeSlack),
        SlackDetail: &pixela.SlackDetail{
            URL:         pixela.String("https://hooks.slack.com/services/xxxx"),
            UserName:    pixela.String("slack-user-name"),
            ChannelName: pixela.String("slack-channel-name"),
        },
    }
    result, err = client.Channel().Create(cci)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }

    // 新しいグラフを作る
    gci := &pixela.GraphCreateInput{
        ID:                  pixela.String("graph-id"),
        Name:                pixela.String("graph-name"),
        Unit:                pixela.String("commit"),
        Type:                pixela.String(pixela.GraphTypeInt),
        Color:               pixela.String(pixela.GraphColorShibafu),
        TimeZone:            pixela.String("Asia/Tokyo"),
        SelfSufficient:      pixela.String(pixela.GraphSelfSufficientIncrement),
        IsSecret:            pixela.Bool(true),
        PublishOptionalData: pixela.Bool(true),
    }
    result, err = client.Graph().Create(gci)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }

    // 値をピクセルに記録する
    pci := &pixela.PixelCreateInput{
        Date:         pixela.String("20180915"),
        Quantity:     pixela.String("5"),
        GraphID:      pixela.String("graph-id"),
    }
    result, err = client.Pixel().Create(pci)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }

    // 新しい通知ルールを作る
    nci := &pixela.NotificationCreateInput{
        GraphID:   pixela.String("graph-id"),
        ID:        pixela.String("notification-id"),
        Name:      pixela.String("notification-name"),
        Target:    pixela.String(pixela.NotificationTargetQuantity),
        Condition: pixela.String(pixela.NotificationConditionGreaterThan),
        Threshold: pixela.String("3"),
        RemindBy:  pixela.String("23"),
        ChannelID: pixela.String("channel-id"),
    }
    result, err = client.Notification().Create(nci)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }

    // 新しい webhook を作る
    wci := &pixela.WebhookCreateInput{
        GraphID: pixela.String("graph-id"),
        Type:    pixela.String(pixela.WebhookTypeIncrement),
    }
    webhook, err := client.Webhook().Create(wci)
    if err != nil {
        log.Fatal(err)
    }
    if webhook.IsSuccess == false {
        log.Fatal(webhook.Message)
    }

    // webhook を呼び出す
    wii := &pixela.WebhookInvokeInput{WebhookHash: pixela.String("webhook-hash")}
    result, err = client.Webhook().Invoke(wii)
    if err != nil {
        log.Fatal(err)
    }
    if result.IsSuccess == false {
        log.Fatal(result.Message)
    }
}

現時点の Pixela の最新バージョンの v1.18.0 のすべての API をサポートしています。

インストール

$ go get -u github.com/ebc-2in2crc/pixela-client-go

動機

Pixela はシンプルでいろんなことに応用できるとても便利な API サービスです。

実は pixela-client-go という Pixela の Go クライアントを作って公開しているのですが、実装があまりよくなく、Pixela のアップデートへ追従することにつらみを感じていたため、車輪を再発明してしまいました。

また、pixela-client-go は API のパラメーターがプリミティブ型が多くて渡すものを間違えたり、引数を省略できなかったりな使いにくさを感じていました。 pixela4go は API のパラメーターが構造体になっているので引数を間違えたりしにくくなっており、引数を省略することもできるのため、かなり使いやすくなっています。

pixela4go という名前

Twitter4J みたいな <サービス名>4<言語名> ネーミングをしてみたかったので。

まとめ

バグとかあると思いますし、「こーしたら使いやすくなる」とかあったら issue や PR を作ったり、Twitter で声をかけてもらえると嬉しいです。

ということで Pixela の Go クライアント pixela4go の紹介でした。