@@ -25,15 +25,31 @@ async def send_log(member):
2525def format_join_leave (template : str , member : discord .Member ):
2626 """Formats join leave message templates
2727 {guild} = guild name
28- {user} = user's name plus discriminator ex. SnowPlow#5196
29- {user_name} = user's name without discriminator
28+ {user} = user's name
3029 {user_mention} = user's mention
3130 {user_id} = user's ID
3231 """
3332 template = template or "{user_mention}\n {user} ({user_id})"
34- return template .format (guild = member .guild , user = str (member ), user_name = member .name ,
35- user_mention = member .mention , user_id = member .id )
3633
34+ subst = [("{guild}" , member .guild .name ),
35+ ("{user}" , member ),
36+ ("{user_mention}" , member .mention ),
37+ ("{user_id}" , member .id )]
38+
39+ def helper (s : str , subst : list ):
40+ if not subst :
41+ # base case: return self
42+ return s
43+ cur = subst [0 ]
44+ # split the current string on cur[0].
45+ # for each split segment call the helper on the rest of the substitutions.
46+ # then rejoin on the substitutions (this avoids the substituted values from matching substitution keywords)
47+
48+ # we could make this not recursive but there's an O(1) number of possible recursions anyway
49+ # recursion depth is limited to 5 since the subst list is limited
50+ # breadth is limited by template size (indirectly limited by discord message size)
51+ return str (cur [1 ]).join ([helper (bit , subst [1 :]) for bit in s .split (cur [0 ])])
52+ return helper (template , subst )
3753
3854class CustomJoinLeaveMessages (db .DatabaseTable ):
3955 """Holds custom join leave messages"""
0 commit comments