penguin/golifehk

@golifehk bot in Telegram

datasources/mtr/bus/QueryResult.go

raw ยท 2977 bytes

package bus

import (
    "fmt"
    "sort"
    "strings"
)

type QueryResult struct {
    Schedules *map[BusStop] *BusStopBuses
    Lang string
    Error error
    Query *QueryObject
}

var MARKDOWN_ESC []string = []string{"_", "*", "[", "]", "(", ")", "~", "`", ">", "#", "+", "-", "=", "|", "{", "}", ".", "!"}
func _escape( t string ) string {
    for _, c := range MARKDOWN_ESC {
        t = strings.Replace( t, c, "\\" + c, -1 )
    }
    return t
}

func writeShortRoute( lang *string, sb *strings.Builder, b *BusStop ) {
    if b.PrevStop() != nil {
        sb.WriteString( _escape( (*b.PrevStop().Name)[ *lang ] ) )
        sb.WriteString( " \\> " )
    }

    sb.WriteString( "*" )
    sb.WriteString( _escape( (*b.Name)[ *lang ] ) )
    sb.WriteString( "*" )

    if b.NextStop() != nil {
        sb.WriteString( " \\> " )
        sb.WriteString( _escape( (*b.NextStop().Name)[ *lang ] ) )
    }

    sb.WriteString( "\n" )
}

func ( result QueryResult ) Message() string {

    if result.Error != nil {
        return fmt.Sprintf( "%s", result.Error )
    }

    sb := strings.Builder{}

    if result.Schedules == nil {

        query := *result.Query
        if query.Route == "" {
            sort.Sort( ByRouteId( *query.BusStops ) )
            for _, busStop := range *query.BusStops {
                sb.WriteString( _escape( busStop.RouteId ) )
                sb.WriteString( " " )
                writeShortRoute( &result.Lang, &sb, &busStop )
            }
        } else if query.BusStops == nil && query.RouteStarts != nil {
            for d, b := range *query.RouteStarts {
                sb.WriteString( query.Route )
                sb.WriteString( "\\-" )
                sb.WriteString( _escape( d ) )
                sb.WriteString( "\n " )

                for {
                    sb.WriteString( _escape( (*b.Name)[ result.Lang ] ) )
                    b = b.NextStop()
                    if b == nil {
                        break
                    }

                    sb.WriteString( " \\> " )
                }
                sb.WriteString( "\n" )
            }
        } else {
            sb.WriteString( _escape( "Unreachable condition occured!?" ) )
        }
    } else {
        if 0 < len(*result.Schedules) {
            for busStop, buses := range *result.Schedules {
                writeShortRoute( &result.Lang, &sb, &busStop )
                for _, bus := range buses.Buses {
                    sb.WriteString( "  \\* " )
                    if bus.ETAText == "" {
                        sb.WriteString( _escape( bus.ETDText ) )
                    } else {
                        sb.WriteString( _escape( bus.ETAText ) )
                    }
                    sb.WriteString( "\n" )
                }
                sb.WriteString( "\n" )
            }
        } else {
            sb.WriteString( _escape( "Schedules are empty...perhaps Out of Service Time?" ) )
        }
    }

    return sb.String()
}