Retro Bulletin Board Systems on atproto. Web app and TUI. lazy mirror of alyraffauf/atbbs atbbs.xyz
forums python tui atproto bbs
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

web/routes/sysop: handle pds write failures

+151 -113
+151 -113
web/routes_sysop.py
··· 23 23 return False 24 24 25 25 26 + async def error(message: str, status: int = 500): 27 + return await render_template("error.html", message=message), status 28 + 29 + 26 30 @bp.route("/account") 27 31 async def account(): 28 32 user = await get_user() ··· 86 90 pass 87 91 88 92 # Delete site record 89 - await authed_delete_record(user, lexicon.SITE, "self") 93 + try: 94 + await authed_delete_record(user, lexicon.SITE, "self") 95 + except Exception: 96 + return await error("Could not delete BBS.") 90 97 91 98 return redirect("/account") 92 99 ··· 115 122 116 123 now = now_iso() 117 124 118 - # Create board records 119 - for i, slug in enumerate(board_slugs): 120 - board_name = board_names[i] if i < len(board_names) else slug 121 - board_desc = board_descs[i].strip() if i < len(board_descs) else "" 125 + try: 126 + # Create board records 127 + for i, slug in enumerate(board_slugs): 128 + board_name = board_names[i] if i < len(board_names) else slug 129 + board_desc = board_descs[i].strip() if i < len(board_descs) else "" 130 + await _authed_pds_post( 131 + user, 132 + "com.atproto.repo.putRecord", 133 + { 134 + "repo": user["did"], 135 + "collection": lexicon.BOARD, 136 + "rkey": slug, 137 + "record": { 138 + "$type": lexicon.BOARD, 139 + "name": board_name, 140 + "description": board_desc, 141 + "createdAt": now, 142 + }, 143 + }, 144 + ) 145 + 146 + # Create site record 122 147 await _authed_pds_post( 123 148 user, 124 149 "com.atproto.repo.putRecord", 125 150 { 126 151 "repo": user["did"], 127 - "collection": lexicon.BOARD, 128 - "rkey": slug, 152 + "collection": lexicon.SITE, 153 + "rkey": "self", 129 154 "record": { 130 - "$type": lexicon.BOARD, 131 - "name": board_name, 132 - "description": board_desc, 155 + "$type": lexicon.SITE, 156 + "name": name, 157 + "description": description, 158 + "intro": intro, 159 + "boards": board_slugs, 160 + "bannedDids": [], 161 + "hiddenPosts": [], 133 162 "createdAt": now, 134 163 }, 135 164 }, 136 165 ) 137 - 138 - # Create site record 139 - await _authed_pds_post( 140 - user, 141 - "com.atproto.repo.putRecord", 142 - { 143 - "repo": user["did"], 144 - "collection": lexicon.SITE, 145 - "rkey": "self", 146 - "record": { 147 - "$type": lexicon.SITE, 148 - "name": name, 149 - "description": description, 150 - "intro": intro, 151 - "boards": board_slugs, 152 - "bannedDids": [], 153 - "hiddenPosts": [], 154 - "createdAt": now, 155 - }, 156 - }, 157 - ) 166 + except Exception: 167 + return await error("Could not create BBS.") 158 168 159 169 return redirect(f"/bbs/{user['handle']}") 160 170 ··· 179 189 180 190 banned_handles = {} 181 191 if bbs.site.banned_dids: 182 - authors = await resolve_identities_batch(client, list(bbs.site.banned_dids)) 183 - banned_handles = {did: authors[did].handle for did in authors} 192 + try: 193 + authors = await resolve_identities_batch( 194 + client, list(bbs.site.banned_dids) 195 + ) 196 + banned_handles = {did: authors[did].handle for did in authors} 197 + except Exception: 198 + banned_handles = {did: did for did in bbs.site.banned_dids} 184 199 185 200 hidden_posts = [] 186 201 if bbs.site.hidden_posts: 187 - hidden_dids = list({AtUri.parse(uri).did for uri in bbs.site.hidden_posts}) 188 - hidden_authors = await resolve_identities_batch(client, hidden_dids) 202 + try: 203 + hidden_dids = list( 204 + {AtUri.parse(uri).did for uri in bbs.site.hidden_posts} 205 + ) 206 + hidden_authors = await resolve_identities_batch(client, hidden_dids) 207 + except Exception: 208 + hidden_authors = {} 189 209 190 210 for uri in bbs.site.hidden_posts: 191 211 did = AtUri.parse(uri).did ··· 207 227 "uri": uri, 208 228 "handle": handle, 209 229 "title": "", 210 - "body": parts[-1] if parts else uri, 230 + "body": uri, 211 231 } 212 232 ) 213 233 ··· 235 255 site_value["hiddenPosts"] = hidden_uris 236 256 site_value["updatedAt"] = now_iso() 237 257 238 - await _authed_pds_post( 239 - user, 240 - "com.atproto.repo.putRecord", 241 - { 242 - "repo": user["did"], 243 - "collection": lexicon.SITE, 244 - "rkey": "self", 245 - "record": site_value, 246 - }, 247 - ) 258 + try: 259 + await _authed_pds_post( 260 + user, 261 + "com.atproto.repo.putRecord", 262 + { 263 + "repo": user["did"], 264 + "collection": lexicon.SITE, 265 + "rkey": "self", 266 + "record": site_value, 267 + }, 268 + ) 269 + except Exception: 270 + return await error("Could not save moderation changes.") 248 271 249 272 return redirect("/account/moderate") 250 273 ··· 292 315 existing_banned = [] 293 316 existing_hidden = [] 294 317 295 - # Upsert board records 296 - for i, slug in enumerate(board_slugs): 297 - board_name = board_names[i] if i < len(board_names) else slug 298 - board_desc = board_descs[i].strip() if i < len(board_descs) else "" 318 + try: 319 + # Upsert board records 320 + for i, slug in enumerate(board_slugs): 321 + board_name = board_names[i] if i < len(board_names) else slug 322 + board_desc = board_descs[i].strip() if i < len(board_descs) else "" 323 + await _authed_pds_post( 324 + user, 325 + "com.atproto.repo.putRecord", 326 + { 327 + "repo": user["did"], 328 + "collection": lexicon.BOARD, 329 + "rkey": slug, 330 + "record": { 331 + "$type": lexicon.BOARD, 332 + "name": board_name, 333 + "description": board_desc, 334 + "createdAt": now, 335 + }, 336 + }, 337 + ) 338 + 339 + # Update site record 299 340 await _authed_pds_post( 300 341 user, 301 342 "com.atproto.repo.putRecord", 302 343 { 303 344 "repo": user["did"], 304 - "collection": lexicon.BOARD, 305 - "rkey": slug, 345 + "collection": lexicon.SITE, 346 + "rkey": "self", 306 347 "record": { 307 - "$type": lexicon.BOARD, 308 - "name": board_name, 309 - "description": board_desc, 310 - "createdAt": now, 348 + "$type": lexicon.SITE, 349 + "name": name, 350 + "description": description, 351 + "intro": intro, 352 + "boards": board_slugs, 353 + "bannedDids": existing_banned, 354 + "hiddenPosts": existing_hidden, 355 + "createdAt": created_at, 356 + "updatedAt": now, 311 357 }, 312 358 }, 313 359 ) 314 - 315 - # Update site record 316 - await _authed_pds_post( 317 - user, 318 - "com.atproto.repo.putRecord", 319 - { 320 - "repo": user["did"], 321 - "collection": lexicon.SITE, 322 - "rkey": "self", 323 - "record": { 324 - "$type": lexicon.SITE, 325 - "name": name, 326 - "description": description, 327 - "intro": intro, 328 - "boards": board_slugs, 329 - "bannedDids": existing_banned, 330 - "hiddenPosts": existing_hidden, 331 - "createdAt": created_at, 332 - "updatedAt": now, 333 - }, 334 - }, 335 - ) 360 + except Exception: 361 + return await error("Could not update BBS.") 336 362 337 363 return redirect(f"/bbs/{user['handle']}") 338 364 ··· 352 378 site_uri = str(AtUri(user["did"], lexicon.SITE, "self")) 353 379 now = now_iso() 354 380 355 - await _authed_pds_post( 356 - user, 357 - "com.atproto.repo.createRecord", 358 - { 359 - "repo": user["did"], 360 - "collection": lexicon.NEWS, 361 - "record": { 362 - "$type": lexicon.NEWS, 363 - "site": site_uri, 364 - "title": title, 365 - "body": body, 366 - "createdAt": now, 381 + try: 382 + await _authed_pds_post( 383 + user, 384 + "com.atproto.repo.createRecord", 385 + { 386 + "repo": user["did"], 387 + "collection": lexicon.NEWS, 388 + "record": { 389 + "$type": lexicon.NEWS, 390 + "site": site_uri, 391 + "title": title, 392 + "body": body, 393 + "createdAt": now, 394 + }, 367 395 }, 368 - }, 369 - ) 396 + ) 397 + except Exception: 398 + return await error("Could not post news.") 370 399 371 400 return redirect(f"/bbs/{handle}") 372 401 ··· 377 406 if not user or user["handle"] != handle: 378 407 return redirect(f"/bbs/{handle}") 379 408 380 - await authed_delete_record(user, lexicon.NEWS, tid) 409 + try: 410 + await authed_delete_record(user, lexicon.NEWS, tid) 411 + except Exception: 412 + return await error("Could not delete news.") 381 413 382 414 return redirect(f"/bbs/{handle}") 383 415 ··· 407 439 # Update site record 408 440 site_value["bannedDids"] = banned 409 441 site_value["updatedAt"] = now_iso() 410 - await _authed_pds_post( 411 - user, 412 - "com.atproto.repo.putRecord", 413 - { 414 - "repo": user["did"], 415 - "collection": lexicon.SITE, 416 - "rkey": "self", 417 - "record": site_value, 418 - }, 419 - ) 442 + try: 443 + await _authed_pds_post( 444 + user, 445 + "com.atproto.repo.putRecord", 446 + { 447 + "repo": user["did"], 448 + "collection": lexicon.SITE, 449 + "rkey": "self", 450 + "record": site_value, 451 + }, 452 + ) 453 + except Exception: 454 + return await error("Could not ban user.") 420 455 421 456 return redirect(request.referrer or f"/bbs/{handle}") 422 457 ··· 448 483 449 484 site_value["hiddenPosts"] = hidden 450 485 site_value["updatedAt"] = now_iso() 451 - await _authed_pds_post( 452 - user, 453 - "com.atproto.repo.putRecord", 454 - { 455 - "repo": user["did"], 456 - "collection": lexicon.SITE, 457 - "rkey": "self", 458 - "record": site_value, 459 - }, 460 - ) 486 + try: 487 + await _authed_pds_post( 488 + user, 489 + "com.atproto.repo.putRecord", 490 + { 491 + "repo": user["did"], 492 + "collection": lexicon.SITE, 493 + "rkey": "self", 494 + "record": site_value, 495 + }, 496 + ) 497 + except Exception: 498 + return await error("Could not hide post.") 461 499 462 500 return redirect(request.referrer or f"/bbs/{handle}")