Object System y Shop System - otiasc/Seijyuji-Rest GitHub Wiki

Definiciones

Lugares:

  • tema tienda: la tienda en la que se puede comprar
  • post de pedido de compra: post que el usuario escribe para ordenar la compra
  • post de pedido de uso: post que el usuario escribe para ordenar el uso de un objeto

Campos del usuario:

  • historial de compras: muestra todas las compras que se han hecho
    Almacena tríadas de valores id de objeto/cantidad/id del post/subid del post separados mediante el carácter |
  • historial de usos: muestra todos los usos que se han hecho
    Almacena tríadas de valores id de objeto/cantidad/id del post/subid del post separados mediante el carácter | Ejemplo: 1/1/31/0|2/1/31/1
  • lista de objetos: muestra todos los objetos que posee el usuario
    Almacena pares de valores id de objeto/cantidad
  • dinero: dinero que tiene el usuario
    Almacena una cantidad

Longitud aproximada de las tríadas de valores: 0000/00/000/0, 13 a 15 caracteres.

Otros elementos

  • item: objeto que el usuario quiere comprar o usar. Se llamará así para distinguirlo del objeto Object de JavaScript
  • Admin: Se refiere a administradores y moderadores del foro

Formatos

A efectos prácticos, los siguientes campos se consideran del mismo tipo:

  • id de objeto
  • fecha y hora de compra. ID del post
  • fecha y hora de uso. ID del post

Todos ellos son de tipo Número, los cuales, se (des)codificarán usando las funciones SS_convertToCode() y SS_convertToNumber(). Todos los campos se almacenan en los campos de usuario codificados y para JavaScript se descodificarán.

Funciones SS_convertToCode() y SS_convertToNumber()

function SS_convertToNumber(string) {
	// Convierte el string en número.
	// Declaramos la matriz de conversión
	var arr = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
	
	var number = 0;
	for (var i=0; i<string.length; i++) {
		number += arr.indexOf(string.charAt(i)) * Math.pow(arr.length, string.length - i - 1);
	}
	return number;
}

y

function SS_convertToCode(number) {
	// Convierte el número en string
	var arr = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';
	
	var string = '';
	var rest = number;
	var maxIndex = Math.ceil(Math.log(number)/Math.log(arr.length));
	
	for (var i=0; i<maxIndex; i++) {
		var n = rest/Math.pow(arr.length, (maxIndex-i-1));
		string += arr.charAt(Math.floor(n));
		rest -= Math.pow(arr.length, (maxIndex-i-1)) * Math.floor(n);
	}
	
	return string;
}

Por ejemplo, para obtener el código de fecha actual usaríamos SS_convertToCode((new Date()).getTime())

Crear la tienda

En el tema tienda aparecerá el catálogo de objetos y un botón de "generar código" con el cual aparecerá un código de compra abajo que el usuario copiará.

El post es libre, se puede poner como se quiera (tablas, imágenes, etc.). Sin embargo, para efectuar la compra con el Sistema de Tienda, es necesario poner un botón de "Comprar". En todos ellos, al pulsarlo aparece un código que el comprador pegará en su post. Estos son los botones ofrecidos

Botón completo

<span class="SS_storeItem">packOitem/id/unidades/precio</span>

En donde:

  • packOitem (obligatorio) debe ser pack o item según lo que se quiera vender
  • id (obligatorio) es el ID del item o del pack que se quiere vender
  • unidades (opcional) es el número de unidades que se vende al pulsar el botón. Si no se especifica valor se considera 1 Si se especifica intervalo mín-max, mín es el número mínimo que se puede comprar y max el número máximo que se puede comprar
  • precio (opcional) el precio de venta del ítem. Si no se especifica, se toma el valor predeterminado del ítem.

Ejemplos de botones

<span class="SS_storeItem">pack/2</span> Vender una unidad del pack 2 por el precio por defecto <span class="SS_storeItem">item/23//300</span> Vender una unidad del item 23 por un precio de 300¥ <span class="SS_storeItem">item/34/1-99/500</span> Vender entre 1 y 99 unidades del item 34 por un precio de 500¥ la unidad

Compra de objetos

Proceso de compra

El usuario hará clic en el botón "Comprar uno". Le saldrá un código que tiene que pegar en el post para efectuar la compra.

Esto es lo que el usuario pegará en el post

<span class="SS_buy">packOitem/id/unidades/precio</span>

Con idénticos valores que en SS_storeItem pero codificados

Y esto otro lo que los demás verán en el post

<span class="SS_Buy"><span class="SS_internals">packOitem/id/unidades/precio</span><p>Pedido de compra. Objeto <b>Daga</b> por <b>¥100.000</b><span class="SS_BuyConfirm">.</span></p></span>

Confirmación de compra

El Admin tiene que pulsar el carácter "." que aparece al final del post. Entonces, un script se encarga de confirmar la compra.

El mismo script del listener debe identificar los tres valores quién, qué y cuándo y cuánto correspondientes al usuario, ítem, cantidad, post e índice de span

$(document).ready(function(e) {
	$('span.SS_BuyConfirm').click(function(e) {
		buyItem(who, what, when);
	});
});

Función buyItem(_who, _what, _when)

  • who:Number el ID del usuario comprador
  • what:Number el ID del item que se quiere comprar
  • when:Number el ID del post en el que se efectúa la compra

Obtener la información necesaria

  1. Mediante AJAX:get nos vamos a la dirección /u__who__ (ejemplo /u13) para leer los campos dinero, ítems, historial de compra e historial de uso
  2. Comprobar que ningún elemento del historial de compras del usuario tiene la combinación what/howmuch/when que la compra actual.
    Si coincide significa que la compra ya ha sido aceptada en su momento (ya existe en el historial). Interrumpir operación.
    Si no coincide la compra no ha sido aceptada. Continuar.
  3. Comprobar que se tiene el dinero suficiente
  4. Actualizar la lista de objetos de manera inteligente.
  5. Enviar mediante ajax, el historial de compras del usuario
  6. Enviar mediante ajax, la lista de objetos
  7. Enviar mediante ajax, el dinero
⚠️ **GitHub.com Fallback** ⚠️