全力で怠けたい

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

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: &pixela4go.SlackDetail{
            URL:         pixela4go.String("https://hooks.slack.com/services/xxxx"),
            UserName:    pixela4go.String("slack-user-name"),
            ChannelName: pixela4go.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 作ったり声かけてもらえると嬉しいです。

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