mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
WIP
This commit is contained in:
parent
0472e8edec
commit
8d131907a2
@ -22,8 +22,7 @@ described value.
|
|||||||
| 3 | [Github](https://developer.github.com/v3/) | `WTF_GITHUB_TOKEN` | Github API token |
|
| 3 | [Github](https://developer.github.com/v3/) | `WTF_GITHUB_TOKEN` | Github API token |
|
||||||
| 4 | [Google Calendar](https://developers.google.com/calendar/) | `WTF_GOOGLE_CAL_CLIENT_ID` | Google Calendar client ID |
|
| 4 | [Google Calendar](https://developers.google.com/calendar/) | `WTF_GOOGLE_CAL_CLIENT_ID` | Google Calendar client ID |
|
||||||
| 5 | | `WTF_GOOGLE_CAL_CLIENT_SECRET` | Google Calendar client secret |
|
| 5 | | `WTF_GOOGLE_CAL_CLIENT_SECRET` | Google Calendar client secret |
|
||||||
| 6 | [JIRA](https://developer.atlassian.com/server/jira/platform/rest-apis/) | `WTF_JIRA_USERNAME` | You JIRA username |
|
| 6 | [JIRA](https://developer.atlassian.com/server/jira/platform/rest-apis/) | `WTF_JIRA_API_KEY` | You JIRA API key |
|
||||||
| 7 | | `WTF_JIRA_PASSWORD` | Your JIRA password |
|
|
||||||
| 8 | [New Relic](https://docs.newrelic.com/docs/apis/rest-api-v2/getting-started/introduction-new-relic-rest-api-v2) | `WTF_NEW_RELIC_API_KEY` | New Relic API key |
|
| 8 | [New Relic](https://docs.newrelic.com/docs/apis/rest-api-v2/getting-started/introduction-new-relic-rest-api-v2) | `WTF_NEW_RELIC_API_KEY` | New Relic API key |
|
||||||
| 9 | [OpsGenie](https://docs.opsgenie.com/docs/api-overview) | `WTF_OPS_GENIE_API_KEY` | OpsGenie API key |
|
| 9 | [OpsGenie](https://docs.opsgenie.com/docs/api-overview) | `WTF_OPS_GENIE_API_KEY` | OpsGenie API key |
|
||||||
| 10 | [OpenWeatherMap](https://openweathermap.org/api) | `WTF_OWM_API_KEY` | OpenWeatherMap API key |
|
| 10 | [OpenWeatherMap](https://openweathermap.org/api) | `WTF_OWM_API_KEY` | OpenWeatherMap API key |
|
||||||
|
@ -52,12 +52,15 @@ wtf:
|
|||||||
username: "senorprogrammer"
|
username: "senorprogrammer"
|
||||||
jira:
|
jira:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
domain: "https://lendesk.atlassian.net"
|
||||||
position:
|
position:
|
||||||
top: 1
|
top: 1
|
||||||
left: 1
|
left: 1
|
||||||
height: 1
|
height: 1
|
||||||
width: 1
|
width: 1
|
||||||
|
project: "WTF"
|
||||||
refreshInterval: 900
|
refreshInterval: 900
|
||||||
|
username: "chris.cummer"
|
||||||
newrelic:
|
newrelic:
|
||||||
applicationId: 10549735
|
applicationId: 10549735
|
||||||
enabled: true
|
enabled: true
|
||||||
|
79
jira/client.go
Normal file
79
jira/client.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Fetch() string {
|
||||||
|
resp, err := jiraRequest("/rest/api/2/project/CORE")
|
||||||
|
if err != nil {
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
project := &JiraProject{}
|
||||||
|
parseJson(project, resp.Body)
|
||||||
|
//fmt.Printf("%#v\n", project)
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func IssuesFor(username string) ([]JiraIssue, error) {
|
||||||
|
url := fmt.Sprintf("/rest/api/2/search?jql=assignee=%s", username)
|
||||||
|
|
||||||
|
resp, err := jiraRequest(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
issues := []JiraIssue{}
|
||||||
|
parseJson(issues, resp.Body)
|
||||||
|
|
||||||
|
return issues, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------- Unexported Functions -------------------- */
|
||||||
|
|
||||||
|
func jiraRequest(path string) (*http.Response, error) {
|
||||||
|
url := fmt.Sprintf("%s%s", Config.UString("wtf.mods.jira.domain"), path)
|
||||||
|
|
||||||
|
req, err := http.NewRequest("GET", url, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.SetBasicAuth(Config.UString("wtf.mods.jira.email"), os.Getenv("WTF_JIRA_API_KEY"))
|
||||||
|
|
||||||
|
httpClient := &http.Client{}
|
||||||
|
resp, err := httpClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode < 200 || resp.StatusCode > 299 {
|
||||||
|
return nil, fmt.Errorf(resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseJson(obj interface{}, text io.Reader) {
|
||||||
|
jsonStream, err := ioutil.ReadAll(text)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder := json.NewDecoder(bytes.NewReader(jsonStream))
|
||||||
|
|
||||||
|
for {
|
||||||
|
if err := decoder.Decode(obj); err == io.EOF {
|
||||||
|
break
|
||||||
|
} else if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
140
jira/structs.go
Normal file
140
jira/structs.go
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
package jira
|
||||||
|
|
||||||
|
import ()
|
||||||
|
|
||||||
|
type JiraIssue struct {
|
||||||
|
Fields JiraIssueFields
|
||||||
|
Id string
|
||||||
|
Key string
|
||||||
|
Self string
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueFields struct {
|
||||||
|
Comment JiraIssueComment
|
||||||
|
Description string
|
||||||
|
Project JiraIssueProject
|
||||||
|
SubTasks []JiraIssueSubTask
|
||||||
|
TimeTracking JiraIssueTimetracking
|
||||||
|
Updated string
|
||||||
|
Watcher JiraIssueWatcher
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueWatcher struct {
|
||||||
|
IsWatching bool
|
||||||
|
Self string
|
||||||
|
WatchCount int
|
||||||
|
Watchers []JiraAttribute
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueSubTask struct {
|
||||||
|
Id string
|
||||||
|
Type struct {
|
||||||
|
Id string
|
||||||
|
Name string
|
||||||
|
Inward string
|
||||||
|
Outward string
|
||||||
|
}
|
||||||
|
OutwardIssue struct {
|
||||||
|
Id string
|
||||||
|
Key string
|
||||||
|
Self string
|
||||||
|
Fields struct {
|
||||||
|
Status struct {
|
||||||
|
IconUrl string
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueProject struct {
|
||||||
|
Id string
|
||||||
|
Key string
|
||||||
|
Name string
|
||||||
|
ProjectCategory JiraAttribute
|
||||||
|
Self string
|
||||||
|
Simplified bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueComment struct {
|
||||||
|
Author JiraAttribute
|
||||||
|
Body string
|
||||||
|
Created string
|
||||||
|
Id string
|
||||||
|
Self string
|
||||||
|
UpdateAuthor JiraAttribute
|
||||||
|
Updated string
|
||||||
|
Visibility struct {
|
||||||
|
Type string
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraAttribute struct {
|
||||||
|
Active bool
|
||||||
|
DisplayName string
|
||||||
|
Name string
|
||||||
|
Self string
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraIssueTimetracking struct {
|
||||||
|
OriginalEstimate string
|
||||||
|
OriginalEstimateSeconds int
|
||||||
|
RemainingEstimate string
|
||||||
|
RemainingEstimateSeconds int
|
||||||
|
TimeSpent string
|
||||||
|
TimeSpentSeconds int
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraProject struct {
|
||||||
|
AssigneeType string
|
||||||
|
Components []JiraProjectComponent
|
||||||
|
Email string
|
||||||
|
IssueTypes []JiraProjectIssueType
|
||||||
|
Lead JiraProjectMember
|
||||||
|
Name string
|
||||||
|
ProjectCategory JiraProjectCategory
|
||||||
|
Simplified bool
|
||||||
|
Url string
|
||||||
|
|
||||||
|
JiraAttribute
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraProjectCategory struct {
|
||||||
|
Description string
|
||||||
|
Id string
|
||||||
|
Name string
|
||||||
|
Self string
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraProjectComponent struct {
|
||||||
|
Assignee JiraProjectMember
|
||||||
|
AssigneeType string
|
||||||
|
IsAssigneeTypeValid bool
|
||||||
|
Lead JiraProjectMember
|
||||||
|
Project string
|
||||||
|
ProjectId int
|
||||||
|
RealAssigne JiraProjectMember
|
||||||
|
RealAssigneeType string
|
||||||
|
|
||||||
|
JiraAttribute
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraProjectIssueType struct {
|
||||||
|
AvatarId int
|
||||||
|
Description string
|
||||||
|
IconUrl string
|
||||||
|
Id string
|
||||||
|
Name string
|
||||||
|
Self string
|
||||||
|
SubTask bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type JiraProjectMember struct {
|
||||||
|
AccountId string
|
||||||
|
Active bool
|
||||||
|
DisplayName string
|
||||||
|
Key string
|
||||||
|
Name string
|
||||||
|
Self string
|
||||||
|
}
|
@ -33,11 +33,20 @@ func (widget *Widget) Refresh() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issues, err := IssuesFor(Config.UString("wtf.mods.jira.username"))
|
||||||
|
|
||||||
widget.View.SetTitle(fmt.Sprintf(" %s ", widget.Name))
|
widget.View.SetTitle(fmt.Sprintf(" %s ", widget.Name))
|
||||||
widget.RefreshedAt = time.Now()
|
widget.RefreshedAt = time.Now()
|
||||||
|
|
||||||
widget.View.Clear()
|
widget.View.Clear()
|
||||||
fmt.Fprintf(widget.View, "%s", "jira")
|
|
||||||
|
if err != nil {
|
||||||
|
widget.View.SetWrap(true)
|
||||||
|
fmt.Fprintf(widget.View, "%v", err)
|
||||||
|
} else {
|
||||||
|
widget.View.SetWrap(false)
|
||||||
|
fmt.Fprintf(widget.View, "%v", issues)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------- Unexported Functions -------------------- */
|
/* -------------------- Unexported Functions -------------------- */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user