diff --git a/test_builds/wtf b/test_builds/wtf new file mode 100755 index 00000000..fa5e1899 Binary files /dev/null and b/test_builds/wtf differ diff --git a/wtf.go b/wtf.go index efeac338..9218a4da 100644 --- a/wtf.go +++ b/wtf.go @@ -46,6 +46,7 @@ import ( "github.com/senorprogrammer/wtf/weatherservices/prettyweather" "github.com/senorprogrammer/wtf/weatherservices/weather" "github.com/senorprogrammer/wtf/wtf" + "github.com/senorprogrammer/wtf/zendesk" ) var Config *config.Config @@ -229,6 +230,8 @@ func addWidget(app *tview.Application, pages *tview.Pages, widgetName string) { Widgets = append(Widgets, trello.NewWidget()) case "weather": Widgets = append(Widgets, weather.NewWidget(app, pages)) + case "zendesk": + Widgets = append(Widgets, zendesk.NewWidget()) default: } } diff --git a/zendesk/client.go b/zendesk/client.go new file mode 100644 index 00000000..04a6ebda --- /dev/null +++ b/zendesk/client.go @@ -0,0 +1,68 @@ +package zendesk + +import ( + "bytes" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" +) + +type Resource struct { + //Headers http.Header + Response interface{} + Raw string +} + +var a = os.Getenv("ZENDESK_API") +var username = os.Getenv("ZENDESK_USERNAME") +var subdomain = os.Getenv("ZENDESK_SUBDOMAIN") +var baseURL = fmt.Sprintf("https://%v.zendesk.com/api/v2", subdomain) + +func errHandler(err error) { + if err != nil { + log.Print(err) + } +} + +func buildUrl(baseURL string) string { + ticketURL := baseURL + "/tickets.json?sort_by=status" + return ticketURL +} + +func api(key string, meth string, path string, params string) (*Resource, error) { + + trn := &http.Transport{} + + client := &http.Client{ + Transport: trn, + } + + var URL = buildUrl(baseURL) + + req, err := http.NewRequest(meth, URL, bytes.NewBufferString(params)) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", "application/json") + + apiUser := fmt.Sprintf("%v/token", username) + req.SetBasicAuth(apiUser, key) + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return &Resource{Response: &resp, Raw: string(data)}, nil + +} diff --git a/zendesk/tickets.go b/zendesk/tickets.go new file mode 100644 index 00000000..3cf3c2f7 --- /dev/null +++ b/zendesk/tickets.go @@ -0,0 +1,104 @@ +package zendesk + +import ( + "encoding/json" + "fmt" + "log" +) + +type TicketArray struct { + Count int `json:"count"` + Created string `json:"created"` + Next_page string `json:"next_page"` + Previous_page string `json:"previous_page"` + Tickets []Ticket +} + +type SingleTicket struct { + Ticket *Ticket `json:"ticket"` +} + +type Ticket struct { + Id uint64 `json:"id"` + URL string `json:"url"` + ExternalId string `json:"external_id"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` + Type string `json:"type"` + Subject string `json:"subject"` + RawSubject string `json:"raw_subject"` + Description string `json:"description"` + Priority string `json:"priority"` + Status string `json:"status"` + Recipient string `json:"recipient"` + RequesterId uint32 `json:"requester_id"` + SubmitterId uint32 `json:"submitter_id"` + AssigneeId uint32 `json:"assignee_id"` + OrganizationId uint32 `json:"organization_id"` + GroupId uint32 `json:"group_id"` + CollaboratorIds []int32 `json:"collaborator_ids"` + ForumTopicId uint32 `json:"forum_topic_id"` + ProblemId uint32 `json:"problem_id"` + HasIncidents bool `json:"has_incidents"` + DueAt string `json:"due_at"` + Tags []string `json:"tags"` + Satisfaction_rating string `json:"satisfaction_rating"` + Ticket_form_id uint32 `json:"ticket_form_id"` + Sharing_agreement_ids interface{} `json:"sharing_agreement_ids"` + Via interface{} `json:"via"` + Custom_Fields interface{} `json:"custom_fields"` + Fields interface{} `json:"fields"` +} + +//var a = os.Getenv("ZENDESK_API") + +func listTickets(pag ...string) (*TicketArray, error) { + + TicketStruct := &TicketArray{} + + var path string + if len(pag) < 1 { + path = "/tickets.json" + } else { + path = pag[0] + } + resource, err := api(a, "GET", path, "") + if err != nil { + return nil, err + } + + json.Unmarshal([]byte(resource.Raw), TicketStruct) + + return TicketStruct, err + +} + +func newTickets() ([]string, error) { + var newTickets []string + tickets, err := listTickets() + if err != nil { + log.Fatal(err) + } + for i := range tickets.Tickets { + if tickets.Tickets[i].Status == "new" { + requester := tickets.Tickets[i].Via + req, _ := requester.(map[string]interface{}) + source := req["source"] + fromMap, _ := source.(map[string]interface{}) + from := fromMap["from"] + fromValue, _ := from.(map[string]interface{}) + name := fromValue["name"] + + newTicket := fmt.Sprintf("%v - %v - %v - %v", tickets.Tickets[i].Id, tickets.Tickets[i].Status, tickets.Tickets[i].Subject, name) + newTickets = append(newTickets, newTicket) + } + } + if len(newTickets) < 1 { + fmt.Println("No unassigned tickets in queue - woop!!") + } else { + for i := range newTickets { + fmt.Println(newTickets[i]) + } + } + return newTickets, nil +} diff --git a/zendesk/widget.go b/zendesk/widget.go new file mode 100644 index 00000000..68cdbff2 --- /dev/null +++ b/zendesk/widget.go @@ -0,0 +1,48 @@ +package zendesk + +import ( + "fmt" + "log" + + "github.com/senorprogrammer/wtf/wtf" +) + +type Widget struct { + wtf.TextWidget +} + +func NewWidget() *Widget { + widget := Widget{ + TextWidget: wtf.NewTextWidget(" Zendesk ", "zendesk", false), + } + + return &widget +} + +/* -------------------- Exported Functions -------------------- */ +func (widget *Widget) Refresh() { + tickets, err := newTickets() + if err != nil { + log.Fatal(err) + } + widget.UpdateRefreshedAt() + + widget.View.SetTitle(fmt.Sprintf("%s (%d)", widget.Name, len(tickets))) + widget.View.SetText(widget.textContent(tickets)) + +} + +/* -------------------- Unexported Functions -------------------- */ + +func (widget *Widget) textContent(items []string) string { + if len(items) == 0 { + return fmt.Sprintf("No unassigned tickets in queue - woop!!") + } + + str := "" + for i := range items { + str = items[i] + } + + return str +}