From jguardon, 2 Years ago, written in GAMBAS.
Embed
  1. ' Gambas class file
  2.  
  3. '
  4. ' Sorteo Gambas-es
  5. ' Selecciona ganador de sorteo a partir de fichero csv con resumen de donaciones en Kapipal.
  6. '
  7. ' Copyright (C) gambas-es.org Team
  8. '
  9. ' This program is free software; you can redistribute it and/or modify
  10. ' it under the terms of the GNU General Public License as published by
  11. ' the Free Software Foundation; either version 2 of the License, or
  12. ' (at your option) any later version.
  13. '
  14. ' This program is distributed in the hope that it will be useful,
  15. ' but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ' GNU General Public License for more details.
  18. '
  19. ' You should have received a copy of the GNU General Public License
  20. ' along with this program; if not, write to the Free Software
  21. ' Foundation, Inc., 51 Franklin St, Fifth Floor,
  22. ' Boston, MA  02110-1301  USA
  23. '
  24.  
  25. ''Estructura que almacena los campos principales de un registro
  26. Public Struct Registro
  27.     fecha As String
  28.     nombre As String
  29.     apellido As String
  30.     email As String
  31.     cantidad As String
  32.     recompensa As String
  33. End Struct
  34.  
  35. Private $registros As New Registro[]
  36. Private $totalNumerosSorteo As Integer
  37. Private $flagListo As Boolean = False
  38.  
  39. Public Sub Form_Open()
  40.  
  41.     With gvParticipantes
  42.         .Columns.Count = 6
  43.         .Columns[0].title = "Fecha"
  44.         .Columns[1].title = "Nombre completo"
  45.         .Columns[2].title = "Email"
  46.         .Columns[3].title = "Cantidad"
  47.         .Columns[4].title = "Nº Participaciones"
  48.         .Columns[5].title = "Números otorgados"
  49.     End With
  50.  
  51.  
  52. '' Autoajuste del ancho de las columnas del gridview
  53. Public Sub Panel2_Arrange()
  54.  
  55.     Dim col As Integer
  56.  
  57.     For col = 0 To gvParticipantes.Columns.Count - 1
  58.         gvParticipantes.Columns[col].Width = gvParticipantes.Width / gvParticipantes.Columns.Count
  59.     Next
  60.  
  61.  
  62. '' Carga el contenido del fichero csv
  63. Public Sub btnLoadFile_Click()
  64.  
  65.     Dim contenido As String
  66.  
  67.     Dialog.Title = "Elegir fichero csv"
  68.     Dialog.Filter = ["*.csv;*.CSV;", "Ficheros csv Kapipal"]
  69.     Dialog.Path = User.Home
  70.     If Dialog.OpenFile() Then
  71.         Return
  72.     Endif
  73.     contenido = File.Load(Dialog.Path)
  74.     txtRutaFichero.Text = Dialog.Path
  75.  
  76.     If ficheroValido(contenido) Then
  77.         procesarFichero(contenido)
  78.     Else
  79.         Message.Warning("El fichero escogido no es válido, prueba con el fichero correcto.", "Volver")
  80.     Endif
  81.  
  82. '' Valida el contenido del fichero
  83.  
  84. Private Function ficheroValido(fichero As String) As Boolean
  85.     ' En este caso solo compruebo si la palabra Reward se encuentra
  86.     ' en la posición adecuada.
  87.  
  88.     If Mid(fichero, 101, 6) = "Reward" Then Return True
  89.  
  90.  
  91. '' Procesa el fichero extrayendo y asignando campos a la estructura
  92. Private Sub procesarFichero(fichero As String)
  93.  
  94.     Dim numreg As Integer = 0
  95.     Dim linea As String
  96.     Dim lineas, campos As String[]
  97.     Dim tmpRegistro As Registro
  98.  
  99.     lineas = Split(fichero, gb.NewLine, "\"", True)
  100.  
  101.     For Each linea In lineas
  102.         campos = Split(linea, ";", "\"")
  103.         ' Ignoro registros que no tienen Reward ( cantidad < 10 )
  104.         If campos[11] And If IsNumber(campos[11]) Then
  105.             tmpRegistro = New Registro
  106.             tmpRegistro.fecha = campos[0]
  107.             tmpRegistro.nombre = campos[3]
  108.             tmpRegistro.apellido = campos[4]
  109.             tmpRegistro.email = campos[5]
  110.             tmpRegistro.cantidad = campos[1]
  111.             tmpRegistro.recompensa = campos[11]
  112.             $registros.Add(tmpRegistro)
  113.             anadirFila(numreg, tmpRegistro)
  114.             numreg += 1
  115.         Endif
  116.     Next
  117.     $flagListo = True
  118.  
  119.  
  120. '' Llenamos el gridview y asignamos números de sorteo
  121. Private Sub anadirFila(fila As Integer, reg As Registro)
  122.  
  123.     Dim numParticipaciones As Integer = CInt(reg.recompensa) \ 10
  124.     Dim i As Integer
  125.     Dim numeros As New String[]
  126.  
  127.     For i = 0 To numParticipaciones - 1
  128.         $totalNumerosSorteo += 1
  129.         numeros.Add($totalNumerosSorteo)
  130.     Next
  131.  
  132.     gvParticipantes.Rows.Count += 1
  133.     gvParticipantes[fila, 0].Text = reg.fecha
  134.     gvParticipantes[fila, 1].Text = reg.nombre & " " & reg.apellido
  135.     gvParticipantes[fila, 2].Text = reg.email
  136.     gvParticipantes[fila, 3].Text = reg.cantidad
  137.     gvParticipantes[fila, 4].Text = numParticipaciones
  138.     gvParticipantes[fila, 5].Text = numeros.Join(",")
  139.  
  140.  
  141. '' Cliente http que obtiene el número aleatorio desde un servicio web
  142. Public Function obtenerNumeroAleatorio() As Integer
  143.  
  144.     Dim http As New HttpClient
  145.  
  146.     http.Async = False ' espera a que se complete la petición (no se comprueban errores)
  147.     http.Timeout = 5
  148.     http.URL = Subst("http://www.random.org/integers/?num=1&min=1&max=&1&col=1&base=10&format=plain&rnd=new", $totalNumerosSorteo)
  149.     http.Get
  150.     Return CInt(Replace(http.Peek(), "\n", ""))
  151.  
  152.  
  153. '' Obtiene el participante ganador y le informa por email
  154. Public Sub btnSortear_Click()
  155.  
  156.     Dim numero As String
  157.     Dim numeros As String[]
  158.     Dim fila, col, filaGanador, numeroGanador As Integer
  159.  
  160.     If Not $flagListo Then Return ' no ejecutamos el codigo si no está todo listo
  161.  
  162.     numeroGanador = obtenerNumeroAleatorio()
  163.     lblNumero.Text = "Numero: " & numeroGanador
  164.  
  165.     ' Comprueba en qué fila se encuentra el numero ganador
  166.     For fila = 0 To gvParticipantes.Rows.Count - 1
  167.         numeros = Split(gvParticipantes[fila, 5].Text, ",", "", True)
  168.         For Each numero In numeros
  169.             If numero = numeroGanador Then
  170.                 filaGanador = fila
  171.                 Break
  172.             Endif
  173.         Next
  174.     Next
  175.     ' Me aseguro que no podemos repetir el sorteo
  176.     btnSortear.Enabled = False
  177.     btnLoadFile.Enabled = False
  178.  
  179.     ' Resaltado de la fila que corresponde al ganador
  180.     For col = 0 To gvParticipantes.Columns.Count - 1
  181.         gvParticipantes[filaGanador, col].Background = Color.Green
  182.     Next
  183.  
  184.     ' enviamos correo con el número y el nombre del ganador.
  185.     'enviarCorreo(gvParticipantes[filaGanador, 2].Text, numeroGanador, gvParticipantes[filaGanador, 1].Text)
  186.  
  187.  
  188. Public Sub mnuAbout_Click()
  189.  
  190.     Message.Info(Subst("Programa para sorteo de donaciones Kapipal\n\ngambas-es.org Team\n\nVersión &1", Application.Version), "Ok")
  191.  
  192.  
  193. Public Sub mnuClose_Click()
  194.  
  195.     Me.Close
  196.  
  197.  
  198. '' Envía el correo personalizado al ganador informando del número agraciado
  199. Public Sub enviarCorreo(correo As String, numero As Integer, nombre As String)
  200.  
  201.     Dim smtp As New SmtpClient
  202.     ' Aquí va el código para enviar el correo informativo al ganador
  203.     ' Obviamente los datos de servidor no son reales
  204.     smtp.Debug = True
  205.     smtp.Host = "servidor"
  206.     smtp.Port = 25
  207.     smtp.User = "usuario"
  208.     smtp.Password = "contraseña"
  209.     smtp.From = "correo-del-remitente"
  210.     smtp.To.Add(correo)
  211.     smtp.Subject = "Has sido el ganador del sorteo en gambas-es.org"
  212.     smtp.Body = Subst("Hola, &1 \n\n"
  213.     "Acabas de ser agraciado con el premio de una Raspberry Pi \n"
  214.     "en el sorteo que acaba de celebrarse en gambas-es.org con el número '&2'.\n"
  215.     "Por favor, confirma respondiendo a este mensaje que has recibido este correo!\n\n"
  216.     "Saludos y enhorabuena\n\n"
  217.     "Admin gambas-es.org\n", nombre, numero)
  218.     smtp.Send
  219.     Message.Info("Se ha enviado un correo al ganador", "Salir")
  220.     Me.Close
  221.  
  222.     Message.Error("Ha habido un problema con el envío del correo, revisa la configuración")
  223.  
  224.