def self.dispatch_command(args_text, user: nil, ckan_fetch: nil, ptv_fetch: nil, tfnsw_fetch: nil, devid: nil, key: nil, tfnsw_key: nil, time: Time.now, store: Game.default_store, network: nil, channel: nil, db_store: RabbotDb)
parsed = parse_command(args_text)
return { error: parsed[:error] } if parsed[:error]
return { reply: help_reply } if parsed[:action] == :help
creds = GovauConfig.ptv_credentials(devid: devid, key: key)
tfnsw_creds = GovauConfig.tfnsw_credentials(api_key: tfnsw_key)
case parsed[:action]
when :search
results = GovauCkan.search_datasets(parsed[:query], fetch: ckan_fetch)
{ reply: GovauCkan.format_search(parsed[:query], results) }
when :dataset
row = GovauCkan.fetch_dataset(parsed[:name], fetch: ckan_fetch)
{ reply: GovauCkan.format_dataset(row, name: parsed[:name]) }
when :station
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
stops = GovauPtv.search_stops(parsed[:query], devid: creds[:devid], key: creds[:key], fetch: ptv_fetch)
{ reply: GovauPtv.format_stations(parsed[:query], stops) }
when :routes
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
rows = GovauRoutes.fetch_routes(devid: creds[:devid], key: creds[:key], fetch: ptv_fetch)
{ reply: GovauRoutes.format_routes(rows) }
when :status
ptv_check = if GovauConfig.ptv_configured?(**creds)
GovauStatus.check_ptv(devid: creds[:devid], key: creds[:key], fetch: ptv_fetch)
else
{ ready: false, detail: "credentials not set" }
end
{
reply: GovauStatus.format_status(
ptv_configured: GovauConfig.ptv_configured?(**creds),
ptv_check: ptv_check
)
}
when :next_train
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
rows = GovauPtv.fetch_next_departures(
parsed[:station],
devid: creds[:devid],
key: creds[:key],
fetch: ptv_fetch
)
{ reply: GovauPtv.format_departures(parsed[:station], rows) }
when :disruptions
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
payload = GovauPtv.fetch_disruptions(devid: creds[:devid], key: creds[:key], fetch: ptv_fetch)
rows = GovauPtv.parse_disruptions(payload)
{ reply: GovauPtv.format_disruptions(rows) }
when :planned
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
payload = GovauPtv.fetch_disruptions(devid: creds[:devid], key: creds[:key], fetch: ptv_fetch)
rows = GovauPtv.parse_disruptions(payload, status: "Planned")
{
reply: GovauPtv.format_disruptions(
rows,
title: "Planned metro disruptions",
footer_label: "#{rows.length} planned"
)
}
when :derby
return { error: PTV_SETUP_HINT } unless GovauConfig.ptv_configured?(**creds)
rows = GovauPtv.fetch_next_departures(
parsed[:station],
devid: creds[:devid],
key: creds[:key],
fetch: ptv_fetch,
max_results: 1
)
result = GovauDerby.play(
user: user.to_s.strip.empty? ? "player" : user.to_s,
pick: parsed[:pick],
amount: parsed[:amount],
station: parsed[:station],
departures: rows,
time: time,
store: store
)
return { error: result[:error] } if result[:error]
{ reply: result[:message] }
when :detective
unless network && channel
return { error: "Dataset Detective must be used in a channel." }
end
if parsed[:detective_action] == :guess
result = GovauDetective.submit_guess(
network: network,
channel: channel,
user: user.to_s.strip.empty? ? "player" : user.to_s,
guess: parsed[:guess],
store: db_store
)
else
result = GovauDetective.start_round(
ckan_fetch: ckan_fetch,
network: network,
channel: channel,
store: db_store
)
end
return { error: result[:error] } if result[:error]
{ reply: result[:message] }
when :nsw_stop
return { error: TFNSW_SETUP_HINT } unless GovauConfig.tfnsw_configured?(**tfnsw_creds)
stops = GovauTfnsw.search_stops(parsed[:query], api_key: tfnsw_creds[:api_key], fetch: tfnsw_fetch)
{ reply: GovauTfnsw.format_stops(parsed[:query], stops) }
when :nsw_departures
return { error: TFNSW_SETUP_HINT } unless GovauConfig.tfnsw_configured?(**tfnsw_creds)
rows = GovauTfnsw.fetch_departures(parsed[:stop], api_key: tfnsw_creds[:api_key], fetch: tfnsw_fetch, when_time: time)
{ reply: GovauTfnsw.format_departures(parsed[:stop], rows) }
when :nsw_derby
return { error: TFNSW_SETUP_HINT } unless GovauConfig.tfnsw_configured?(**tfnsw_creds)
rows = GovauTfnsw.fetch_departures(parsed[:stop], api_key: tfnsw_creds[:api_key], fetch: tfnsw_fetch, when_time: time)
result = GovauTfnswDerby.play(
user: user.to_s.strip.empty? ? "player" : user.to_s,
pick: parsed[:pick],
amount: parsed[:amount],
stop: parsed[:stop],
api_key: tfnsw_creds[:api_key],
departures: rows,
time: time,
store: store
)
return { error: result[:error] } if result[:error]
{ reply: result[:message] }
else
command_error
end
end