Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.31 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <sockets>
  4. #include <ApolloRP>
  5. #include <ApolloRP_Chat>
  6.  
  7. //new g_Treasuries[3]
  8.  
  9. //#define DEBUG
  10.  
  11. new p_UpdateTime
  12.  
  13. new g_File[] = "stocks.ini"
  14. new g_WriteFile[] = "stocks.txt"
  15.  
  16. new TravTrie:g_Tickers
  17.  
  18. new g_Socket
  19.  
  20. new g_Buffer[4096]
  21.  
  22. new g_NPC
  23.  
  24. new g_StockOptionsMenu
  25. new g_TradeMenu
  26. new g_NumberMenu
  27.  
  28. new g_Mode[33]
  29.  
  30. new g_Ticker[33][12]
  31.  
  32. new g_MarketClosed
  33.  
  34. new g_BlackBerry
  35.  
  36. new g_NumChecks
  37.  
  38. public ARP_Init()
  39. {
  40.     ARP_RegisterPlugin("Stock Mod","1.0","Hawk552","Allows players to make investments")
  41.    
  42.     ARP_RegisterCmd("arp_stockquote","CmdStockQuote","(ADMIN) Updates and prints current stock status")
  43.    
  44.     p_UpdateTime = register_cvar("arp_stock_updatetime","300")
  45.    
  46.     set_task(get_pcvar_float(p_UpdateTime),"UpdateStocks")
  47.    
  48.     g_StockOptionsMenu = menu_create("Stock Options","StockOptionsHandler")
  49.     menu_additem(g_StockOptionsMenu,"Buy")
  50.     menu_additem(g_StockOptionsMenu,"Sell")
  51.     menu_additem(g_StockOptionsMenu,"Current Quotes")
  52.    
  53.     //g_TradeMenu = menu_create("Trade Menu","TradeMenuHandle")
  54.    
  55.     g_NumberMenu = menu_create("Trade Number","TradeNumberHandle")
  56.     menu_additem(g_NumberMenu,"1")
  57.     menu_additem(g_NumberMenu,"5")
  58.     menu_additem(g_NumberMenu,"10")
  59.     menu_additem(g_NumberMenu,"20")
  60.     menu_additem(g_NumberMenu,"50")
  61.     menu_additem(g_NumberMenu,"100")
  62.     menu_additem(g_NumberMenu,"1000")
  63.    
  64.     ARP_AddChat(_,"CmdSay")
  65.     ARP_AddCommand("say /quote <# to start at or ticker symbol>","Allows you to check stocks")
  66. }
  67.  
  68. public CmdSay(id)
  69. {
  70.     new Args[256]
  71.     read_args(Args,255)
  72.    
  73.     remove_quotes(Args)
  74.    
  75.     if(!equali(Args,"/quote",5))
  76.         return PLUGIN_CONTINUE
  77.    
  78.     new Index,Body
  79.     get_user_aiming(id,Index,Body,300)
  80.    
  81.     if(Index != g_NPC && !ARP_GetUserItemNum(id,g_BlackBerry))
  82.     {
  83.         client_print(id,print_chat,"[ARP] You are not looking at the investment broker.")
  84.         return PLUGIN_HANDLED
  85.     }
  86.    
  87.     replace(Args,255,"/quote","")
  88.    
  89.     remove_quotes(Args)
  90.     trim(Args)
  91.    
  92.     if(!strlen(Args))
  93.         ShowCurrentQuote(id,0)
  94.    
  95.     if(is_str_num(Args)) ShowCurrentQuote(id,str_to_num(Args))
  96.     else
  97.     {
  98.         new travTrieIter:Iter = GetTravTrieIterator(g_Tickers),Ticker[12],Value[64],Company[64],Stock[10]
  99.         while(MoreTravTrie(Iter))
  100.         {
  101.             ReadTravTrieKey(Iter,Ticker,11)
  102.             ReadTravTrieString(Iter,Value,63)
  103.            
  104.             strtok(Value,Company,63,Stock,9,'|')
  105.            
  106.             if(equali(Args,Ticker))
  107.             {
  108.                 client_print(id,print_chat,"[ARP] %s (%s) is currently trading at $%s.",Company,Ticker,Stock)
  109.                 DestroyTravTrieIterator(Iter)
  110.                 return PLUGIN_HANDLED
  111.             }
  112.         }
  113.         DestroyTravTrieIterator(Iter)
  114.        
  115.         client_print(id,print_chat,"[ARP] No ticker was found with that name.")
  116.     }
  117.    
  118.     return PLUGIN_HANDLED
  119. }
  120.  
  121. public UpdateStocks()
  122. {
  123.     UpdateInfo()
  124.    
  125.     set_task(get_pcvar_float(p_UpdateTime),"UpdateStocks")
  126. }
  127.  
  128. public plugin_end()
  129. {
  130.     TravTrieDestroy(g_Tickers)
  131.     menu_destroy(g_StockOptionsMenu)
  132.     menu_destroy(g_TradeMenu)
  133.     menu_destroy(g_NumberMenu)
  134. }
  135.  
  136. public CmdStockQuote(id)
  137. {
  138.     if(!ARP_AdminAccess(id))
  139.     {
  140.         console_print(id,"You do not have access to this command")
  141.         return PLUGIN_HANDLED
  142.     }
  143.    
  144.     UpdateInfo()
  145.    
  146.     console_print(id,"Stock values have been updated")
  147.    
  148.     return PLUGIN_HANDLED
  149. }
  150.  
  151. public ARP_RegisterItems()
  152. {
  153.     g_Tickers = TravTrieCreate()
  154.    
  155.     new File = ARP_FileOpen(g_File,"rt+")
  156.     if(!File)
  157.     {
  158.         ARP_Log("Could not open file ^"%s^"",g_File)
  159.         return
  160.     }
  161.    
  162.     // Model stuff for the NPC
  163.     new Model[64],StrAngle[10],Float:Angle,OriginStr[33],SplitOrigin[3][10],Float:Origin[3],Garbage[2]
  164.    
  165.     new Ticker[12],Value[64],Company[64],Stock[10],ZoneStr[3],Zone
  166.     while(!feof(File))
  167.     {
  168.         fgets(File,g_Buffer,4095)
  169.        
  170.         if(g_Buffer[0] == ';' || !g_Buffer[0]) continue
  171.        
  172.         replace_all(g_Buffer,4095,"^n","")
  173.         remove_quotes(g_Buffer)
  174.         trim(g_Buffer)
  175.        
  176.         if(g_Buffer[0] == '*')
  177.         {
  178.             if(equali(g_Buffer[1],"model",5))
  179.             {
  180.                 parse(g_Buffer[1],Garbage,1,Model,63)
  181.                 remove_quotes(Model)
  182.             }
  183.             if(equali(g_Buffer[1],"angle",5))
  184.             {
  185.                 parse(g_Buffer[1],Garbage,1,StrAngle,9)
  186.                 Angle = str_to_float(StrAngle)
  187.             }
  188.             if(equali(g_Buffer[1],"origin",6))
  189.             {
  190.                 parse(g_Buffer[1],Garbage,1,OriginStr,32)
  191.                 parse(OriginStr,SplitOrigin[0],9,SplitOrigin[1],9,SplitOrigin[2],9)
  192.                
  193.                 for(new i = 0;i < 3;i++)
  194.                     Origin[i] = str_to_float(SplitOrigin[i])
  195.             }
  196.             if(equali(g_Buffer[1],"zone",4))
  197.             {
  198.                 parse(g_Buffer[1],Garbage,1,ZoneStr,2)
  199.                 Zone = str_to_num(ZoneStr)
  200.             }
  201.            
  202.             continue
  203.         }
  204.         //parse(g_Buffer,Ticker,11,Name,63)
  205.        
  206.         //remove_quotes(Ticker)
  207.         //remove_quotes(Name)
  208.        
  209.         //TravTrieSetString(g_Tickers,Ticker,Name)
  210.         TravTrieSetString(g_Tickers,g_Buffer,"")
  211.     }
  212.     fclose(File)
  213.    
  214.     if(file_exists(Model))
  215.     {
  216.         precache_model(Model)
  217.         g_NPC = ARP_RegisterNpc("Investment Broker",Origin,Angle,Model,"NPCHandler",Zone)
  218.     }
  219.     else
  220.     {
  221.         set_fail_state("Could not create NPC, file missing")
  222.         return
  223.     }
  224.    
  225.     UpdateInfo()
  226.    
  227.     new travTrieIter:Iter = GetTravTrieIterator(g_Tickers),Description[64]
  228.     while(MoreTravTrie(Iter))
  229.     {
  230.         ReadTravTrieKey(Iter,Ticker,11)
  231.         ReadTravTrieString(Iter,Value,63)
  232.        
  233.         strtok(Value,Company,63,Stock,9,'|')
  234.        
  235.         format(Value,63,"%s Stock",Company)
  236.         format(Description,63,"Stock in %s (%s).",Company,Ticker)
  237.        
  238.         ARP_RegisterItem(Value,"_Stock",Description)
  239.     }
  240.     DestroyTravTrieIterator(Iter)
  241.    
  242.     g_BlackBerry = ARP_RegisterItem("BlackBerry Storm","_BlackBerry","Displays stock quote data")
  243.    
  244.     //ARP_RegisterItem("Population Fund","_PopulationFund","Increases and decreases in value with average server population")
  245.     //ARP_RegisterItem("Random Fund","_RandomFund","Increases and decreases totally randomly every 10 minutes")
  246.    
  247.     //g_Treasuries[0] = ARP_RegisterItem("Treasury Bill","_Treasury","Low yield, low return time treasury")
  248.     //g_Treasuries[1] = ARP_RegisterItem("Treasury Note","_Treasury","Medium yield, medium return time treasury")
  249.     //g_Treasuries[2] = ARP_RegisterItem("Treasury Bond","_Treasury","High yield, high return time treasury")
  250. }
  251.  
  252. public _Stock(id) client_print(id,print_chat,"[ARP] This item cannot be used.")
  253.  
  254. public _BlackBerry(id) client_print(id,print_chat,"[ARP] To use this, say /quote <stock # to start at or ticker symbol>.")
  255.  
  256. ShowCurrentQuote(id,Num)
  257. {      
  258.     if(Num < 0 || Num >= TravTrieSize(g_Tickers))
  259.     {
  260.         client_print(id,print_chat,"[ARP] That is not a valid start number.")
  261.         return
  262.     }
  263.    
  264.     /*new travTrieIter:Iter = GetTravTrieIterator(g_Tickers),Ticker[12],Value[64],Company[64],Stock[10],Len = format(g_Buffer,4095,"Company (Ticker) - Quote^n^n")
  265.     while(MoreTravTrie(Iter))
  266.     {
  267.         ReadTravTrieKey(Iter,Ticker,11)
  268.         ReadTravTrieString(Iter,Value,63)
  269.        
  270.         strtok(Value,Company,63,Stock,9,'|')
  271.    
  272.         Len += format(g_Buffer[Len],4095 - Len,"%s (%s) - $%s^n",Company,Ticker,Stock)
  273.     }
  274.     DestroyTravTrieIterator(Iter)*/
  275.    
  276.     new Pos = Num,Ticker[12],Value[64],Company[64],Stock[10],Len = format(g_Buffer,4095,"Company (Ticker) - Quote^n^n"),Size = TravTrieSize(g_Tickers)
  277.     while(Pos < Num + 15 && Pos < Size)
  278.     {
  279.         TravTrieNth(g_Tickers,Pos,Ticker,11)
  280.         TravTrieGetString(g_Tickers,Ticker,Value,63)
  281.        
  282.         strtok(Value,Company,63,Stock,9,'|')
  283.    
  284.         Len += format(g_Buffer[Len],4095 - Len,"%d. %s (%s) - $%s^n",Pos + 1,Company,Ticker,Stock)
  285.        
  286.         Pos++
  287.     }
  288.    
  289.     if(g_MarketClosed)
  290.         Len += format(g_Buffer[Len],4095 - Len,"^nThe market is currently closed.")
  291.    
  292.     if(Pos < Size)
  293.         Len += format(g_Buffer[Len],4095 - Len,"^nType ^"/quote %d^" for more entries.",Pos)
  294.    
  295.     show_motd(id,g_Buffer,"Stock Quotes")
  296.    
  297.     return
  298. }
  299.  
  300. public NPCHandler(id,NPC)
  301.     if(NPC == g_NPC && ARP_NpcDistance(id,NPC))
  302.         menu_display(id,g_StockOptionsMenu)
  303.  
  304. public StockOptionsHandler(id,Menu,Item)
  305.     switch(Item)
  306.     {
  307.         case 0,1:
  308.         {
  309.             g_Mode[id] = Item
  310.             menu_display(id,g_TradeMenu)
  311.         }
  312.         case 2: client_print(id,print_chat,"[ARP] To use this, say /quote <stock # to start at>.")
  313.     }
  314.  
  315. public TradeMenuHandle(id,Menu,Item)
  316. {
  317.     if(Item == MENU_EXIT) return
  318.    
  319.     new Access
  320.     menu_item_getinfo(Menu,Item,Access,g_Ticker[id],11,_,_,Access)
  321.    
  322.     menu_display(id,g_NumberMenu)
  323. }
  324.  
  325. public TradeNumberHandle(id,Menu,Item)
  326. {
  327.     new Num
  328.     switch(Item)
  329.     {
  330.         case 0 : Num = 1
  331.         case 1 : Num = 5
  332.         case 2 : Num = 10
  333.         case 3 : Num = 20
  334.         case 4 : Num = 50
  335.         case 5 : Num = 100
  336.         case 6 : Num = 1000
  337.         default : return
  338.     }
  339.    
  340.     new travTrieIter:Iter = GetTravTrieIterator(g_Tickers),Ticker[12],Value[64],Company[64],Stock[10],Cost
  341.     while(MoreTravTrie(Iter))
  342.     {
  343.         ReadTravTrieKey(Iter,Ticker,11)
  344.         ReadTravTrieString(Iter,Value,63)
  345.        
  346.         if(equali(Ticker,g_Ticker[id]))
  347.         {
  348.             strtok(Value,Company,63,Stock,9,'|')
  349.            
  350.             Cost = str_to_num(Stock) * Num
  351.            
  352.             break
  353.         }
  354.     }
  355.     DestroyTravTrieIterator(Iter)
  356.    
  357.     new ItemIds[1]
  358.     format(Value,63,"%s Stock",Company)
  359.    
  360.     if(!ARP_FindItemId(Value,ItemIds,1))
  361.     {
  362.         client_print(id,print_chat,"[ARP] Error finding stock. Please contact administrator.")
  363.         return
  364.     }
  365.    
  366.     new ItemId = ItemIds[0],ItemNum = ARP_GetUserItemNum(id,ItemId),Money = ARP_GetUserBank(id)
  367.    
  368.     if(!g_Mode[id] && Money < Cost)
  369.     {
  370.         client_print(id,print_chat,"[ARP] You do not have enough money to purchase this stock.")
  371.         return
  372.     }
  373.    
  374.     if(g_Mode[id] && ItemNum < Num)
  375.     {      
  376.         client_print(id,print_chat,"[ARP] You do not have enough of this stock to sell.")
  377.         return
  378.     }
  379.    
  380.     // There's a huge memory corruption bug here so I had to use if statements instead of a condensed condition
  381.     if(g_Mode[id])
  382.     {
  383.         ARP_SetUserItemNum(id,ItemId,ItemNum - Num)
  384.         ARP_SetUserBank(id,Money + Cost)
  385.     }
  386.     else
  387.     {  
  388.         ARP_SetUserItemNum(id,ItemId,ItemNum + Num)
  389.         ARP_SetUserBank(id,Money - Cost)
  390.     }
  391.    
  392.     client_print(id,print_chat,"[ARP] You have %s %d stocks in %s (%s) for $%d.",g_Mode[id] ? "sold" : "purchased",Num,Company,Ticker,Cost)
  393.     if(g_MarketClosed)
  394.         client_print(id,print_chat,"[ARP] The market is currently closed. The value of your stock will not fluctuate until it reopens.")
  395. }
  396.  
  397. public UpdateInfo()
  398. {
  399.     new Error
  400.     g_Socket = socket_open("download.finance.yahoo.com",80,SOCKET_TCP,Error);
  401.    
  402.     if(Error || !g_Socket)
  403.     {
  404.         log_amx("Error with socket: %d",Error)
  405.         return
  406.     }
  407.    
  408.     new travTrieIter:Iter = GetTravTrieIterator(g_Tickers),Tickers[384],Key[10],Garbage[2]
  409.     while(MoreTravTrie(Iter))
  410.     {
  411.         ReadTravTrieKey(Iter,Key,9)
  412.        
  413.         add(Tickers,383,Key)
  414.        
  415.         ReadTravTrieString(Iter,Garbage,1)
  416.        
  417.         if(MoreTravTrie(Iter))
  418.             add(Tickers,383,",")
  419.     }  
  420.     DestroyTravTrieIterator(Iter)
  421.    
  422.     /*new TickersLen = strlen(Tickers)
  423.     if(TickersLen <= sizeof(Tickers))
  424.         Tickers[TickersLen - 1] = 0*/
  425.    
  426.     format(g_Buffer,4095,"GET /d/quotes.csv?s=%s&f=snl1 HTTP/1.0^nHost: download.finance.yahoo.com^n^n",Tickers)
  427. #if defined DEBUG
  428.     log_amx("Send cmd: %s",g_Buffer)
  429. #endif
  430.     socket_send(g_Socket,g_Buffer,4095)
  431.    
  432.     g_Buffer[0] = 0
  433.     socket_recv(g_Socket,g_Buffer,4095)
  434. #if defined DEBUG
  435.     log_amx("Get cmd: %s",g_Buffer)
  436. #endif
  437.    
  438.     if(!g_Buffer[0] || containi(g_Buffer,"Bad Request") != -1)
  439.     {
  440.         ARP_Log("Error reading data from website")
  441.         return
  442.     }
  443.    
  444.     new DataLoc = containi(g_Buffer,"octet-stream") + strlen("octet-stream") + 1
  445.     trim(g_Buffer[DataLoc])
  446.    
  447.     write_file(g_WriteFile,g_Buffer[DataLoc])
  448.    
  449.     if(g_TradeMenu) menu_destroy(g_TradeMenu)
  450.     g_TradeMenu = menu_create("Trade Menu","TradeMenuHandle")
  451.    
  452.     new Line,Ticker[12],TempCombined[64],Company[64],StockStr[10],Value[64],Quote,OldValue[64],Different
  453.     while(read_file(g_WriteFile,Line++,g_Buffer,4095,Garbage[0]))
  454.     {
  455.         if(!g_Buffer[0]) continue
  456.  
  457. #if defined DEBUG
  458.         log_amx("Read buffer: %s",g_Buffer)
  459. #endif
  460.        
  461.         strtok(g_Buffer,Ticker,11,TempCombined,63,',')
  462.         strtok(TempCombined,Company,63,StockStr,9,',')
  463.        
  464.         remove_quotes(Ticker)
  465.         remove_quotes(Company)
  466.         remove_quotes(StockStr)
  467.        
  468.         format(Value,63,"%s|%d",Company,Quote = floatround(str_to_float(StockStr) * 100))
  469.        
  470.         TravTrieGetString(g_Tickers,Ticker,OldValue,63)
  471.        
  472.         if(!equali(OldValue,Value))
  473.             Different = 1
  474.        
  475.         TravTrieSetString(g_Tickers,Ticker,Value)
  476.        
  477.         format(Value,63,"%s (%s) - $%d",Company,Ticker,Quote)
  478.         menu_additem(g_TradeMenu,Value,Ticker)
  479.     }
  480.    
  481.     if(g_NumChecks > 1)
  482.     {
  483.         if(!g_MarketClosed && !Different)
  484.         {
  485.             client_cmd(0,"spk fvox/alert")
  486.             client_print(0,print_chat,"[ARP] The stock market is now closed (overnight trading permitted).")
  487.         }
  488.         else if(g_MarketClosed && Different)
  489.         {  
  490.             client_cmd(0,"spk fvox/alert")
  491.             client_print(0,print_chat,"[ARP] The stock market is now open.")
  492.         }
  493.     }
  494.    
  495.     g_MarketClosed = !Different
  496.    
  497.     delete_file(g_WriteFile)
  498.    
  499.     socket_close(g_Socket)
  500.    
  501.     g_NumChecks++
  502. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement