Skip to content

Commit aaa070e

Browse files
committed
add members utils
1 parent ef0a9a1 commit aaa070e

File tree

3 files changed

+159
-28
lines changed

3 files changed

+159
-28
lines changed

cordslite/_modidx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
'cordslite.core.Guild': ('core.html#guild', 'cordslite/core.py'),
6060
'cordslite.core.Guild.__repr__': ('core.html#guild.__repr__', 'cordslite/core.py'),
6161
'cordslite.core.Guild.channels': ('core.html#guild.channels', 'cordslite/core.py'),
62+
'cordslite.core.Guild.find_member': ('core.html#guild.find_member', 'cordslite/core.py'),
6263
'cordslite.core.Guild.members': ('core.html#guild.members', 'cordslite/core.py'),
6364
'cordslite.core.Guild.search': ('core.html#guild.search', 'cordslite/core.py'),
6465
'cordslite.core.Member': ('core.html#member', 'cordslite/core.py'),

cordslite/core.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,21 @@ async def search(self:Guild, content=None, author_id=None, channel_id=None, ment
139139
r = await self.client._req('GET', f'/guilds/{self.id}/messages/search', params=params)
140140
return Messages(Message(m[0], self.client) for m in r.json()['messages'])
141141

142+
# %% ../nbs/00_core.ipynb #44642992
143+
@patch
144+
async def find_member(self:Guild, name):
145+
"Search guild members by name/nick, return first match's user ID or None"
146+
data = (await self.client._req( 'GET', f'/guilds/{self.id}/members/search',
147+
params={'query': name, 'limit': 1})).json()
148+
return data[0]['user']['id'] if data else None
149+
150+
# %% ../nbs/00_core.ipynb #eeaf8a6f
151+
@patch(as_prop=True)
152+
async def members(self:Guild):
153+
"List all guild members' display names (nick > global_name > username)"
154+
data = (await self.client._req('GET', f'/guilds/{self.id}/members', params={'limit': 1000})).json()
155+
return [m.get('nick') or m['user'].get('global_name') or m['user']['username'] for m in data]
156+
142157
# %% ../nbs/00_core.ipynb #3fd1132c
143158
@patch
144159
async def send(self:Channel, content='', files=None):

nbs/00_core.ipynb

Lines changed: 143 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@
225225
]
226226
},
227227
"execution_count": null,
228-
"metadata": {},
228+
"metadata": {
229+
"__type": "Guild"
230+
},
229231
"output_type": "execute_result"
230232
}
231233
],
@@ -287,18 +289,21 @@
287289
{
288290
"data": {
289291
"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>"
291293
],
292294
"text/plain": [
293295
"[Channel(id=1327046393453613077, name='Text Channels', type=4),\n",
294296
" Channel(id=1327046393453613078, name='Voice Channels', type=4),\n",
295297
" Channel(id=1327046393453613079, name='general', type=0),\n",
296298
" 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)]"
298301
]
299302
},
300303
"execution_count": null,
301-
"metadata": {},
304+
"metadata": {
305+
"__type": "Channels"
306+
},
302307
"output_type": "execute_result"
303308
}
304309
],
@@ -319,7 +324,9 @@
319324
]
320325
},
321326
"execution_count": null,
322-
"metadata": {},
327+
"metadata": {
328+
"__type": "Channel"
329+
},
323330
"output_type": "execute_result"
324331
}
325332
],
@@ -355,19 +362,7 @@
355362
"execution_count": null,
356363
"id": "461bcb8b",
357364
"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": [],
371366
"source": [
372367
"#| export\n",
373368
"class Message(DiscordObject):\n",
@@ -422,18 +417,20 @@
422417
{
423418
"data": {
424419
"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>"
426421
],
427422
"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! 👋')]"
433428
]
434429
},
435430
"execution_count": null,
436-
"metadata": {},
431+
"metadata": {
432+
"__type": "Messages"
433+
},
437434
"output_type": "execute_result"
438435
}
439436
],
@@ -486,10 +483,25 @@
486483
{
487484
"data": {
488485
"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>"
490487
],
491488
"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",
493505
" Message(id=1473468409684426845, author='DBuddy', content='Hi, from Solveit!'),\n",
494506
" Message(id=1473468028950675577, author='DBuddy', content='Here is a file!'),\n",
495507
" Message(id=1473468026882887823, author='DBuddy', content='Hi, from Solveit!'),\n",
@@ -499,14 +511,117 @@
499511
]
500512
},
501513
"execution_count": null,
502-
"metadata": {},
514+
"metadata": {
515+
"__type": "Messages"
516+
},
503517
"output_type": "execute_result"
504518
}
505519
],
506520
"source": [
507521
"await gld.search(after='2026-02-16')"
508522
]
509523
},
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+
},
510625
{
511626
"cell_type": "markdown",
512627
"id": "89d2bbdd",

0 commit comments

Comments
 (0)