@@ -158,18 +158,11 @@ def _is_expected_nightly_fetch_error(exc: BaseException) -> bool:
158158 JSONDecodeError ,
159159 FetchReleaseError ,
160160 )
161- current : BaseException | None = exc
162- seen : set [int ] = set ()
163- while current is not None and id (current ) not in seen :
164- seen .add (id (current ))
165- if isinstance (current , expected_types ):
166- return True
167- current = getattr (current , "__cause__" , None ) or getattr (
168- current ,
169- "__context__" ,
170- None ,
171- )
172- return False
161+ if isinstance (exc , expected_types ):
162+ return True
163+
164+ cause = getattr (exc , "__cause__" , None ) or getattr (exc , "__context__" , None )
165+ return isinstance (cause , expected_types )
173166
174167 async def get_nightly_release (self ) -> dict | None :
175168 nightly_release_url = f"{ self .GITHUB_RELEASE_API } /tags/{ self .NIGHTLY_TAG } "
@@ -201,6 +194,44 @@ async def get_releases_with_nightly(self, latest: bool = True) -> list:
201194 releases .insert (0 , nightly_release )
202195 return releases
203196
197+ async def _resolve_latest_target (self ) -> tuple [str , str ]:
198+ releases = await self .get_releases (latest = True )
199+ latest_release = next (
200+ (
201+ item
202+ for item in releases
203+ if item .get ("tag_name" , "" ).lower () != self .NIGHTLY_TAG
204+ ),
205+ None ,
206+ )
207+ if latest_release is None :
208+ raise Exception ("未找到可用的发布版本。" )
209+
210+ latest_version = latest_release ["tag_name" ]
211+ if self .compare_version (VERSION , latest_version ) >= 0 :
212+ raise Exception ("当前已经是最新版本。" )
213+ return latest_version , latest_release ["zipball_url" ]
214+
215+ def _resolve_nightly_target (self ) -> tuple [str , str ]:
216+ return self .NIGHTLY_TAG , (
217+ f"https://github.com/AstrBotDevs/AstrBot/archive/refs/tags/{ self .NIGHTLY_TAG } .zip"
218+ )
219+
220+ async def _resolve_tag_target (self , version_str : str ) -> tuple [str , str ]:
221+ releases = await self .get_releases (latest = False )
222+ for data in releases :
223+ if data ["tag_name" ] == version_str :
224+ return version_str , data ["zipball_url" ]
225+ raise Exception (f"未找到版本号为 { version_str } 的更新文件。" )
226+
227+ def _resolve_commit_target (self , version_str : str ) -> tuple [str , str ]:
228+ if len (version_str ) != 40 :
229+ raise Exception ("commit hash 长度不正确,应为 40" )
230+ return (
231+ version_str ,
232+ f"https://github.com/AstrBotDevs/AstrBot/archive/{ version_str } .zip" ,
233+ )
234+
204235 async def _resolve_update_target (
205236 self ,
206237 latest : bool ,
@@ -209,41 +240,15 @@ async def _resolve_update_target(
209240 version_str = str (version ) if version is not None else ""
210241
211242 if latest :
212- releases = await self .get_releases (latest = True )
213- latest_release = next (
214- (
215- item
216- for item in releases
217- if item .get ("tag_name" , "" ).lower () != self .NIGHTLY_TAG
218- ),
219- None ,
220- )
221- if latest_release is None :
222- raise Exception ("未找到可用的发布版本。" )
223-
224- latest_version = latest_release ["tag_name" ]
225- if self .compare_version (VERSION , latest_version ) >= 0 :
226- raise Exception ("当前已经是最新版本。" )
227- return latest_version , latest_release ["zipball_url" ]
243+ return await self ._resolve_latest_target ()
228244
229245 if version_str .lower () == self .NIGHTLY_TAG :
230- return self .NIGHTLY_TAG , (
231- f"https://github.com/AstrBotDevs/AstrBot/archive/refs/tags/{ self .NIGHTLY_TAG } .zip"
232- )
246+ return self ._resolve_nightly_target ()
233247
234248 if version_str .startswith ("v" ):
235- releases = await self .get_releases (latest = False )
236- for data in releases :
237- if data ["tag_name" ] == version_str :
238- return version_str , data ["zipball_url" ]
239- raise Exception (f"未找到版本号为 { version_str } 的更新文件。" )
249+ return await self ._resolve_tag_target (version_str )
240250
241- if len (version_str ) != 40 :
242- raise Exception ("commit hash 长度不正确,应为 40" )
243- return (
244- version_str ,
245- f"https://github.com/AstrBotDevs/AstrBot/archive/{ version_str } .zip" ,
246- )
251+ return self ._resolve_commit_target (version_str )
247252
248253 async def update (self , reboot = False , latest = True , version = None , proxy = "" ) -> None :
249254 if os .environ .get ("ASTRBOT_CLI" ) or os .environ .get ("ASTRBOT_LAUNCHER" ):
0 commit comments