InanZen

lottery

Dec 31st, 2012
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.58 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.IO;
  8. using TShockAPI;
  9. using TShockAPI.DB;
  10. using Terraria;
  11. using Hooks;
  12. using Mono.Data.Sqlite;
  13. using MySql.Data.MySqlClient;
  14. using Newtonsoft.Json;
  15. using Vault;
  16.  
  17. namespace Lottery
  18. {
  19.     [APIVersion(1, 12)]
  20.     public class Lottery : TerrariaPlugin
  21.     {
  22.         public IDbConnection Database;
  23.         public String SavePath = Path.Combine(TShock.SavePath, "Lottery/");
  24.         internal static Config config;
  25.         public override string Name
  26.         {
  27.             get { return "Lottery"; }
  28.         }
  29.         public override string Author
  30.         {
  31.             get { return "by InanZen"; }
  32.         }
  33.         public override string Description
  34.         {
  35.             get { return ""; }
  36.         }
  37.         public override Version Version
  38.         {
  39.             get { return new Version("0.1"); }
  40.         }
  41.         public Lottery(Main game)
  42.             : base(game)
  43.         {
  44.             Order = 1;
  45.         }
  46.         protected override void Dispose(bool disposing)
  47.         {
  48.             if (disposing)
  49.             {
  50.                // NetHooks.GetData -= OnGetData;
  51.                // NetHooks.SendData -= OnSendData;
  52.                 GameHooks.Initialize -= OnInitialize;
  53.               //  ServerHooks.Leave -= OnLeave;
  54.               //  ServerHooks.Join -= OnJoin;
  55.                 Database.Dispose();
  56.             }
  57.         }
  58.         public override void Initialize()
  59.         {
  60.           //  NetHooks.GetData += OnGetData;
  61.          //   NetHooks.SendData += OnSendData;
  62.             GameHooks.Initialize += OnInitialize;
  63.          //   ServerHooks.Leave += OnLeave;
  64.          //   ServerHooks.Join += OnJoin;
  65.         }
  66.         void OnInitialize()
  67.         {
  68.             config = new Config();
  69.             if (!Directory.Exists(SavePath))
  70.                 Directory.CreateDirectory(SavePath);
  71.             ReadConfig();
  72.             switch (TShock.Config.StorageType.ToLower())
  73.             {
  74.                 case "mysql":
  75.                     string[] host = TShock.Config.MySqlHost.Split(':');
  76.                     Database = new MySqlConnection()
  77.                     {
  78.                         ConnectionString = string.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};",
  79.                             host[0],
  80.                             host.Length == 1 ? "3306" : host[1],
  81.                             TShock.Config.MySqlDbName,
  82.                             TShock.Config.MySqlUsername,
  83.                             TShock.Config.MySqlPassword)
  84.                     };
  85.                     break;
  86.                 case "sqlite":
  87.                     string sql = Path.Combine(SavePath, "lottery.sqlite");
  88.                     Database = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql));
  89.                     break;
  90.             }
  91.             SqlTableCreator sqlcreator = new SqlTableCreator(Database, Database.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
  92.             sqlcreator.EnsureExists(new SqlTable("LotteryPlayers",
  93.                 new SqlColumn("username", MySqlDbType.VarChar) { Length = 30 },
  94.                 new SqlColumn("amount", MySqlDbType.Int32)
  95.                 ));
  96.             sqlcreator.EnsureExists(new SqlTable("LotteryWinners",
  97.                 new SqlColumn("id", MySqlDbType.Int32) { Primary = true, AutoIncrement = true },
  98.                 new SqlColumn("username", MySqlDbType.VarChar) { Length = 30 },
  99.                 new SqlColumn("amount", MySqlDbType.Int32),
  100.                 new SqlColumn("date", MySqlDbType.Text)
  101.                 ));
  102.  
  103.             Commands.ChatCommands.Add(new Command("lottery", LotteryCommand, "loto","lottery")); ;
  104.         }
  105.         void LotteryCommand(CommandArgs args)
  106.         {
  107.             if (args.Parameters.Count > 0)
  108.             {
  109.                 switch (args.Parameters[0])
  110.                 {
  111.                     case "pot":
  112.                         {
  113.                             var reader = Database.QueryReader("SELECT SUM(amount) AS total FROM LotteryPlayers");
  114.                             int total = 0;
  115.                             if (reader.Read())
  116.                             {
  117.                                 total = reader.Get<int>("total");
  118.                             }
  119.                             reader.Dispose();
  120.                             args.Player.SendMessage(String.Format("There is {0} in the pot.",Vault.Vault.MoneyToString(total)),Color.DarkGreen);
  121.                             return;
  122.                         }
  123.                     case "pay":
  124.                         {
  125.                             int amount = 0;
  126.                             if (args.Parameters.Count > 1 && int.TryParse(args.Parameters[1], out amount) && amount > 0)
  127.                             {
  128.                                 if (Vault.Vault.ModifyBalance(args.Player.Name, -amount, false))
  129.                                 {
  130.                                     int total = 0;
  131.                                     var reader = Database.QueryReader("SELECT amount FROM LotteryPlayers WHERE username = @0", args.Player.Name);
  132.                                     if (reader.Read())
  133.                                         total = reader.Get<int>("amount");
  134.                                     reader.Dispose();
  135.                                     if (total == 0)
  136.                                         Database.Query("INSERT INTO LotteryPlayers(username, amount) VALUES(@0,@1)", args.Player.Name, amount);
  137.                                     else
  138.                                         Database.Query("UPDATE LotteryPlayers SET amount = @0 WHERE username = @1", total + amount, args.Player.Name);
  139.                                     args.Player.SendMessage(String.Format("Success: You have now {0} in play this draw.", Vault.Vault.MoneyToString(total + amount)), Color.DarkGreen);
  140.                                    
  141.                                 }
  142.                                 else
  143.                                     args.Player.SendMessage("Error: Could not deduce the amount from your balance. Check your balance with /balance", Color.DarkOrange);
  144.                             }
  145.                             else
  146.                                 args.Player.SendMessage("Syntax: /loto pay amount (amount must be valid, non-negative number)", Color.DarkOrange);
  147.                             return;
  148.                         }
  149.                     case "status":
  150.                         {
  151.                             int total = 0;
  152.                             var reader = Database.QueryReader("SELECT amount FROM LotteryPlayers WHERE username = @0", args.Player.Name);
  153.                             if (reader.Read())
  154.                                 total = reader.Get<int>("amount");
  155.                             reader.Dispose();
  156.                             args.Player.SendMessage(String.Format("You have {0} in play this draw.", Vault.Vault.MoneyToString(total)), Color.DarkGreen);                        
  157.                             return;
  158.                         }
  159.                     case "winner":
  160.                         {
  161.                             var reader = Database.QueryReader("SELECT * FROM LotteryWinners SORT BY id DESC LIMIT 1", args.Player.Name);
  162.                             if (reader.Read())
  163.                             {
  164.                                 args.Player.SendMessage(String.Format("Latest winner is {0} who won {1} on {2}", reader.Get<string>("username"), Vault.Vault.MoneyToString(reader.Get<int>("amount")), JsonConvert.DeserializeObject<DateTime>(reader.Get<string>("date")).ToString()), Color.DarkGreen);
  165.                             }
  166.                             else
  167.                                 args.Player.SendMessage("There are no records of any winners at this moment.", Color.DarkOrange);
  168.                             reader.Dispose();
  169.                            
  170.                             return;
  171.                         }
  172.                 }
  173.             }
  174.  
  175.             args.Player.SendMessage("Lottery commands: (/lottery /loto)", Color.DarkOrange);
  176.             args.Player.SendMessage("/loto pay amount - the more you pay in, the higher chances of win ;)", Color.DarkGreen);
  177.             args.Player.SendMessage("/loto pot - see the current amount of money in the draw", Color.DarkGreen);
  178.             args.Player.SendMessage("/loto status - check how much you have invested in current draw", Color.DarkGreen);
  179.             args.Player.SendMessage("/loto winner - check who won last draw", Color.DarkGreen);
  180.            
  181.         }
  182.  
  183.         internal class Config
  184.         {
  185.  
  186.  
  187.         }
  188.         private void CreateConfig()
  189.         {
  190.             string filepath = Path.Combine(SavePath, "config.json");
  191.             try
  192.             {
  193.                 using (var stream = new FileStream(filepath, FileMode.Create, FileAccess.Write, FileShare.Write))
  194.                 {
  195.                     using (var sr = new StreamWriter(stream))
  196.                     {
  197.                         config = new Config();
  198.                         var configString = JsonConvert.SerializeObject(config, Formatting.Indented);
  199.                         sr.Write(configString);
  200.                     }
  201.                     stream.Close();
  202.                 }
  203.             }
  204.             catch (Exception ex)
  205.             {
  206.                 Log.ConsoleError(ex.Message);
  207.                 config = new Config();
  208.             }
  209.         }
  210.         private bool ReadConfig()
  211.         {
  212.             string filepath = Path.Combine(SavePath, "config.json");
  213.             try
  214.             {
  215.                 if (File.Exists(filepath))
  216.                 {
  217.                     using (var stream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read))
  218.                     {
  219.                         using (var sr = new StreamReader(stream))
  220.                         {
  221.                             var configString = sr.ReadToEnd();
  222.                             config = JsonConvert.DeserializeObject<Config>(configString);
  223.                         }
  224.                         stream.Close();
  225.                     }
  226.                     return true;
  227.                 }
  228.                 else
  229.                 {
  230.                     Log.ConsoleError("Config not found. Creating new one");
  231.                     CreateConfig();
  232.                     return false;
  233.                 }
  234.             }
  235.             catch (Exception ex)
  236.             {
  237.                 Log.ConsoleError(ex.Message);
  238.             }
  239.             return false;
  240.         }
  241.  
  242.  
  243.     }
  244.  
  245.  
  246. }
Advertisement
Add Comment
Please, Sign In to add comment