-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathdata_types.py
More file actions
231 lines (178 loc) · 5.93 KB
/
data_types.py
File metadata and controls
231 lines (178 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
import datetime
from enum import Enum
from typing import NamedTuple, List, Dict, Union
from helpers import distance_km, distance, get_iso_time, QUICK_FIX_DIST
class UserLoc(NamedTuple):
lat: float
lon: float
class BusStop(NamedTuple):
NAME_: str
LAT_: float
LON_: float
ID: int
AZMTH: int = 0
def __str__(self):
return f'(BusStop: {self.NAME_} {self.LAT_} {self.LON_} )'
def distance_km(self, bus_stop):
return distance_km(self.LAT_, self.LON_, bus_stop.LAT_, bus_stop.LON_)
class LongBusRouteStop(NamedTuple):
NUMBER_: int
NAME_: str
LAT_: float
LON_: float
ROUT_: int
CONTROL_: int = 0
ID: int = 0
def distance_km(self, bus_stop):
return distance_km(self.LAT_, self.LON_, bus_stop.LAT_, bus_stop.LON_)
class ShortBusRoute(NamedTuple):
NUMBER_: int
ROUT_: int
CONTROL_: int
STOPID: int
class CoddNextBus(NamedTuple):
rname_: str
time_: int
class CoddBus(NamedTuple):
NAME_: str
ID_: int
ROUTE_ACTIVE_: bool = True
class CdsBus(NamedTuple):
obj_id_: int
proj_id_: int
last_speed_: int
last_lon_: float
last_lat_: float
name_: str
last_time_: str
route_name_: str
type_proj: int
phone_: str
class CoddRouteBus(NamedTuple):
obj_id_: int
proj_id_: int
last_speed_: int
last_lon_: float
last_lat_: float
lon2: int
lat2: int
azimuth: int
last_time_: str
route_name_: str
type_proj: int
lowfloor: int
dist: int = 0
class CdsBusPosition(NamedTuple):
lat: float
lon: float
last_time: datetime.datetime
def distance(self, bus_stop: BusStop = None, user_loc: UserLoc = None):
if not bus_stop and not user_loc:
return QUICK_FIX_DIST
(lat, lon) = (bus_stop.LAT_, bus_stop.LON_) if bus_stop else (user_loc.lat, user_loc.lon)
if lat is None or lon is None:
return QUICK_FIX_DIST
return distance(lat, lon, self.lat, self.lon)
def distance_km(self, bus_stop: BusStop = None, position: Union[UserLoc, NamedTuple] = None):
(lat, lon) = (bus_stop.LAT_, bus_stop.LON_) if bus_stop else (position.lat, position.lon)
if lat is None or lon is None:
return QUICK_FIX_DIST
return distance_km(lat, lon, self.lat, self.lon)
def is_valid_coords(self):
return self.lat != 0.0 and self.lon != 0.0
class CdsRouteBus(NamedTuple):
last_lat_: float
last_lon_: float
last_speed_: float
last_time_: datetime.datetime
name_: str
obj_id_: int
proj_id_: int
route_name_: str
type_proj: int = 0
last_station_time_: datetime.datetime = None
bus_station_: str = ""
low_floor: bool = False
bus_type: int = 0
obj_output: int = 0
avg_speed: float = 0
avg_last_speed: float = 0
azimuth: int = 0
bort_name: str = ''
@staticmethod
def make(last_lat_, last_lon_, last_speed_, last_time_, name_, obj_id_, proj_id_, route_name_,
type_proj, last_station_time_, bus_station_, low_floor=False, bus_type=0, avg_speed=18, azimuth=0, bort_name=""):
try:
last_time_ = get_iso_time(last_time_)
last_station_time_ = get_iso_time(last_station_time_) if last_station_time_ else None
except Exception as e:
print(e)
return CdsRouteBus(last_lat_, last_lon_, last_speed_, last_time_, name_, obj_id_, proj_id_,
route_name_, type_proj, last_station_time_, bus_station_, low_floor, bus_type, avg_speed, azimuth, bort_name)
def get_bus_position(self) -> CdsBusPosition:
return CdsBusPosition(self.last_lat_, self.last_lon_, self.last_time_)
def filter_by_name(self, filter_query: str) -> bool:
bus_filter = filter_query.lower().split(' ')
name = self.name_.lower()
bort_name = self.bort_name.lower()
return not filter_query or any((q in name for q in bus_filter if q)) or any((q in bort_name for q in bus_filter if q))
def short(self):
return f'{self.bus_station_}; {self.last_lat_} {self.last_lon_} '
def distance(self, bus_stop: BusStop = None, user_loc: UserLoc = None):
if not bus_stop and not user_loc:
return QUICK_FIX_DIST
(lat, lon) = (bus_stop.LAT_, bus_stop.LON_) if bus_stop else (user_loc.lat, user_loc.lon)
return distance(lat, lon, self.last_lat_, self.last_lon_)
def distance_km(self, bus_stop: BusStop = None, user_loc: UserLoc = None):
if not bus_stop and not user_loc:
return QUICK_FIX_DIST
(lat, lon) = (bus_stop.LAT_, bus_stop.LON_) if bus_stop else (user_loc.lat, user_loc.lon)
return distance_km(lat, lon, self.last_lat_, self.last_lon_)
def is_valid_coords(self):
return self.last_lat_ > 0.0 and self.last_lon_ > 0.0
class ArrivalBusStopInfo(NamedTuple):
bus_info: CdsRouteBus
distance: float
time_left: float
class ArrivalBusStopInfoFull(NamedTuple):
bus_stop_id: int
bus_stop_name: str
lat: float
lon: float
azmth: int
text: str
bus_routes: List[str] = []
arrival_buses: List[ArrivalBusStopInfo] = []
class ArrivalInfo(NamedTuple):
text: str
header: str = ''
arrival_details: List[ArrivalBusStopInfoFull] = []
bus_stops: List[BusStop] = []
found: bool = False
class CdsBaseDataProvider:
CACHE_TIMEOUT = 0
def now(self) -> datetime.datetime:
pass
def load_all_cds_buses(self) -> List[CdsRouteBus]:
pass
def load_codd_route_names(self) -> Dict:
pass
def load_bus_stations_routes(self) -> Dict:
pass
def load_bus_stops(self) -> List[BusStop]:
pass
def load_new_codd_route_names(self):
pass
def load_new_bus_stations_routes(self):
pass
class AbuseRule(NamedTuple):
event: Enum
count: int
delta: datetime.timedelta
class StatsData(NamedTuple):
min1: int
min10: int
min30: int
min60: int
total: int
text: str