mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	First commit
This commit is contained in:
		
						commit
						176052c78f
					
				
							
								
								
									
										17
									
								
								bamboohr/bamboohr.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								bamboohr/bamboohr.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fetch() []Item {
 | 
				
			||||||
 | 
						client := NewClient()
 | 
				
			||||||
 | 
						result := client.Away("timeOff", today(), today())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func today() string {
 | 
				
			||||||
 | 
						localNow := time.Now().Local()
 | 
				
			||||||
 | 
						return localNow.Format("2006-01-02")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										39
									
								
								bamboohr/calendar.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								bamboohr/calendar.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Calendar struct {
 | 
				
			||||||
 | 
						Items []Item `xml:"item"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------- Public Functions -------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (calendar *Calendar) Holidays() []Item {
 | 
				
			||||||
 | 
						return calendar.filteredItems("holiday")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (calendar *Calendar) ItemsByType(itemType string) []Item {
 | 
				
			||||||
 | 
						if itemType == "timeOff" {
 | 
				
			||||||
 | 
							return calendar.TimeOffs()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return calendar.Holidays()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (calendar *Calendar) TimeOffs() []Item {
 | 
				
			||||||
 | 
						return calendar.filteredItems("timeOff")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------- Private Functions -------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (calendar *Calendar) filteredItems(itemType string) []Item {
 | 
				
			||||||
 | 
						items := []Item{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, item := range calendar.Items {
 | 
				
			||||||
 | 
							if item.Type == itemType {
 | 
				
			||||||
 | 
								items = append(items, item)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return items
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										55
									
								
								bamboohr/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								bamboohr/client.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/xml"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// A Client represents the data required to connect to the BambooHR API
 | 
				
			||||||
 | 
					type Client struct {
 | 
				
			||||||
 | 
						apiBase   string
 | 
				
			||||||
 | 
						apiKey    string
 | 
				
			||||||
 | 
						subdomain string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewClient creates and returns a new BambooHR client
 | 
				
			||||||
 | 
					func NewClient() *Client {
 | 
				
			||||||
 | 
						client := Client{
 | 
				
			||||||
 | 
							apiBase:   "https://api.bamboohr.com/api/gateway.php",
 | 
				
			||||||
 | 
							apiKey:    os.Getenv("WTF_BAMBOO_HR_TOKEN"),
 | 
				
			||||||
 | 
							subdomain: os.Getenv("WTF_BAMBOO_HR_SUBDOMAIN"),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------- Public Functions -------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Away returns a string representation of the people who are out of the office during the defined period
 | 
				
			||||||
 | 
					func (client *Client) Away(itemType, startDate, endDate string) []Item {
 | 
				
			||||||
 | 
						calendar, _ := client.away(startDate, endDate)
 | 
				
			||||||
 | 
						items := calendar.ItemsByType(itemType)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return items
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------- Private Functions -------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// away is the private interface for retrieving structural data about who will be out of the office
 | 
				
			||||||
 | 
					// This method does the actual communication with BambooHR and returns the raw Go
 | 
				
			||||||
 | 
					// data structures used by the public interface
 | 
				
			||||||
 | 
					func (client *Client) away(startDate, endDate string) (cal Calendar, err error) {
 | 
				
			||||||
 | 
						apiURL := fmt.Sprintf(
 | 
				
			||||||
 | 
							"%s/%s/v1/time_off/whos_out?start=%s&end=%s",
 | 
				
			||||||
 | 
							client.apiBase,
 | 
				
			||||||
 | 
							client.subdomain,
 | 
				
			||||||
 | 
							startDate,
 | 
				
			||||||
 | 
							endDate,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data, err := Request(client.apiKey, apiURL)
 | 
				
			||||||
 | 
						err = xml.Unmarshal(data, &cal)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								bamboohr/employee.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								bamboohr/employee.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Note: this currently implements the minimum number of fields to fulfill the Away functionality.
 | 
				
			||||||
 | 
					* Undoubtedly there are more fields than this to an employee
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					type Employee struct {
 | 
				
			||||||
 | 
						ID   int    `xml:"id,attr"`
 | 
				
			||||||
 | 
						Name string `xml:",chardata"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										42
									
								
								bamboohr/item.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								bamboohr/item.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DateFormat defines the format we expect to receive dates from BambooHR in
 | 
				
			||||||
 | 
					const DateFormat = "2006-01-02"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Item struct {
 | 
				
			||||||
 | 
						Employee Employee `xml:"employee"`
 | 
				
			||||||
 | 
						End      string   `xml:"end"`
 | 
				
			||||||
 | 
						Holiday  string   `xml:"holiday"`
 | 
				
			||||||
 | 
						Start    string   `xml:"start"`
 | 
				
			||||||
 | 
						Type     string   `xml:"type,attr"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (item *Item) String() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf("Item: %s, %s, %s, %s", item.Type, item.Employee.Name, item.Start, item.End)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------- Public Functions -------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (item *Item) Name() string {
 | 
				
			||||||
 | 
						if (item.Employee != Employee{}) {
 | 
				
			||||||
 | 
							return item.Employee.Name
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return item.Holiday
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (item *Item) PrettyStart() string {
 | 
				
			||||||
 | 
						newTime, _ := time.Parse(DateFormat, item.Start)
 | 
				
			||||||
 | 
						return fmt.Sprint(newTime.Format("Jan 2, 2006"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (item *Item) PrettyEnd() string {
 | 
				
			||||||
 | 
						newTime, _ := time.Parse(DateFormat, item.End)
 | 
				
			||||||
 | 
						end := fmt.Sprint(newTime.Format("Jan 2, 2006"))
 | 
				
			||||||
 | 
						return end
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										39
									
								
								bamboohr/request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								bamboohr/request.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					package bamboohr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Request(apiKey string, apiURL string) ([]byte, error) {
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", apiURL, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req.SetBasicAuth(apiKey, "x")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := &http.Client{}
 | 
				
			||||||
 | 
						resp, err := client.Do(req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data, err := ParseBody(resp)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return data, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ParseBody(resp *http.Response) ([]byte, error) {
 | 
				
			||||||
 | 
						var buffer bytes.Buffer
 | 
				
			||||||
 | 
						_, err := buffer.ReadFrom(resp.Body)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return buffer.Bytes(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								github/github.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								github/github.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					package wtfgithub
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ()
 | 
				
			||||||
							
								
								
									
										42
									
								
								wtf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								wtf.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/rivo/tview"
 | 
				
			||||||
 | 
						"github.com/senorprogrammer/wtf/bamboohr"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						app := tview.NewApplication()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						grid := tview.NewGrid()
 | 
				
			||||||
 | 
						grid.SetRows(10, 40)    // 10 high, 40 high
 | 
				
			||||||
 | 
						grid.SetColumns(40, 40) // 40 wide, 40 wide
 | 
				
			||||||
 | 
						grid.SetBorder(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						grid.AddItem(bambooView(), 0, 0, 1, 1, 0, 0, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := app.SetRoot(grid, true).Run(); err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func bambooView() tview.Primitive {
 | 
				
			||||||
 | 
						items := bamboohr.Fetch()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bamboo := tview.NewTextView()
 | 
				
			||||||
 | 
						bamboo.SetBorder(true)
 | 
				
			||||||
 | 
						bamboo.SetDynamicColors(true)
 | 
				
			||||||
 | 
						bamboo.SetTitle(" 🐨 Away ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data := ""
 | 
				
			||||||
 | 
						for _, item := range items {
 | 
				
			||||||
 | 
							str := fmt.Sprintf("[green]%s[white]\n%s - %s\n\n", item.Name(), item.PrettyStart(), item.PrettyEnd())
 | 
				
			||||||
 | 
							data = data + str
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Fprintf(bamboo, "%s", data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bamboo
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user