|
225 | 225 | ] |
226 | 226 | }, |
227 | 227 | "execution_count": null, |
228 | | - "metadata": {}, |
| 228 | + "metadata": { |
| 229 | + "__type": "Guild" |
| 230 | + }, |
229 | 231 | "output_type": "execute_result" |
230 | 232 | } |
231 | 233 | ], |
|
287 | 289 | { |
288 | 290 | "data": { |
289 | 291 | "text/html": [ |
290 | | - "<table class=\"prose\"><thead><tr><th>ID</th><th>Name</th><th>Type</th></tr></thead><tbody><tr><td>1327046393453613077</td><td>Text Channels</td><td>4</td></tr><tr><td>1327046393453613078</td><td>Voice Channels</td><td>4</td></tr><tr><td>1327046393453613079</td><td>general</td><td>0</td></tr><tr><td>1327046393453613080</td><td>General</td><td>2</td></tr><tr><td>1327954661960978512</td><td>private</td><td>0</td></tr></tbody></table>" |
| 292 | + "<table class=\"prose\"><thead><tr><th>ID</th><th>Name</th><th>Type</th></tr></thead><tbody><tr><td>1327046393453613077</td><td>Text Channels</td><td>4</td></tr><tr><td>1327046393453613078</td><td>Voice Channels</td><td>4</td></tr><tr><td>1327046393453613079</td><td>general</td><td>0</td></tr><tr><td>1327046393453613080</td><td>General</td><td>2</td></tr><tr><td>1327954661960978512</td><td>private</td><td>0</td></tr><tr><td>1475600987627458812</td><td>forwarded</td><td>0</td></tr></tbody></table>" |
291 | 293 | ], |
292 | 294 | "text/plain": [ |
293 | 295 | "[Channel(id=1327046393453613077, name='Text Channels', type=4),\n", |
294 | 296 | " Channel(id=1327046393453613078, name='Voice Channels', type=4),\n", |
295 | 297 | " Channel(id=1327046393453613079, name='general', type=0),\n", |
296 | 298 | " Channel(id=1327046393453613080, name='General', type=2),\n", |
297 | | - " Channel(id=1327954661960978512, name='private', type=0)]" |
| 299 | + " Channel(id=1327954661960978512, name='private', type=0),\n", |
| 300 | + " Channel(id=1475600987627458812, name='forwarded', type=0)]" |
298 | 301 | ] |
299 | 302 | }, |
300 | 303 | "execution_count": null, |
301 | | - "metadata": {}, |
| 304 | + "metadata": { |
| 305 | + "__type": "Channels" |
| 306 | + }, |
302 | 307 | "output_type": "execute_result" |
303 | 308 | } |
304 | 309 | ], |
|
319 | 324 | ] |
320 | 325 | }, |
321 | 326 | "execution_count": null, |
322 | | - "metadata": {}, |
| 327 | + "metadata": { |
| 328 | + "__type": "Channel" |
| 329 | + }, |
323 | 330 | "output_type": "execute_result" |
324 | 331 | } |
325 | 332 | ], |
|
355 | 362 | "execution_count": null, |
356 | 363 | "id": "461bcb8b", |
357 | 364 | "metadata": {}, |
358 | | - "outputs": [ |
359 | | - { |
360 | | - "ename": "IndentationError", |
361 | | - "evalue": "unexpected indent (2441870440.py, line 6)", |
362 | | - "output_type": "error", |
363 | | - "traceback": [ |
364 | | - " \u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 6\u001b[39m", |
365 | | - "\u001b[31m \u001b[39m\u001b[31mself.data['content'] = re.sub( r'<@!?(\\d+)>',\u001b[39m", |
366 | | - " ^", |
367 | | - "\u001b[31mIndentationError\u001b[39m\u001b[31m:\u001b[39m unexpected indent" |
368 | | - ] |
369 | | - } |
370 | | - ], |
| 365 | + "outputs": [], |
371 | 366 | "source": [ |
372 | 367 | "#| export\n", |
373 | 368 | "class Message(DiscordObject):\n", |
|
422 | 417 | { |
423 | 418 | "data": { |
424 | 419 | "text/html": [ |
425 | | - "<table class=\"prose\"><thead><tr><th>ID</th><th>Author</th><th>Content</th><th>Date</th></tr></thead><tbody><tr><td>1473455208284684320</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468026882887823</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473468028950675577</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468409684426845</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473468411853148376</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr></tbody></table>" |
| 420 | + "<table class=\"prose\"><thead><tr><th>ID</th><th>Author</th><th>Content</th><th>Date</th></tr></thead><tbody><tr><td>1473468409684426845</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473468411853148376</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473720714816393372</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-18</td></tr><tr><td>1473721117276373023</td><td>nate.dawgg</td><td>@DBuddy</td><td>2026-02-18</td></tr><tr><td>1490061485593071666</td><td>DBuddy</td><td>Hi from SolveitAI! 👋</td><td>2026-04-04</td></tr></tbody></table>" |
426 | 421 | ], |
427 | 422 | "text/plain": [ |
428 | | - "[Message(id=1473455208284684320, author='DBuddy', content='Here is a file!'),\n", |
429 | | - " Message(id=1473468026882887823, author='DBuddy', content='Hi, from Solveit!'),\n", |
430 | | - " Message(id=1473468028950675577, author='DBuddy', content='Here is a file!'),\n", |
431 | | - " Message(id=1473468409684426845, author='DBuddy', content='Hi, from Solveit!'),\n", |
432 | | - " Message(id=1473468411853148376, author='DBuddy', content='Here is a file!')]" |
| 423 | + "[Message(id=1473468409684426845, author='DBuddy', content='Hi, from Solveit!'),\n", |
| 424 | + " Message(id=1473468411853148376, author='DBuddy', content='Here is a file!'),\n", |
| 425 | + " Message(id=1473720714816393372, author='DBuddy', content='Hi, from Solveit!'),\n", |
| 426 | + " Message(id=1473721117276373023, author='nate.dawgg', content='@DBuddy'),\n", |
| 427 | + " Message(id=1490061485593071666, author='DBuddy', content='Hi from SolveitAI! 👋')]" |
433 | 428 | ] |
434 | 429 | }, |
435 | 430 | "execution_count": null, |
436 | | - "metadata": {}, |
| 431 | + "metadata": { |
| 432 | + "__type": "Messages" |
| 433 | + }, |
437 | 434 | "output_type": "execute_result" |
438 | 435 | } |
439 | 436 | ], |
|
486 | 483 | { |
487 | 484 | "data": { |
488 | 485 | "text/html": [ |
489 | | - "<table class=\"prose\"><thead><tr><th>ID</th><th>Author</th><th>Content</th><th>Date</th></tr></thead><tbody><tr><td>1473468411853148376</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468409684426845</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473468028950675577</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468026882887823</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473455208284684320</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473455165708435556</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473452262922911961</td><td>nate.dawgg</td><td>howdy!</td><td>2026-02-17</td></tr></tbody></table>" |
| 486 | + "<table class=\"prose\"><thead><tr><th>ID</th><th>Author</th><th>Content</th><th>Date</th></tr></thead><tbody><tr><td>1490061485593071666</td><td>DBuddy</td><td>Hi from SolveitAI! 👋</td><td>2026-04-04</td></tr><tr><td>1483815592933720094</td><td>nate.dawgg</td><td></td><td>2026-03-18</td></tr><tr><td>1483812396307976363</td><td>nate.dawgg</td><td></td><td>2026-03-18</td></tr><tr><td>1481403515963183155</td><td>nate.dawgg</td><td></td><td>2026-03-11</td></tr><tr><td>1481022276089544834</td><td>nate.dawgg</td><td></td><td>2026-03-10</td></tr><tr><td>1478064387796242443</td><td>nate.dawgg</td><td></td><td>2026-03-02</td></tr><tr><td>1477046398754099456</td><td>nate.dawgg</td><td></td><td>2026-02-27</td></tr><tr><td>1476505929750155305</td><td>nate.dawgg</td><td></td><td>2026-02-26</td></tr><tr><td>1476303849030422670</td><td>nate.dawgg</td><td></td><td>2026-02-25</td></tr><tr><td>1476195818473263165</td><td>nate.dawgg</td><td></td><td>2026-02-25</td></tr><tr><td>1475827802887553054</td><td>nate.dawgg</td><td></td><td>2026-02-24</td></tr><tr><td>1475601140518359322</td><td>nate.dawgg</td><td></td><td>2026-02-23</td></tr><tr><td>1475601048742793400</td><td>nate.dawgg</td><td></td><td>2026-02-23</td></tr><tr><td>1473721117276373023</td><td>nate.dawgg</td><td>@DBuddy</td><td>2026-02-18</td></tr><tr><td>1473720714816393372</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-18</td></tr><tr><td>1473468411853148376</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468409684426845</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473468028950675577</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473468026882887823</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473455208284684320</td><td>DBuddy</td><td>Here is a file!</td><td>2026-02-17</td></tr><tr><td>1473455165708435556</td><td>DBuddy</td><td>Hi, from Solveit!</td><td>2026-02-17</td></tr><tr><td>1473452262922911961</td><td>nate.dawgg</td><td>howdy!</td><td>2026-02-17</td></tr></tbody></table>" |
490 | 487 | ], |
491 | 488 | "text/plain": [ |
492 | | - "[Message(id=1473468411853148376, author='DBuddy', content='Here is a file!'),\n", |
| 489 | + "[Message(id=1490061485593071666, author='DBuddy', content='Hi from SolveitAI! 👋'),\n", |
| 490 | + " Message(id=1483815592933720094, author='nate.dawgg', content=''),\n", |
| 491 | + " Message(id=1483812396307976363, author='nate.dawgg', content=''),\n", |
| 492 | + " Message(id=1481403515963183155, author='nate.dawgg', content=''),\n", |
| 493 | + " Message(id=1481022276089544834, author='nate.dawgg', content=''),\n", |
| 494 | + " Message(id=1478064387796242443, author='nate.dawgg', content=''),\n", |
| 495 | + " Message(id=1477046398754099456, author='nate.dawgg', content=''),\n", |
| 496 | + " Message(id=1476505929750155305, author='nate.dawgg', content=''),\n", |
| 497 | + " Message(id=1476303849030422670, author='nate.dawgg', content=''),\n", |
| 498 | + " Message(id=1476195818473263165, author='nate.dawgg', content=''),\n", |
| 499 | + " Message(id=1475827802887553054, author='nate.dawgg', content=''),\n", |
| 500 | + " Message(id=1475601140518359322, author='nate.dawgg', content=''),\n", |
| 501 | + " Message(id=1475601048742793400, author='nate.dawgg', content=''),\n", |
| 502 | + " Message(id=1473721117276373023, author='nate.dawgg', content='@DBuddy'),\n", |
| 503 | + " Message(id=1473720714816393372, author='DBuddy', content='Hi, from Solveit!'),\n", |
| 504 | + " Message(id=1473468411853148376, author='DBuddy', content='Here is a file!'),\n", |
493 | 505 | " Message(id=1473468409684426845, author='DBuddy', content='Hi, from Solveit!'),\n", |
494 | 506 | " Message(id=1473468028950675577, author='DBuddy', content='Here is a file!'),\n", |
495 | 507 | " Message(id=1473468026882887823, author='DBuddy', content='Hi, from Solveit!'),\n", |
|
499 | 511 | ] |
500 | 512 | }, |
501 | 513 | "execution_count": null, |
502 | | - "metadata": {}, |
| 514 | + "metadata": { |
| 515 | + "__type": "Messages" |
| 516 | + }, |
503 | 517 | "output_type": "execute_result" |
504 | 518 | } |
505 | 519 | ], |
506 | 520 | "source": [ |
507 | 521 | "await gld.search(after='2026-02-16')" |
508 | 522 | ] |
509 | 523 | }, |
| 524 | + { |
| 525 | + "cell_type": "markdown", |
| 526 | + "id": "cdd89759", |
| 527 | + "metadata": {}, |
| 528 | + "source": [ |
| 529 | + "Sometimes you need to search by name rather than snowflake ID. `find_member` searches the guild's members by username, nickname, or display name using Discord's member search endpoint, and returns the first match's user ID. This makes it easy to chain into `search`." |
| 530 | + ] |
| 531 | + }, |
| 532 | + { |
| 533 | + "cell_type": "code", |
| 534 | + "execution_count": null, |
| 535 | + "id": "44642992", |
| 536 | + "metadata": {}, |
| 537 | + "outputs": [], |
| 538 | + "source": [ |
| 539 | + "#| export\n", |
| 540 | + "@patch\n", |
| 541 | + "async def find_member(self:Guild, name):\n", |
| 542 | + " \"Search guild members by name/nick, return first match's user ID or None\"\n", |
| 543 | + " data = (await self.client._req( 'GET', f'/guilds/{self.id}/members/search',\n", |
| 544 | + " params={'query': name, 'limit': 1})).json()\n", |
| 545 | + " return data[0]['user']['id'] if data else None" |
| 546 | + ] |
| 547 | + }, |
| 548 | + { |
| 549 | + "cell_type": "code", |
| 550 | + "execution_count": null, |
| 551 | + "id": "aafd6bef", |
| 552 | + "metadata": {}, |
| 553 | + "outputs": [ |
| 554 | + { |
| 555 | + "data": { |
| 556 | + "text/html": [ |
| 557 | + "<table class=\"prose\"><thead><tr><th>ID</th><th>Author</th><th>Content</th><th>Date</th></tr></thead><tbody><tr><td>1483815592933720094</td><td>nate.dawgg</td><td></td><td>2026-03-18</td></tr><tr><td>1483812396307976363</td><td>nate.dawgg</td><td></td><td>2026-03-18</td></tr><tr><td>1481403515963183155</td><td>nate.dawgg</td><td></td><td>2026-03-11</td></tr><tr><td>1481022276089544834</td><td>nate.dawgg</td><td></td><td>2026-03-10</td></tr><tr><td>1478064387796242443</td><td>nate.dawgg</td><td></td><td>2026-03-02</td></tr></tbody></table>" |
| 558 | + ], |
| 559 | + "text/plain": [ |
| 560 | + "[Message(id=1483815592933720094, author='nate.dawgg', content=''),\n", |
| 561 | + " Message(id=1483812396307976363, author='nate.dawgg', content=''),\n", |
| 562 | + " Message(id=1481403515963183155, author='nate.dawgg', content=''),\n", |
| 563 | + " Message(id=1481022276089544834, author='nate.dawgg', content=''),\n", |
| 564 | + " Message(id=1478064387796242443, author='nate.dawgg', content='')]" |
| 565 | + ] |
| 566 | + }, |
| 567 | + "execution_count": null, |
| 568 | + "metadata": { |
| 569 | + "__type": "Messages" |
| 570 | + }, |
| 571 | + "output_type": "execute_result" |
| 572 | + } |
| 573 | + ], |
| 574 | + "source": [ |
| 575 | + "uid = await gld.find_member('nate')\n", |
| 576 | + "await gld.search(author_id=uid, limit=5)" |
| 577 | + ] |
| 578 | + }, |
| 579 | + { |
| 580 | + "cell_type": "markdown", |
| 581 | + "id": "8aae2813", |
| 582 | + "metadata": {}, |
| 583 | + "source": [ |
| 584 | + "The `members` property fetches all guild members and returns their display names, preferring server nickname over global display name over username. Note: this requires the **Server Members Intent** enabled in the Developer Portal (Bot → Privileged Gateway Intents)." |
| 585 | + ] |
| 586 | + }, |
| 587 | + { |
| 588 | + "cell_type": "code", |
| 589 | + "execution_count": null, |
| 590 | + "id": "eeaf8a6f", |
| 591 | + "metadata": {}, |
| 592 | + "outputs": [], |
| 593 | + "source": [ |
| 594 | + "#| export\n", |
| 595 | + "@patch(as_prop=True)\n", |
| 596 | + "async def members(self:Guild):\n", |
| 597 | + " \"List all guild members' display names (nick > global_name > username)\"\n", |
| 598 | + " data = (await self.client._req('GET', f'/guilds/{self.id}/members', params={'limit': 1000})).json()\n", |
| 599 | + " return [m.get('nick') or m['user'].get('global_name') or m['user']['username'] for m in data]" |
| 600 | + ] |
| 601 | + }, |
| 602 | + { |
| 603 | + "cell_type": "code", |
| 604 | + "execution_count": null, |
| 605 | + "id": "cdd2e812", |
| 606 | + "metadata": {}, |
| 607 | + "outputs": [ |
| 608 | + { |
| 609 | + "data": { |
| 610 | + "text/plain": [ |
| 611 | + "['nathan', 'SearchBuddy', 'DBuddy', 'Dizcord Util Bot', 'Search Agent']" |
| 612 | + ] |
| 613 | + }, |
| 614 | + "execution_count": null, |
| 615 | + "metadata": { |
| 616 | + "__type": "list" |
| 617 | + }, |
| 618 | + "output_type": "execute_result" |
| 619 | + } |
| 620 | + ], |
| 621 | + "source": [ |
| 622 | + "await gld.members" |
| 623 | + ] |
| 624 | + }, |
510 | 625 | { |
511 | 626 | "cell_type": "markdown", |
512 | 627 | "id": "89d2bbdd", |
|
0 commit comments