payload: {"action":"created","issue":{"url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/819","repository_url":"https://api.github.com/repos/alliedmodders/sourcemod","labels_url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/819/labels{/name}","comments_url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/819/comments","events_url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/819/events","html_url":"https://github.com/alliedmodders/sourcemod/pull/819","id":326706777,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkwNzIzNzgz","number":819,"title":"Add base CommandIterator implementation","user":{"login":"Headline","id":11095737,"node_id":"MDQ6VXNlcjExMDk1NzM3","avatar_url":"https://avatars0.githubusercontent.com/u/11095737?v=4","gravatar_id":"","url":"https://api.github.com/users/Headline","html_url":"https://github.com/Headline","followers_url":"https://api.github.com/users/Headline/followers","following_url":"https://api.github.com/users/Headline/following{/other_user}","gists_url":"https://api.github.com/users/Headline/gists{/gist_id}","starred_url":"https://api.github.com/users/Headline/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Headline/subscriptions","organizations_url":"https://api.github.com/users/Headline/orgs","repos_url":"https://api.github.com/users/Headline/repos","events_url":"https://api.github.com/users/Headline/events{/privacy}","received_events_url":"https://api.github.com/users/Headline/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2018-05-26T03:42:40Z","updated_at":"2019-07-12T12:45:49Z","closed_at":"2018-07-10T21:39:32Z","author_association":"MEMBER","pull_request":{"url":"https://api.github.com/repos/alliedmodders/sourcemod/pulls/819","html_url":"https://github.com/alliedmodders/sourcemod/pull/819","diff_url":"https://github.com/alliedmodders/sourcemod/pull/819.diff","patch_url":"https://github.com/alliedmodders/sourcemod/pull/819.patch"},"body":"Closes #742 \r\n\r\nEssentially this adds a methodmap for the existing command iterator, but in the more accepted iteration style that we're using nowadays which allows us to add more info as we see fit, without breaking older plugins. Related to this, I also added an `IPlugin*` to `ConCmdInfo` so we're able to track which plugin made what command, and this plugin handle is exposed through the iterator. \r\n\r\nMy test script for this PR is as follows\r\n```\r\npublic void OnPluginStart()\r\n{\r\n\tCommandIterator it = new CommandIterator();\r\n\t\r\n\twhile (it.Next())\r\n\t{\r\n\t\tchar name[128];\r\n\t\tit.GetName(name, sizeof(name));\r\n\t\tchar desc[128];\r\n\t\tit.GetDescription(desc, sizeof(desc));\r\n\t\t\r\n\t\tint flags = it.Flags;\r\n\t\tchar plugin[128];\t\t\r\n\t\tGetPluginFilename(it.Plugin, plugin, sizeof(plugin));\r\n\t\tPrintToServer(\"%s - %s (created by %s) - flagbits: %08b\", name, desc, plugin, flags);\r\n\t}\r\n}\r\n```\r\n\r\n\r\nAnd the beautiful output given can be seen here\r\n\r\n```\r\nsm plugins load test\r\nff -  (created by basetriggers.smx) - flagbits: 00000000\r\nlistmaps -  (created by nextmap.smx) - flagbits: 00000000\r\nmotd -  (created by basetriggers.smx) - flagbits: 00000000\r\nnextmap -  (created by basetriggers.smx) - flagbits: 00000000\r\nsm_abortban - sm_abortban (created by basebans.smx) - flagbits: 00000000\r\nsm_addban - sm_addban <time> <steamid> [reason] (created by basebans.smx) - flagbits: 00000000\r\nsm_addweapon - A command to add map weapons (created by hl_weaponspawner.smx) - flagbits: 00100000\r\nsm_addweapons - A command to add map weapons (created by hl_weaponspawner.smx) - flagbits: 00100000\r\nsm_admin - Displays the admin menu (created by adminmenu.smx) - flagbits: 00000010\r\nsm_ban - sm_ban <#userid|name> <minutes|0> [reason] (created by basebans.smx) - flagbits: 00001000\r\nsm_banip - sm_banip <ip|#userid|name> <time> [reason] (created by basebans.smx) - flagbits: 00001000\r\nsm_beacon - sm_beacon <#userid|name> [0/1] (created by funcommands.smx) - flagbits: 00100000\r\nsm_blind - sm_blind <#userid|name> [amount] - Leave amount off to reset. (created by funcommands.smx) - flagbits: 00100000\r\nsm_burn - sm_burn <#userid|name> [time] (created by funcommands.smx) - flagbits: 00100000\r\nsm_cancelvote - sm_cancelvote (created by basecommands.smx) - flagbits: 00000000\r\nsm_chat - sm_chat <message> - sends message to admins (created by basechat.smx) - flagbits: 00000000\r\nsm_cookies - sm_cookies <name> [value] (created by clientprefs.smx) - flagbits: 00000000\r\nsm_csay - sm_csay <message> - sends centered message to all players (created by basechat.smx) - flagbits: 00000000\r\nsm_cvar - sm_cvar <cvar> [value] (created by basecommands.smx) - flagbits: 10000000\r\nsm_drug - sm_drug <#userid|name> [0/1] (created by funcommands.smx) - flagbits: 00100000\r\nsm_execcfg - sm_execcfg <filename> (created by basecommands.smx) - flagbits: 00000000\r\nsm_firebomb - sm_firebomb <#userid|name> [0/1] (created by funcommands.smx) - flagbits: 00100000\r\nsm_freeze - sm_freeze <#userid|name> [time] (created by funcommands.smx) - flagbits: 00100000\r\nsm_freezebomb - sm_freezebomb <#userid|name> [0/1] (created by funcommands.smx) - flagbits: 00100000\r\nsm_gag - sm_gag <player> - Removes a player's ability to use chat. (created by basecomm.smx) - flagbits: 00000000\r\nsm_gravity - sm_gravity <#userid|name> [amount] - Leave amount off to reset. Amount is 0.0 through 5.0 (created by funcommands.smx) - flagbits: 00100000\r\nsm_help - Displays SourceMod commands and descriptions (created by adminhelp.smx) - flagbits: 00000000\r\nsm_hsay - sm_hsay <message> - sends hint message to all players (created by basechat.smx) - flagbits: 00000000\r\nsm_kick - sm_kick <#userid|name> [reason] (created by basecommands.smx) - flagbits: 00000100\r\nsm_map - sm_map <map> (created by basecommands.smx) - flagbits: 01000000\r\nsm_maphistory - Shows the most recent maps played (created by nextmap.smx) - flagbits: 01000000\r\nsm_msay - sm_msay <message> - sends message as a menu panel (created by basechat.smx) - flagbits: 00000000\r\nsm_mute - sm_mute <player> - Removes a player's ability to use voice. (created by basecomm.smx) - flagbits: 00000000\r\nsm_noclip - sm_noclip <#userid|name> (created by funcommands.smx) - flagbits: 00100000\r\nsm_play - sm_play <#userid|name> <filename> (created by sounds.smx) - flagbits: 00000010\r\nsm_psay - sm_psay <name or #userid> <message> - sends private message (created by basechat.smx) - flagbits: 00000000\r\nsm_rcon - sm_rcon <args> (created by basecommands.smx) - flagbits: 00000000\r\nsm_reloadadmins - sm_reloadadmins (created by basecommands.smx) - flagbits: 00001000\r\nsm_rename - sm_rename <#userid|name> (created by playercommands.smx) - flagbits: 00100000\r\nsm_resetcvar - sm_resetcvar <cvar> (created by basecommands.smx) - flagbits: 10000000\r\nsm_revote -  (created by basecommands.smx) - flagbits: 00000000\r\nsm_say - sm_say <message> - sends message to all players (created by basechat.smx) - flagbits: 00000000\r\nsm_searchcmd - Searches SourceMod commands (created by adminhelp.smx) - flagbits: 00000000\r\nsm_settings -  (created by clientprefs.smx) - flagbits: 00000000\r\nsm_silence - sm_silence <player> - Removes a player's ability to use voice or chat. (created by basecomm.smx) - flagbits: 00000000\r\nsm_slap - sm_slap <#userid|name> [damage] (created by playercommands.smx) - flagbits: 00100000\r\nsm_slay - sm_slay <#userid|name> (created by playercommands.smx) - flagbits: 00100000\r\nsm_timebomb - sm_timebomb <#userid|name> [0/1] (created by funcommands.smx) - flagbits: 00100000\r\nsm_tsay - sm_tsay [color] <message> - sends top-left message to all players (created by basechat.smx) - flagbits: 00000000\r\nsm_unban - sm_unban <steamid|ip> (created by basebans.smx) - flagbits: 00010000\r\nsm_ungag - sm_ungag <player> - Restores a player's ability to use chat. (created by basecomm.smx) - flagbits: 00000000\r\nsm_unmute - sm_unmute <player> - Restores a player's ability to use voice. (created by basecomm.smx) - flagbits: 00000000\r\nsm_unsilence - sm_unsilence <player> - Restores a player's ability to use voice and chat. (created by basecomm.smx) - flagbits: 00000000\r\nsm_vote - sm_vote <question> [Answer1] [Answer2] ... [Answer5] (created by basevotes.smx) - flagbits: 00000000\r\nsm_votealltalk - sm_votealltalk (created by funvotes.smx) - flagbits: 00000000\r\nsm_voteban - sm_voteban <player> [reason] (created by basevotes.smx) - flagbits: 00001000\r\nsm_voteburn - sm_voteburn <player> (created by funvotes.smx) - flagbits: 00100000\r\nsm_voteff - sm_voteff (created by funvotes.smx) - flagbits: 00000000\r\nsm_votegravity - sm_votegravity <amount> [amount2] ... [amount5] (created by funvotes.smx) - flagbits: 00000000\r\nsm_votekick - sm_votekick <player> [reason] (created by basevotes.smx) - flagbits: 00000100\r\nsm_votemap - sm_votemap <mapname> [mapname2] ... [mapname5]  (created by basevotes.smx) - flagbits: 01000000\r\nsm_voteslay - sm_voteslay <player> (created by funvotes.smx) - flagbits: 00100000\r\nsm_who - sm_who [#userid|name] (created by basecommands.smx) - flagbits: 00000010\r\n[SM] Loaded plugin test.smx successfully.\r\n```"},"comment":{"url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/comments/510873003","html_url":"https://github.com/alliedmodders/sourcemod/pull/819#issuecomment-510873003","issue_url":"https://api.github.com/repos/alliedmodders/sourcemod/issues/819","id":510873003,"node_id":"MDEyOklzc3VlQ29tbWVudDUxMDg3MzAwMw==","user":{"login":"InvexByte","id":25399962,"node_id":"MDQ6VXNlcjI1Mzk5OTYy","avatar_url":"https://avatars0.githubusercontent.com/u/25399962?v=4","gravatar_id":"","url":"https://api.github.com/users/InvexByte","html_url":"https://github.com/InvexByte","followers_url":"https://api.github.com/users/InvexByte/followers","following_url":"https://api.github.com/users/InvexByte/following{/other_user}","gists_url":"https://api.github.com/users/InvexByte/gists{/gist_id}","starred_url":"https://api.github.com/users/InvexByte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/InvexByte/subscriptions","organizations_url":"https://api.github.com/users/InvexByte/orgs","repos_url":"https://api.github.com/users/InvexByte/repos","events_url":"https://api.github.com/users/InvexByte/events{/privacy}","received_events_url":"https://api.github.com/users/InvexByte/received_events","type":"User","site_admin":false},"created_at":"2019-07-12T12:45:49Z","updated_at":"2019-07-12T12:45:49Z","author_association":"CONTRIBUTOR","body":"Late but nice work @Headline 👍 "}}
other: {"actor":{"display_login":"InvexByte"}}