Refactoring codes for more tg message types
This commit is contained in:
@@ -2,6 +2,7 @@ package bus
|
||||
|
||||
import (
|
||||
i18n "github.com/tgckpg/golifehk/i18n"
|
||||
query "github.com/tgckpg/golifehk/query"
|
||||
)
|
||||
|
||||
type BusStop struct {
|
||||
@@ -10,8 +11,6 @@ type BusStop struct {
|
||||
Direction string
|
||||
StationSeq int
|
||||
StationId string
|
||||
Latitude float64
|
||||
Longtitude float64
|
||||
Name_zh string
|
||||
Name_en string
|
||||
|
||||
@@ -22,6 +21,7 @@ type BusStop struct {
|
||||
AltRoutes *map[string]*BusStop
|
||||
|
||||
i18n.Generics
|
||||
query.GeoLocation
|
||||
}
|
||||
|
||||
func (this *BusStop) PrevStop() *BusStop {
|
||||
@@ -52,6 +52,14 @@ func (this *BusStop) Reload() {
|
||||
this.SearchData = &searchData
|
||||
}
|
||||
|
||||
func (this BusStop) Register(registers map[string]struct{}) bool {
|
||||
if _, ok := registers[this.StationId]; ok {
|
||||
return false
|
||||
}
|
||||
registers[this.StationId] = struct{}{}
|
||||
return true
|
||||
}
|
||||
|
||||
type ByRoute []*BusStop
|
||||
|
||||
func (a ByRoute) Len() int { return len(a) }
|
||||
|
||||
@@ -14,7 +14,10 @@ type QueryResult struct {
|
||||
Schedules *map[*BusStop]*BusStopBuses
|
||||
Lang string
|
||||
Error error
|
||||
Source *query.QueryMessage
|
||||
Query *query.QueryObject
|
||||
|
||||
isConsumed bool
|
||||
}
|
||||
|
||||
func writeShortRoute(lang *string, sb *strings.Builder, b *BusStop) {
|
||||
@@ -35,6 +38,10 @@ func writeShortRoute(lang *string, sb *strings.Builder, b *BusStop) {
|
||||
sb.WriteString("\n")
|
||||
}
|
||||
|
||||
func (this QueryResult) DataType() string { return "MarkdownV2" }
|
||||
func (this QueryResult) Consumed() bool { return this.isConsumed }
|
||||
func (this QueryResult) GetTableData() [][]map[string]string { return nil }
|
||||
|
||||
func (this QueryResult) Message() (string, error) {
|
||||
|
||||
if this.Error != nil {
|
||||
@@ -56,12 +63,41 @@ func (this QueryResult) Message() (string, error) {
|
||||
}
|
||||
|
||||
if q.Key == "" {
|
||||
sort.Sort(query.ByKey(*q.Results))
|
||||
for _, entry := range *q.Results {
|
||||
busStop := any(entry).(*BusStop)
|
||||
utils.WriteMDv2Text(&sb, busStop.RouteId)
|
||||
sb.WriteString(" ")
|
||||
writeShortRoute(&this.Lang, &sb, busStop)
|
||||
|
||||
loc := q.Message.Location
|
||||
if loc != nil {
|
||||
|
||||
// Print nearest bus stops
|
||||
for _, entry := range *q.Results {
|
||||
busStop := any(entry).(*BusStop)
|
||||
|
||||
utils.WriteMDv2Text(&sb, fmt.Sprintf("%.2fm", busStop.Dist(loc.Lat(), loc.Lon())))
|
||||
sb.WriteString(" ")
|
||||
sb.WriteString(" [")
|
||||
utils.WriteMDv2Text(&sb, busStop.RouteId)
|
||||
d := busStop.Direction
|
||||
if d == "O" {
|
||||
sb.WriteString("↑")
|
||||
} else if d == "I" {
|
||||
sb.WriteString("↓")
|
||||
} else {
|
||||
sb.WriteString("\\?")
|
||||
}
|
||||
utils.WriteMDv2Text(&sb, (*busStop.Name)[this.Lang])
|
||||
utils.WriteMDv2Text(&sb, busStop.RouteId)
|
||||
utils.WriteMDv2Text(&sb, (*busStop.Name)[this.Lang])
|
||||
sb.WriteString(")")
|
||||
sb.WriteString("\n")
|
||||
}
|
||||
|
||||
} else {
|
||||
sort.Sort(query.ByKey(*q.Results))
|
||||
for _, entry := range *q.Results {
|
||||
busStop := any(entry).(*BusStop)
|
||||
utils.WriteMDv2Text(&sb, busStop.RouteId)
|
||||
sb.WriteString(" ")
|
||||
writeShortRoute(&this.Lang, &sb, busStop)
|
||||
}
|
||||
}
|
||||
} else if 1 == len(*q.SearchTerms) {
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ func readBusStopData(r io.Reader) (*map[string]*BusStop, error) {
|
||||
entry.Latitude = v
|
||||
case "STATION_LONGITUDE":
|
||||
v, _ := strconv.ParseFloat(value, 64)
|
||||
entry.Longtitude = v
|
||||
entry.Longitude = v
|
||||
case "STATION_NAME_CHI":
|
||||
entry.Name_zh = value
|
||||
case "STATION_NAME_ENG":
|
||||
|
||||
@@ -6,7 +6,9 @@ import (
|
||||
query "github.com/tgckpg/golifehk/query"
|
||||
)
|
||||
|
||||
func Query(lang string, message string) query.IQueryResult {
|
||||
func Query(q query.QueryMessage) query.IQueryResult {
|
||||
|
||||
lang := q.Lang
|
||||
|
||||
var qBusStops *query.QueryObject
|
||||
var err error
|
||||
@@ -18,7 +20,14 @@ func Query(lang string, message string) query.IQueryResult {
|
||||
goto qrReturn
|
||||
}
|
||||
|
||||
qBusStops, err = query.Parse(strings.ToUpper(message), busStops)
|
||||
if q.Text != "" {
|
||||
qBusStops, err = query.MatchKeys(strings.ToUpper(q.Text), busStops)
|
||||
} else if q.Location != nil {
|
||||
qBusStops, err = query.MatchNearest(*q.Location, busStops, 100, 3)
|
||||
}
|
||||
|
||||
qBusStops.Message = &q
|
||||
|
||||
if err != nil {
|
||||
qr.Error = err
|
||||
goto qrReturn
|
||||
|
||||
Reference in New Issue
Block a user