mirror of
https://github.com/kaaninchen/Gleiswechsel.git
synced 2026-09-17 16:52:47 +00:00
feat: priority list
This commit is contained in:
@@ -121,6 +121,30 @@ For every station inside of the `stations.json` you'll find an ID. You can add t
|
||||
|
||||
This is especially useful if you want to add a station whose name isn't unique and also used by other stations. The bot would falsely use the first station with the same name and consider it an exact match, even if you wanted a different one. This won't happen with the ID, as every ID is uniquely assigned to only one station.
|
||||
|
||||
##### priority
|
||||
You can define priorities of transport modes while selecting a connection. Leave empty to disable
|
||||
|
||||
The list should be descending, with "1" as the most important transport mode. For example, let's say, the bot should always choose Trains and other longer distance public transport modes. If it can't find any, then it should resort to Metros/Subways/Suburbans. If these are also missing at that station, then it should just use Busses/Trams:
|
||||
|
||||
```json
|
||||
"priority": {
|
||||
"HIGHSPEED_RAIL": 1,
|
||||
"LONG_DISTANCE": 1,
|
||||
"NIGHT_RAIL": 1,
|
||||
"REGIONAL_RAIL": 1,
|
||||
"COACH": 1,
|
||||
"FERRY": 1,
|
||||
"METRO": 2,
|
||||
"SUBURBAN": 2,
|
||||
"SUBWAY": 2,
|
||||
"BUS": 3,
|
||||
"TRAM": 3
|
||||
}
|
||||
```
|
||||
A transport mode that isn't in the priority list would immediately get assigned the value of "99", making it near impossible to get that connection. Except when there are no other connections available, of course.
|
||||
|
||||
You can find the MODE names either in the console log or the stations.json from [helper tool](#stations)
|
||||
|
||||
##### blacklist
|
||||
You can blacklist specific types of transport, the bot would then skip them while selecting a connection. You can get the type in your console (mode)
|
||||
```sh
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
"Helsinki"
|
||||
],
|
||||
"IDs": [],
|
||||
"priority: "{
|
||||
}",
|
||||
"blacklist": [
|
||||
"OTHER",
|
||||
"RIDE_SHARING"
|
||||
|
||||
+27
-39
@@ -142,10 +142,12 @@ def get_random_stop_id() -> str | None:
|
||||
return None
|
||||
|
||||
stop_ids_list = list(stop_ids.keys())
|
||||
chosen_stop_id = random.choice(stop_ids_list)
|
||||
if len(stop_ids_list) > 1:
|
||||
logger(f"No station associated as '{assigned_station}', choosing random from similar named stations")
|
||||
logger(f"Run `python run main.py stations` to get exact station names")
|
||||
chosen_stop_id, chosen_station = random.choice(list(stop_ids.items()))
|
||||
logger(f"Selected station: {stop_ids[chosen_stop_id]}")
|
||||
|
||||
return chosen_stop_id
|
||||
|
||||
def get_random_connection(stop_id: str) -> str | None:
|
||||
@@ -153,20 +155,7 @@ def get_random_connection(stop_id: str) -> str | None:
|
||||
return None
|
||||
|
||||
now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
cursor = None
|
||||
max_pages = 5
|
||||
min_results = 5
|
||||
trip_ids = []
|
||||
all_stop_times = []
|
||||
|
||||
for _ in range(max_pages):
|
||||
params = {
|
||||
"stopId": stop_id,
|
||||
"n": 20,
|
||||
"time": now,
|
||||
}
|
||||
if cursor:
|
||||
params["pageCursor"] = cursor
|
||||
params = {"stopId": stop_id, "n": 50, "time": now}
|
||||
|
||||
try:
|
||||
response = requests.get(f"{endpoint}/api/v5/stoptimes", params=params, headers=headers)
|
||||
@@ -174,39 +163,38 @@ def get_random_connection(stop_id: str) -> str | None:
|
||||
data = response.json()
|
||||
except requests.RequestException as e:
|
||||
logger(e, "Error")
|
||||
break
|
||||
return None
|
||||
|
||||
stop_times = data.get("stopTimes", [])
|
||||
all_stop_times.extend(stop_times)
|
||||
|
||||
for entry in stop_times:
|
||||
trip_id = entry["tripId"]
|
||||
candidates = []
|
||||
for entry in data.get("stopTimes", []):
|
||||
if entry["mode"] in blacklist:
|
||||
continue
|
||||
else:
|
||||
trip_ids.append(entry["tripId"])
|
||||
candidates.append(entry)
|
||||
|
||||
if len(trip_ids) >= min_results:
|
||||
break
|
||||
|
||||
cursor = data.get("nextPageCursor")
|
||||
if not cursor:
|
||||
break
|
||||
|
||||
if not trip_ids:
|
||||
if not candidates:
|
||||
logger("Couldn't find any connections", "error")
|
||||
return None
|
||||
trip_id = random.choice(trip_ids)
|
||||
|
||||
from_station = None
|
||||
for entry in all_stop_times:
|
||||
if entry.get("tripId") == trip_id:
|
||||
from_station = entry.get("place", {}).get("name")
|
||||
break
|
||||
if config.connections.priority:
|
||||
best_priority = None
|
||||
for entry in candidates:
|
||||
priority = config.connections.priority.get(entry["mode"], 99)
|
||||
if best_priority is None or priority < best_priority:
|
||||
best_priority = priority
|
||||
|
||||
best_candidates = []
|
||||
for entry in candidates:
|
||||
priority = config.connections.priority.get(entry["mode"], 99)
|
||||
if priority == best_priority:
|
||||
best_candidates.append(entry)
|
||||
|
||||
chosen = random.choice(best_candidates)
|
||||
else:
|
||||
chosen = random.choice(candidates)
|
||||
|
||||
return {
|
||||
"trip_id": trip_id,
|
||||
"from_station": from_station
|
||||
"trip_id": chosen["tripId"],
|
||||
"from_station": chosen.get("place", {}).get("name"),
|
||||
}
|
||||
|
||||
def get_trip_details(random_connection: dict | None) -> dict | None:
|
||||
|
||||
+2
-1
@@ -1,5 +1,5 @@
|
||||
import json
|
||||
from dataclasses import dataclass, field
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
|
||||
@dataclass
|
||||
@@ -15,6 +15,7 @@ class DiscordConfig:
|
||||
class ConnectionsConfig:
|
||||
stations: list[str]
|
||||
IDs: list[str]
|
||||
priority: dict
|
||||
blacklist: list[str]
|
||||
min_duration: int
|
||||
timezone: str
|
||||
|
||||
Reference in New Issue
Block a user