/// <summary> /// Accepts a buddy request and notifies the sender (if online) and the receiver. /// </summary> /// <param name="Session">The Woodpecker.Sessions.Session object of the user that accepts the request.</param> /// <param name="senderID">The database ID of the user that sent the request.</param> public void acceptBuddyRequest(ref Session Session, int senderID) { Database Database = new Database(false, false); Database.addParameterWithValue("userid", Session.User.ID); Database.addParameterWithValue("senderid", senderID); Database.Open(); if (Database.findsResult("SELECT userid FROM messenger_buddylist WHERE userid = @senderid AND buddyid = @userid AND accepted = '0' LIMIT 1")) { Database.runQuery("UPDATE messenger_buddylist SET accepted = '1' WHERE userid = @senderid AND buddyid = @userid LIMIT 1"); Database.Close(); serverMessage Message = new serverMessage(); if (ObjectTree.Game.Users.userIsLoggedIn(senderID)) // Sender is online! { Message.Initialize(137); // "BI" Message.Append(getBuddy(Session.User.ID).ToString()); ObjectTree.Game.Users.trySendGameMessage(senderID, Message); } Message.Initialize(137); // "BI" Message.Append(getBuddy(senderID).ToString()); Session.gameConnection.sendMessage(Message); } else Database.Close(); }
private void saveItemDefinition(itemDefinition pDefinition) { Database dbClient = new Database(false, false); dbClient.addParameterWithValue("definitionid", pDefinition.ID); dbClient.addParameterWithValue("directoryid", pDefinition.directoryID); dbClient.addParameterWithValue("sprite", pDefinition.Sprite); dbClient.addParameterWithValue("color", pDefinition.Color); dbClient.addParameterWithValue("length", pDefinition.Length); dbClient.addParameterWithValue("width", pDefinition.Width); dbClient.addParameterWithValue("topheight", pDefinition.topHeight); dbClient.addParameterWithValue("behaviour", pDefinition.Behaviour.ToString()); dbClient.Open(); if (dbClient.Ready) { dbClient.runQuery("DELETE FROM items_definitions WHERE id = @definitionid LIMIT 1"); // Drop old definition dbClient.runQuery( // Insert new/edited definition "INSERT INTO items_definitions " + "VALUES " + "(@definitionid,@directoryid,@sprite,@color,@length,@width,@topheight,@behaviour)"); dbClient.Close(); } }
private void deleteItemDefinition(int ID) { Database dbClient = new Database(false, false); dbClient.addParameterWithValue("definitionid", ID); dbClient.Open(); if (dbClient.Ready) { dbClient.runQuery("DELETE FROM items_definitions WHERE id = @definitionid LIMIT 1"); // Drop definition dbClient.runQuery("DELETE FROM store_catalogue_sales WHERE item_definitionid = @definitionid"); // Drop single-item sales with this item definition dbClient.runQuery("DELETE FROM store_catalogue_sales_packages WHERE definitionid = @definitionid"); // Drop this item definition from packages dbClient.Close(); } }
/// <summary> /// Creates a new user flat room by writing the given details in the 'rooms' table of the database. The new room's ID is returned upon success. /// </summary> /// <param name="Details">The Woodpecker.Game.Rooms.roomInformation object containing the details of the new room.</param> public int createFlat(roomInformation Details) { int roomID = 0; Database Database = new Database(false, false); Database.addParameterWithValue("roomname", Details.Name); Database.addParameterWithValue("ownerid", Details.ownerID); Database.addParameterWithValue("modeltype", Details.modelType); Database.addParameterWithValue("accesstype", ((int)Details.accessType).ToString()); Database.addParameterWithValue("showname", Details.showOwner.ToString().ToLower()); Database.Open(); if (Database.Ready) { Database.runQuery("INSERT INTO rooms(ownerid,roomname,modeltype,showname,accesstype) VALUES (@ownerid,@roomname,@modeltype,@showname,@accesstype)"); roomID = Database.getInteger("SELECT MAX(id) FROM rooms WHERE ownerid = @ownerid LIMIT 1"); Database.Close(); } return roomID; }
public roomInformation[] getUserFlatsSearchResult(string Criteria) { List<roomInformation> Rooms = new List<roomInformation>(); Database Database = new Database(false, false); Database.addParameterWithValue("criteria", "%" + Criteria); // Only search for rooms with names starting with the criteria Database.addParameterWithValue("owner", Criteria); // Also search for rooms who's ownername is equal to the criteria Database.Open(); if (Database.Ready) { DataTable dTable = Database.getTable("SELECT rooms.*,users.username AS owner FROM rooms LEFT JOIN users ON (rooms.ownerid = users.id) WHERE rooms.ownerid > 0 AND (users.username = @owner OR rooms.roomname LIKE @criteria) ORDER BY visitors_now DESC LIMIT 30"); foreach (DataRow dRow in dTable.Rows) { Rooms.Add(roomInformation.ParseFlat(dRow)); } } Database.Close(); return Rooms.ToArray(); }
/// <summary> /// Deletes a given user flat from the database, /// </summary> /// <param name="roomID">The database ID of the room to delete.</param> public void deleteFlat(int roomID) { Database Database = new Database(false, false); Database.addParameterWithValue("roomid", roomID); Database.Open(); if (Database.Ready) { Database.runQuery("DELETE FROM rooms WHERE id = @roomid LIMIT 1"); Database.runQuery("DELETE FROM rooms_rights WHERE roomid = @roomid"); Database.Close(); } }
/// <summary> /// Swaps the trade offer items of two trade partners and updates the database, hand item collection etc. The swap is aborted if the trade is invalid. /// </summary> /// <param name="partnerItemStrip">The itemStripHandler object of the trade partner session.</param> public void swapTradeOffers(itemStripHandler partnerItemStrip) { if (this.isTrading && partnerItemStrip.isTrading && (this.tradeOfferItemCount > 0 || partnerItemStrip.tradeOfferItemCount > 0)) // Can swap items { Database dbClient = new Database(true, false); if (!dbClient.Ready) return; foreach (int myTradeOfferItemID in this.tradeOfferItemIDs) { stripItem lItem = this.getHandItem(myTradeOfferItemID); if (lItem == null) return; // Trade invalid this.removeHandItem(myTradeOfferItemID, false); // Remove from this item strip partnerItemStrip.addHandItem(lItem); // Add to partner item strip dbClient.runQuery("UPDATE items SET ownerid = '" + partnerItemStrip.userID + "' WHERE id = '" + lItem.ID + "' LIMIT 1"); // Update database } foreach (int partnerTradeOfferItemID in partnerItemStrip.tradeOfferItemIDs) { stripItem lItem = partnerItemStrip.getHandItem(partnerTradeOfferItemID); if (lItem == null) return; // Trade invalid partnerItemStrip.removeHandItem(partnerTradeOfferItemID, false); // Remove from partner item strip this.addHandItem(lItem); // Add to this item strip dbClient.runQuery("UPDATE items SET ownerid = '" + this.userID + "' WHERE id = '" + lItem.ID + "' LIMIT 1"); // Update database } dbClient.Close(); // Close database connection } }
/// <summary> /// Lists various statistics about the registered users in the textbox on the GUI. /// </summary> public void listUserStats() { Database db = new Database(false, false); DataTable dTable = null; System.Text.StringBuilder sb = new System.Text.StringBuilder(); int Counter = 0; Logging.Log("Listing user statistics...\n"); db.Open(); sb.Append("Role user amounts:\n"); for (int roleID = 0; roleID <= 6; roleID++) { int Count = db.getInteger("SELECT COUNT(id) FROM users WHERE role = '" + roleID + "'"); sb.Append("Role '" + ((userRole)roleID).ToString() + "' has " + Count + " users.\n"); } sb.Append("\n> Top 20 of richest normal users:\n"); dTable = db.getTable("SELECT id,username,credits FROM users WHERE role <= '3' ORDER BY credits DESC LIMIT 20"); foreach (DataRow dRow in dTable.Rows) { Counter++; int userID = (int)dRow["id"]; string Username = (string)dRow["username"]; int Credits = (int)dRow["credits"]; sb.Append(Counter + ") " + Username + " [id: " + userID + "] has " + Credits + " credits.\n"); } Logging.Log(sb.ToString()); Logging.Log("User statistics listed.\n"); db.Close(); }
/// <summary> /// Gives a badge to user, after checking if the user doesn't already have this badge. A boolean is returned that indicates if the badge is given or not. /// </summary> /// <param name="userID">The database ID of the user to give the badge to.</param> /// <param name="Badge">The badge of the user to </param> public bool giveBadgeToUser(int userID, string Badge) { Database Database = new Database(false, false); Database.addParameterWithValue("userid", userID); Database.addParameterWithValue("badge", Badge); Database.Open(); if (Database.Ready) { if (!Database.findsResult("SELECT userid FROM users_badges WHERE userid = @userid AND badge = @badge LIMIT 1")) { Database.runQuery("INSERT INTO users_badges(userid,badge) VALUES (@userid,@badge)"); return true; } Database.Close(); } return false; }
/// <summary> /// Tries to redeem a credit/item voucher for a user session. /// </summary> /// <param name="Session">The Woodpecker.Sessions.Session object to redeem the voucher with.</param> /// <param name="Code">The vouchercode the user entered.</param> public void redeemVoucher(ref Session Session, string Code) { serverMessage Response = new serverMessage(); Database Database = new Database(false, false); Database.addParameterWithValue("code", Code); Database.Open(); if (Database.Ready) { DataRow dRow = Database.getRow("SELECT type,value FROM users_vouchers WHERE code = @code AND ISNULL(redeemer_userid)"); if (dRow != null) // Voucher found { // Mark voucher as redeemed Database.addParameterWithValue("userid", Session.User.ID); Database.runQuery("UPDATE users_vouchers SET redeemer_userid = @userid WHERE code = @code"); Database.Close(); string Type = (string)dRow["type"]; if (Type == "credits") { int Credits = int.Parse(dRow["value"].ToString()); Session.User.Credits += Credits; Session.User.updateValueables(); this.logTransaction(Session.User.ID, "win_voucher", Credits); Session.refreshCredits(); } else if (Type == "item") { string[] Items = ((string)dRow["value"]).Split(';'); } // Success! Response.Initialize(212); // "CT" Session.gameConnection.sendMessage(Response); return; } else { // Error 1! (not found) Response.Initialize(213); // "CU" Response.Append(1); } Session.gameConnection.sendMessage(Response); } }
/// <summary> /// Initializes the sales sold in the catalogue. /// </summary> public void loadSales() { if (this.Sales != null) this.Sales.Clear(); this.Sales = new Dictionary<string, storeCatalogueSale>(); Database dbClient = new Database(true, false); if (dbClient.Ready) { foreach (DataRow dSale in dbClient.getTable("SELECT * FROM store_catalogue_sales").Rows) { storeCatalogueSale pSale = new storeCatalogueSale((string)dSale["salecode"], (int)dSale["price"]); // Create blank sale object bool isPackage = ( (dSale["ispackage"].ToString() == "true") && dSale["package_name"] != DBNull.Value && dSale["package_description"] != DBNull.Value); if (isPackage) { pSale.setPackage((string)dSale["package_name"], (string)dSale["package_description"]); foreach (DataRow dPackageItem in dbClient.getTable("SELECT definitionid,amount,specialspriteid FROM store_catalogue_sales_packages WHERE salecode = '" + pSale.saleCode + "'").Rows) { itemDefinition pItemDefinition = ObjectTree.Game.Items.getItemDefinition((int)dPackageItem["definitionid"]); if (pItemDefinition != null) pSale.addPackageItem(pItemDefinition, (int)dPackageItem["amount"], (int)dPackageItem["specialspriteid"]); } } else { itemDefinition pItemDefinition = ObjectTree.Game.Items.getItemDefinition((int)dSale["item_definitionid"]); if (pItemDefinition != null) pSale.setItem(pItemDefinition, (int)dSale["item_specialspriteid"]); } this.Sales.Add(pSale.saleCode, pSale); } dbClient.Close(); } }
public void removeBuddy(int userID, int buddyID) { Database Database = new Database(false, false); Database.addParameterWithValue("userid", userID); Database.addParameterWithValue("buddyid", buddyID); Database.Open(); if (Database.Ready) { Database.runQuery("DELETE FROM messenger_buddylist WHERE (userid = @userid AND buddyid = @buddyid) OR (userid = @buddyid AND buddyid = @userid) AND accepted = '1' LIMIT 1"); Database.runQuery("DELETE FROM messenger_messages WHERE (receiverid = @userid AND senderid = @buddyid) OR (receiverid = @buddyid AND senderid = @userid)"); // Delete messages between users Database.Close(); } if (ObjectTree.Game.Users.userIsLoggedIn(buddyID)) // Victim is online { serverMessage Message = new serverMessage(138); // "BJ" Message.appendWired(1); Message.appendWired(userID); ObjectTree.Game.Users.trySendGameMessage(buddyID,Message); } }
private void _launchBird(int[] receiverIDs, messengerMessage pMessage) { Database Database = new Database(false, false); Database.addParameterWithValue("senderid", pMessage.senderID); Database.addParameterWithValue("sent", pMessage.Sent); Database.addParameterWithValue("body", pMessage.Body); Database.Open(); if (Database.Ready) { //DateTime now = DateTime.Now; //Woodpecker.Core.Logging.Log("Start: " + now.ToString("hh:mm:ss:fff")); foreach (int receiverID in receiverIDs) { if (ObjectTree.Game.Users.userIsLoggedIn(receiverID)) // Receiver is logged in, retrieve the next message ID, write the message in the database & send it to the receiver { int messageID = Database.getInteger("SELECT MAX(messageid) + 1 FROM messenger_messages WHERE receiverid = '" + receiverID + "' LIMIT 1"); Database.runQuery("INSERT INTO messenger_messages(receiverid,messageid,senderid,sent,body) VALUES ('" + receiverID + "','" + messageID + "',@senderid,@sent,@body)"); serverMessage Message = new serverMessage(134); // "BF" Message.appendWired(1); pMessage.ID = messageID; Message.Append(pMessage.ToString()); ObjectTree.Game.Users.trySendGameMessage(receiverID, Message); } else // Receiver is not online, no need for getting our hands on the next message ID etc { Database.runQuery( "INSERT INTO messenger_messages(receiverid,messageid,senderid,sent,body) " + "SELECT " + "'" + receiverID + "'," + "(MAX(messageid) + 1)," + "@senderid," + "@sent," + "@body " + "FROM messenger_messages WHERE receiverid = '" + receiverID + "' LIMIT 1"); } } //now = DateTime.Now; //Woodpecker.Core.Logging.Log("Stop: " + now.ToString("hh:mm:ss:fff")); Database.Close(); } }
/// <summary> /// Processes the current chatlog stack and writes it into the 'moderation_chatlog' table of the database. /// </summary> private void processChatLogStack() { while (true) { Thread.Sleep(15000); // Every 15 seconds if (this.chatLogStack.Count > 0) // Log chatlogs at min 10 logs @ stack { MySqlParameter dtParameter = new MySqlParameter("moment", MySqlDbType.DateTime); MySqlParameter txtParameter = new MySqlParameter("text", MySqlDbType.Text); Database dbClient = new Database(false, false); dbClient.addRawParameter(dtParameter); dbClient.addRawParameter(txtParameter); dbClient.Open(); if (dbClient.Ready) { lock (this.chatLogStack) { foreach (chatLog Log in this.chatLogStack) { dtParameter.Value = Log.Timestamp; txtParameter.Value = Log.Text; dbClient.runQuery(Log.ToString()); } } dbClient.Close(); } chatLogStack.Clear(); } } }
public bool requestBan(int userID, int targetUserID, int banHours, bool banIP, bool banMachine, string Message, string extraInfo) { userInformation Caster = ObjectTree.Game.Users.getUserInfo(userID, false); userInformation Target = ObjectTree.Game.Users.getUserInfo(targetUserID, false); if (Caster != null && Target != null) { if (Caster.Role > Target.Role) // Able to ban this user { if (banHours >= 2 && banHours <= 100000 && !(banHours >= 168 && !Caster.hasFuseRight("fuse_superban"))) // Ban condition valid { userAccessInformation lastAccess = null; Session targetSession = ObjectTree.Game.Users.getUserSession(targetUserID); #region Determine last access if (targetSession == null) lastAccess = ObjectTree.Game.Users.getLastAccess(targetUserID); else lastAccess = targetSession.Access; if ((banIP || banMachine) && lastAccess == null) return false; // Can't ban IP and/or machine with no access log #endregion if (this.requestUnban(userID, targetUserID, lastAccess.IP, lastAccess.machineID)) // Removed old bans succeeded { #region Write ban entry Database dbClient = new Database(false, false); dbClient.addParameterWithValue("userid", targetUserID); dbClient.addParameterWithValue("appliedby", userID); dbClient.addParameterWithValue("expires", DateTime.Now.AddHours(banHours)); dbClient.addParameterWithValue("reason", Message); // Handle access parameters if (banIP) dbClient.addParameterWithValue("ip", lastAccess.IP); else dbClient.addParameterWithValue("ip", DBNull.Value); if (banMachine) dbClient.addParameterWithValue("machineid", lastAccess.machineID); else dbClient.addParameterWithValue("machineid", DBNull.Value); dbClient.Open(); if (!dbClient.Ready) return false; // Failed to write entry dbClient.runQuery("INSERT INTO moderation_bans VALUES (@userid,@ip,@machineid,NOW(),@appliedby,@expires,@reason)"); dbClient.Close(); dbClient = null; #endregion #region Notify & disconnect affected users List<Session> toNotify = new List<Session>(); if (targetSession != null) toNotify.Add(targetSession); if (banIP) ObjectTree.Sessions.addSessionsByIpToList(ref toNotify, lastAccess.IP); serverMessage banCast = genericMessageFactory.createBanCast(Message); foreach (Session lSession in toNotify) { lSession.isValid = false; lSession.leaveRoom(true); lSession.gameConnection.sendMessage(banCast); } #endregion this.logModerationAction(userID, "ban", targetUserID, Message, extraInfo); return true; } } } } return false; }