hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.06.16. 19:58



Jelenlévő felhasználók

Jelenleg 486 felhasználó van jelen :: 0 regisztrált, 0 rejtett és 486 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: nincs regisztrált felhasználó az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: LOGIN
HozzászólásElküldve: 2017.08.19. 20:41 
Offline
Tag

Csatlakozott: 2016.01.24. 15:04
Hozzászólások: 37
Megköszönték neki: 3 alkalommal
A fegyverskin rendszer nem fut alaata. blokkolja a /skinek /kes és mindet valaki bele tudja tenni ezt még?
Ez a skinrendszer az!
https://hlmod.hu/viewtopic.php?f=101&t=28010

register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /skinek", "skin_menu");
register_clcmd("say /kes", "kes_menu");
register_clcmd("say /ak47", "ak47_menu");
register_clcmd("say /m4a1", "m4a1_menu");
register_clcmd("say /awp", "awp_menu");
register_clcmd("say /deagle", "deagle_menu");
register_clcmd("say /m3", "m3_menu");
register_clcmd("say /glock", "glock_menu");
register_clcmd("say /usp", "usp_menu");
register_clcmd("say /famas", "famas_menu");
register_clcmd("say /galil", "galil_menu");
register_clcmd("say /scout", "scout_menu");
register_clcmd("say /mp5", "mp5_menu");
register_clcmd("say /m249", "m249_menu");
register_clcmd("say /mac10", "mac10_menu");
register_clcmd("say /xm1014", "xm1014_menu");
register_clcmd("say /tmp", "tmp_menu");

register_clcmd("say_team /skinek", "skin_menu");
register_clcmd("say_team /kes", "kes_menu");
register_clcmd("say_team /ak47", "ak47_menu");
register_clcmd("say_team /m4a1", "m4a1_menu");
register_clcmd("say_team /awp", "awp_menu");
register_clcmd("say_team /deagle", "deagle_menu");
register_clcmd("say_team /m3", "m3_menu");
register_clcmd("say_team /glock", "glock_menu");
register_clcmd("say_team /usp", "usp_menu");
register_clcmd("say_team /famas", "famas_menu");
register_clcmd("say_team /scout", "scout_menu");
register_clcmd("say_team /mp5", "mp5_menu");
register_clcmd("say_team /m249", "m249_menu");
register_clcmd("say_team /mac10", "mac10_menu");
register_clcmd("say_team /xm1014", "xm1014_menu");
register_clcmd("say_team /tmp", "tmp_menu");


----------------------------------------------------------------------------------------------
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cstrike>
  4. #include <colorchat>
  5.  
  6. #define PLUGIN "Admin Rendszer"
  7. #define VERSION "1.3"
  8. #define AUTHOR "K.O & DeRoiD"
  9.  
  10. new fh[32][33], jsz[32][33], jog[33], bfh[32][33], bjsz[32][33], irt[33], irt2[33], a_nap[33], a_honap[33], a_ev[33], belepve[33], ev2[32], honap2[32], nap2[32], jogok[32]
  11. new g_iTarget[33]
  12.  
  13. public plugin_init() {
  14.     register_plugin(PLUGIN, VERSION, AUTHOR)
  15.     register_clcmd("FELHASZNALO", "hasznalo")
  16.     register_clcmd("JELSZO", "szo")
  17.     register_clcmd("say /login", "admin_menu")
  18.     register_clcmd("Indok", "jelentok")
  19.     set_task(60.0, "hirdetes", 0, _, _, "b")
  20.     register_clcmd("say","handlesay")
  21.     register_clcmd("say_team","handlesay")
  22.     register_clcmd("say /rs", "fgv")
  23.  }
  24. public fgv(id)
  25. {
  26. // nullázod
  27. }
  28.  
  29. public hirdetes(id)
  30. {
  31.     ColorChat(id,GREEN,"[Mystic]^1 A Szerver Tulajdonosa Punciroka")
  32. }
  33.  
  34. public admin_menu(id) {
  35.     new cim[121], fhm[121], jszm[121]
  36.     format(cim, charsmax(cim), "\rMystic \wAdmin Rendszer")
  37.     new menu = menu_create(cim, "admin_menu_h" )
  38.     if(belepve[id] == 0){
  39.         if(irt[id] == 0)
  40.         format(fhm, charsmax(cim), "\rFelhasználĂł :")
  41.         else
  42.         format(fhm, charsmax(cim), "\rFelhasználĂł :\d %s",bfh[id])
  43.        
  44.         if(irt2[id] == 0)
  45.         format(jszm, charsmax(cim), "\rJelszĂł :^n")
  46.         else
  47.         format(jszm, charsmax(cim), "\rJelszĂł : \d%s^n", bjsz[id])
  48.     }
  49.     if(belepve[id] == 1){
  50.         if(jog[id] == 1){
  51.         menu_additem(menu,"\r[\wStátusz\r] : \y Tulajdonos","7",0)
  52.         format(fhm, charsmax(fhm), "\rJogok :\d abcdefghijklmnoqrstu")
  53.         }
  54.         else if(jog[id] == 2){
  55.         menu_additem(menu,"\r[\wStátusz\r] : \y Konfigos","7",0)
  56.         format(fhm, charsmax(fhm), "\rJogok :\d abcdefghijklmnoqrstu")
  57.         }
  58.         else if(jog[id] == 3){
  59.         menu_additem(menu,"\r[\wStátusz\r] : \y FĹ‘admin","7",0)
  60.         format(fhm, charsmax(fhm), "\rJogok :\d abcdefghijuklmn")
  61.         }
  62.         else if(jog[id] == 4){
  63.         menu_additem(menu,"\r[\wStátusz\r] : \y Moderátor","7",0)
  64.         format(fhm, charsmax(fhm), "\rJogok :\d bcdefjium")
  65.         }
  66.         else if(jog[id] == 5){
  67.         menu_additem(menu,"\r[\wStátusz\r] : \y Admin","7",0)
  68.         format(fhm, charsmax(fhm), "\rJogok :\d bcdefjium")
  69.         }
  70.         else if(jog[id] == 6){
  71.         menu_additem(menu,"\r[\wStátusz\r] : \y Ingyen Admin","7",0)
  72.         format(fhm, charsmax(fhm), "\rJogok :\d bcdefjium")
  73.         }
  74.         else if(jog[id] == 7){
  75.         menu_additem(menu,"\r[\wStátusz\r] : \y PrĂłbaidĹ‘","7",0)
  76.         format(fhm, charsmax(fhm), "\rJogok :\d z")
  77.         }
  78.         static honap[5], nap[5], ev[7]
  79.         format_time(honap, sizeof(honap) - 1, "%m")
  80.         format_time(nap, sizeof(nap) - 1, "%d")
  81.         format_time(ev, sizeof(ev) - 1, "%Y")
  82.         new jelenlegi_honap = str_to_num(honap)
  83.         new jelenlegi_nap = str_to_num(nap)
  84.         new jelenlegi_ev = str_to_num(ev)
  85.         if(jog[id] == 7 && a_ev[id] == jelenlegi_ev && a_honap[id] == jelenlegi_honap && a_nap[id]-jelenlegi_nap < 4)
  86.         format(jszm, charsmax(cim), "\rProba idĹ‘ lejárás napja : \r%d.%d.%d^n", a_ev[id], a_honap[id], a_nap[id])
  87.         else if(jog[id] == 7 && a_ev[id] == jelenlegi_ev && a_honap[id] == jelenlegi_honap && a_nap[id]-jelenlegi_nap >= 3)
  88.         format(jszm, charsmax(cim), "\rProba idĹ‘ lejárás napja : \y%d.%d.%d^n", a_ev[id], a_honap[id], a_nap[id])
  89.         else if(jog[id] != 7 && a_ev[id] == jelenlegi_ev && a_honap[id] == jelenlegi_honap && a_nap[id]-jelenlegi_nap < 4)
  90.         format(jszm, charsmax(cim), "\rLejárás napja : \r%d.%d.%d^n", a_ev[id], a_honap[id], a_nap[id])
  91.         else
  92.         format(jszm, charsmax(cim), "\rLejárás napja : \y%d.%d.%d^n", a_ev[id], a_honap[id], a_nap[id])
  93.        
  94.     }
  95.     if(belepve[id] == 0){
  96.         menu_additem(menu,fhm, "1",0)
  97.         menu_additem(menu,jszm, "2",0)
  98.     }
  99.     if(belepve[id] == 1){
  100.         menu_additem(menu,fhm, "-1",0)
  101.         menu_additem(menu,jszm, "-1",0)
  102.     }
  103.     if(belepve[id] == 1 && jog[id] != 7)
  104.     {
  105.     menu_additem(menu,"\yAdmin menĂĽ","4",0)
  106.     menu_additem(menu,"\ySzabályazat","5",0)
  107.     menu_additem(menu,"\yAlap Parancsok^n","6",0)
  108.     }
  109.     else if(belepve[id] == 1) {
  110.     menu_additem(menu,"\yJelentĂ©s","8",0)
  111.     menu_additem(menu,"\ySzabályazat","5",0)
  112.     menu_additem(menu,"\yAlap Parancsok^n","6",0)
  113.     }
  114.     if(belepve[id] == 1)
  115.     menu_additem(menu,"KijelenkezĂ©s", "0",0)
  116.     else
  117.     menu_additem(menu,"BejelenkezĂ©s","3",0)
  118.     menu_display(id, menu)
  119.     return PLUGIN_HANDLED
  120.    
  121. }
  122. public admin_menu_h(id, menu, item)
  123.     {
  124.     if( item == MENU_EXIT )
  125.     {
  126.     menu_destroy(menu);
  127.     return PLUGIN_HANDLED;
  128.     }
  129.     new data[9], szName[64];
  130.     new access, callback;
  131.     menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
  132.     new key = str_to_num(data);
  133.  
  134.     switch(key)
  135.     {
  136.         case -1: admin_menu(id)
  137.         case 0:{
  138.             remove_user_flags(id)
  139.             belepve[id] = 0
  140.             irt[id] = 0
  141.             irt2[id] = 0
  142.             ColorChat(id,GREEN,"[Mystic]^1 Sikeresen kilĂ©ptĂ©l!")
  143.             admin_menu(id)
  144.         }
  145.         case 1: {
  146.             client_cmd(id, "messagemode FELHASZNALO")
  147.         }
  148.         case 2: {
  149.             client_cmd(id, "messagemode JELSZO")
  150.         }
  151.         case 3: {
  152.             if(equal(bfh[id], fh[id]) && equal(bjsz[id], jsz[id]))
  153.             {
  154.                 static honap[5], nap[5], ev[7]
  155.                 format_time(honap, sizeof(honap) - 1, "%m")
  156.                 format_time(nap, sizeof(nap) - 1, "%d")
  157.                 format_time(ev, sizeof(ev) - 1, "%Y")
  158.                 new jelenlegi_honap = str_to_num(honap)
  159.                 new jelenlegi_nap = str_to_num(nap)
  160.                 new jelenlegi_ev = str_to_num(ev)
  161.                 if(a_ev[id] < jelenlegi_ev || a_ev[id] == jelenlegi_ev && a_honap[id] < jelenlegi_honap || a_ev[id] == jelenlegi_ev && a_honap[id] == jelenlegi_honap && a_nap[id] < jelenlegi_nap)
  162.                 {
  163.                     ColorChat(id,RED,"[Mystic] Az admin lejárt ^1 %d.%d.%d!", a_ev[id], a_honap[id], a_nap[id])
  164.                     admin_menu(id)
  165.                 }
  166.                 else
  167.                 {
  168.                     bfh[id] = ""
  169.                     bjsz[id] = ""
  170.                     ColorChat(id,GREEN,"[Mystic]^1 Sikeresen belĂ©ptĂ©l!")
  171.                     if(jog[id] == 1)
  172.                     set_user_flags(id, read_flags("abcdefghijklmnoqrstu"))
  173.                     if(jog[id] == 2)
  174.                     set_user_flags(id, read_flags("abcdefghijklmnoqrstu"))
  175.                     if(jog[id] == 3)
  176.                     set_user_flags(id, read_flags("abcdefghijuklmn"))
  177.                     if(jog[id] == 4)
  178.                     set_user_flags(id, read_flags("bcdefjium"))
  179.                     if(jog[id] == 5)
  180.                     set_user_flags(id, read_flags("bcdefjium"))
  181.                     if(jog[id] == 6)
  182.                     set_user_flags(id, read_flags("bcdefjium"))
  183.                     if(jog[id] == 7)
  184.                     set_user_flags(id, read_flags("z"))
  185.                     belepve[id] = 1
  186.                     admin_menu(id)
  187.                 }
  188.             }
  189.             else
  190.             {
  191.                 bfh[id] = ""
  192.                 bjsz[id] = ""
  193.                 ColorChat(id,GREEN,"[Mystic]^1 Rossz jelszĂł!")
  194.                 admin_menu(id)
  195.             }
  196.         }
  197.         case 4:
  198.             {
  199.             client_cmd(id, ";^"amxmodmenu^"")
  200.             }
  201.         case 5:
  202.             {
  203.             show_motd(id,"addons/amxmodx/configs/szabalyzat.txt","Admin Szabályazat")
  204.             }
  205.         case 6:
  206.             {
  207.             show_motd(id,"addons/amxmodx/configs/parancsok.txt","Admin Parancsok")
  208.             }
  209.         case 7:
  210.             {
  211.             admin_menu(id)
  212.             }
  213.         case 8:
  214.             {
  215.             jelent(id)
  216.             }
  217.     }
  218.     menu_destroy(menu)
  219.     return PLUGIN_HANDLED
  220. }
  221.  
  222. public jelent(id)
  223. {
  224.     new jelentmenu[256]
  225.     formatex(jelentmenu, charsmax(jelentmenu), "\rMystic \wCsalĂł JelentĂ©se");
  226.  
  227.     new menu = menu_create(jelentmenu, "jelenth")
  228.  
  229.     new players[32], num
  230.     new szName[32], szTempid[32]
  231.  
  232.     get_players(players, num, "ach")
  233.  
  234.     for(new i; i < num; i++)
  235.     {
  236.         get_user_name(players[i], szName, charsmax(szName))
  237.  
  238.         num_to_str(get_user_userid(players[i]), szTempid, charsmax(szTempid))
  239.  
  240.         menu_additem(menu, szName, szTempid, 0)
  241.     }
  242.     menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
  243.     menu_setprop(menu, MPROP_BACKNAME, "Vissza");
  244.     menu_setprop(menu, MPROP_NEXTNAME, "KövetkezĹ‘");
  245.     menu_setprop(menu, MPROP_EXITNAME, "KilĂ©pĂ©s");
  246.     menu_display(id, menu)
  247. }
  248.  
  249. public jelenth(id, menu, item)
  250. {
  251.     if(item == MENU_EXIT)
  252.     {
  253.         menu_destroy(menu)
  254.         return PLUGIN_HANDLED
  255.     }
  256.  
  257.     new szData[6], szName[64], iAccess, iCallback
  258.     menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback)
  259.  
  260.     g_iTarget[id] = find_player("k", str_to_num(szData))
  261.  
  262.     client_cmd(id, "messagemode Indok")
  263.  
  264.     menu_destroy(menu)
  265.     return PLUGIN_HANDLED
  266. }
  267.  
  268. public jelentok(id)
  269. {
  270.     new indok[300]
  271.     read_args(indok, charsmax(indok))
  272.     remove_quotes(indok)
  273.  
  274.     if(!strlen(indok))
  275.         return PLUGIN_HANDLED
  276.  
  277.     new kuldo[32], jelentett[32]
  278.     get_user_name(id, kuldo, charsmax(kuldo))
  279.     get_user_name(g_iTarget[id], jelentett, charsmax(jelentett))
  280.     log_to_file( "jelentesek.ini", "!g[Mystic] %s jelentette %s-t. Indok: %s", kuldo, jelentett, indok);
  281.  
  282.     new players[32], num, id
  283.     get_players(players, num, "c")
  284.  
  285.     for( new i; i< num; i++ )
  286.     {
  287.     id = players[i]
  288.     if(get_user_flags(id) & ADMIN_KICK)
  289.     {
  290.     ColorChat(id,GREEN,"[Mystic]^3 %s ^1jelentette^4 %s^1-t. Indok: ^4%s", kuldo, jelentett, indok)
  291.     }
  292.     }
  293.     return PLUGIN_CONTINUE
  294. }
  295.  
  296. public client_connect(id)
  297. {
  298.     bfh[id] = ""
  299.     bjsz[id] = ""
  300.     belepve[id] = 0
  301.     irt[id] = 0
  302.     irt2[id] = 0
  303.     jog[id] = 1
  304.     admin_tolt(id)
  305. }
  306. public admin_tolt(id) {
  307.     new fajl[64]
  308.     formatex(fajl, charsmax(fajl), "addons/amxmodx/configs/admins/admin.ini")
  309.    
  310.     new file
  311.    
  312.     file = fopen(fajl, "r")
  313.    
  314.     if(file)
  315.     {
  316.         new sor = file_size(fajl, 1)
  317.         new buff[256], len
  318.         for(new i; i < sor; i++)
  319.         {
  320.             read_file(fajl, i, buff, charsmax(buff), len)
  321.             parse(buff, fh[id], 31, jsz[id], 31, jogok, 31, ev2, 31, honap2, 31, nap2, 31)
  322.             if(equal(bfh[id], fh[id]))
  323.             {
  324.                 jog[id] = str_to_num(jogok)
  325.                 a_honap[id] = str_to_num(honap2)
  326.                 a_nap[id] = str_to_num(nap2)
  327.                 a_ev[id] = str_to_num(ev2)
  328.                 return
  329.             }
  330.         }
  331.     }
  332.    
  333.     fclose(file)
  334. }
  335. public hasznalo(id)
  336. {
  337.     new adat[32]
  338.     read_args(adat, charsmax(adat))
  339.     remove_quotes(adat)
  340.     if(equal(adat, ""))
  341.         return PLUGIN_HANDLED
  342.    
  343.     bfh[id] = adat
  344.     irt[id] = 1
  345.     admin_tolt(id)
  346.     admin_menu(id)
  347.     return PLUGIN_HANDLED
  348. }
  349. public szo(id)
  350. {
  351.     new adat[32]
  352.     read_args(adat, charsmax(adat))
  353.     remove_quotes(adat)
  354.     if(equal(adat, ""))
  355.         return PLUGIN_HANDLED
  356.    
  357.     bjsz[id] = adat
  358.     irt2[id] = 1
  359.     admin_menu(id)
  360.     return PLUGIN_HANDLED
  361. }
  362.  
  363. public handlesay(id)
  364. {
  365.     new message[192], Name[32], none[2][32], chat[192], rang[32]
  366.     read_args(message, 191)
  367.     remove_quotes(message)
  368.    
  369.     formatex(none[0], 31, ""), formatex(none[1], 31, " ")
  370.    
  371.     if (message[0] == '@' || message[0] == '/' || message[0] == '#' || message[0] == '!' || equal (message, ""))
  372.         return PLUGIN_HANDLED;
  373.    
  374.     if(!equali(message, none[0]) && !equali(message, none[1]))
  375.     {
  376.         get_user_name(id, Name, 31);
  377.         if(jog[id] == 1)
  378.         rang = "TULAJDONOS"
  379.         else if(jog[id] == 2)
  380.         rang = "KONFIGOS"
  381.         else if(jog[id] == 3)
  382.         rang = "FŐADMIN"
  383.         else if(jog[id] == 4)
  384.         rang = "MODERÁTOR"
  385.         else if(jog[id] == 5)
  386.         rang = "ADMIN"
  387.         else if(jog[id] == 6)
  388.         rang = "INGYEN ADMIN"
  389.         else if(jog[id] == 7)
  390.         rang = "PRĂ“BAIDŐ"
  391.         if(belepve[id] == 1)
  392.         {
  393.             formatex(chat, 191, "^4[%s]^3%s^1 :^1 %s",rang, Name, message)
  394.         }
  395.         else
  396.             formatex(chat, 191, "^4[JÁTÉKOS]^3%s^1 :^1 %s",Name, message)
  397.        
  398.        
  399.             switch(cs_get_user_team(id))
  400.             {
  401.             case 1: ColorChat(0, RED, chat)
  402.             case 2: ColorChat(0, BLUE, chat)
  403.         }
  404.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)
  405.             ColorChat(0, GREY, chat)
  406.         return PLUGIN_HANDLED
  407.     }
  408.     return PLUGIN_CONTINUE
  409. }
  410.  
  411. stock print_color(const id, const input[], any:...)
  412. {
  413.         new count = 1, players[32]
  414.         static msg[191]
  415.         vformat(msg, 190, input, 3)
  416.  
  417.         replace_all(msg, 190, "!g", "^4")
  418.         replace_all(msg, 190, "!y", "^1")
  419.         replace_all(msg, 190, "!t", "^3")
  420.         replace_all(msg, 190, "á", "á")
  421.         replace_all(msg, 190, "Ă©", "Ă©")
  422.         replace_all(msg, 190, "Ă­", "Ă­")
  423.         replace_all(msg, 190, "Ăł", "Ä‚Ĺ‚")
  424.         replace_all(msg, 190, "ö", "ö")
  425.         replace_all(msg, 190, "Ĺ‘", "Ĺ‘")
  426.         replace_all(msg, 190, "Ăş", "Ä‚Ĺź")
  427.         replace_all(msg, 190, "ĂĽ", "Ä‚Ä˝")
  428.         replace_all(msg, 190, "ű", "ű")
  429.         replace_all(msg, 190, "Á", "Á")
  430.         replace_all(msg, 190, "É", "É")
  431.         replace_all(msg, 190, "ĂŤ", "ĂŤ")
  432.         replace_all(msg, 190, "Ă“", "Ă“")
  433.         replace_all(msg, 190, "Ă–", "Ă–")
  434.         replace_all(msg, 190, "Ő", "Ő")
  435.         replace_all(msg, 190, "Ăš", "Ăš")
  436.         replace_all(msg, 190, "Ăś", "Ä‚Ĺ›")
  437.         replace_all(msg, 190, "Ĺ°", "Ĺ°")        
  438.  
  439.         if (id) players[0] = id; else get_players(players, count, "ch")
  440.         {
  441.                 for (new i = 0; i < count; i++)
  442.                 {
  443.                         if (is_user_connected(players[i]))
  444.                         {
  445.                                 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
  446.                                 write_byte(players[i])
  447.                                 write_string(msg)
  448.                                 message_end()
  449.                         }
  450.                 }
  451.         }
  452.         return PLUGIN_HANDLED
  453. }


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: LOGIN
HozzászólásElküldve: 2017.08.19. 22:59 
Offline
Jómunkásember
Avatar

Csatlakozott: 2013.01.15. 19:04
Hozzászólások: 407
Megköszönt másnak: 17 alkalommal
Megköszönték neki: 176 alkalommal
Az Admin rendszer legyen az utolsó plugin a plugins.ini-ben.


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 2 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 122 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole