summaryrefslogtreecommitdiff
path: root/utils.py
blob: c4cfb37ef9f5197e3eed1ebc93d67b829f0a1d6d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#################################################################################
#     This file is part of Spheres.
#     Copyright (C) 2019  Jesusalva

#     This library is free software; you can redistribute it and/or
#     modify it under the terms of the GNU Lesser General Public
#     License as published by the Free Software Foundation; either
#     version 2.1 of the License, or (at your option) any later version.

#     This library is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#     Lesser General Public License for more details.

#     You should have received a copy of the GNU Lesser General Public
#     License along with this library; if not, write to the Free Software
#     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#################################################################################
# Util Module, forcefully inheirted by all modules

import time, hashlib, datetime, uuid, string, secrets
import json, zlib, base64

# Set server debug level
# 0 - Production/Stable, Silent
# 1 - Production/Unstable
# 2 - Development/Debug
debug=1

# Create a variable called "salt", which contains the token saltening sequence
s=open("salt.txt", "r")
for l in s:
    salt=l
s.close()

def ifte(ifs, then, elses):
    if (ifs):
        return then
    else:
        return elses

def md5(string):
    return hashlib.md5(string.encode()).hexdigest()

def md5salt(string):
    global salt
    fs=salt+string
    return hashlib.md5(fs.encode()).hexdigest()

def create_token():
    return uuid.uuid4().hex

def create_password(size=32):
    alphabet = string.ascii_uppercase + string.digits
    return ''.join(secrets.choice(alphabet) for i in range(size))

def now():
    return int(time.time())

# [0]- Day, [1]- Month, [2]- Year, [3]-Weekday, [4]-Hour, [5]-Minute
def return_date(dt):
    day=dt.timetuple()[2]
    month=dt.timetuple()[1]
    year=dt.timetuple()[0]

    hour=dt.timetuple()[3]
    minute=dt.timetuple()[4]

    weekday=dt.timetuple()[6]

    #second=5, days_since_01/01=7
    return day, month, year, weekday, hour, minute

# Date from a SQL DATETIME string
def date_from_sql(date):
    # We assume date was taken from SQL DATETIME field
    dt=datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
    return return_date(dt)

# Current date (NOT UTC)
def date_from_now():
    dt=datetime.datetime.now()
    return return_date(dt)


def stdout(mx, verbose=1):
    if (debug >= verbose):
        print(mx)
        dfile=open("debug.txt", 'a')
        dt=datetime.datetime.now().timetuple()
        date="[%04d-%02d-%02d %02d:%02d:%02d]" % (dt[0], dt[1], dt[2], dt[3], dt[4], dt[5])
        dfile.write("%s %s\n" % (date, mx))
        dfile.close()

def compress(string):
    stdout("Compress: Received JSON data: %s" % (string), 1)
    sjs=json.dumps(string)
    sjs=sjs.encode("ascii")
    sjs=zlib.compress(sjs)
    sjs=base64.b64encode(sjs)
    sjs=sjs.decode("ascii")
    stdout("Compress: Sending base64+zlib JSON ASCII data: %s" % (sjs), 2)
    return sjs

# Search for array[?][key]==search in an array of dicts
# Returns the dictionary, or returns "ERROR"
def dl_search(array, key, search):
    return next((item for item in array if item[key] == search), "ERROR")

# Global classes
# We need to override standard list method. Original by Triptych (stackoverflow)
class dlist(list):

    def __setitem__(self, index, value):
        size = len(self)
        if index >= size:
            self.extend(None for _ in range(size, index + 1))

        list.__setitem__(self, index, value)

# Search for a client by user ID
# Returns the dictionary, or returns "ERROR"
def cli_search(search):
    global clients
    return next((item for item in clients if item.userid == search), "ERROR")

# Global structures
Player={}
Battle={}
ApTimer={}
clients = []

# Databases
# Load quest database
f=open("quests.json", "r")
allquests=json.load(f)
f.close()

# Load units database
f=open("units.json", "r")
allunits=json.load(f)
f.close()

# Load skills database
f=open("skills.json", "r")
allskills=json.load(f)
f.close()

# Load summons database
f=open("summons.json", "r")
allsummons=json.load(f)
f.close()

# Load taverns database
# Chance total must be 100% (or 10000). Rolled ONCE
f=open("bar.json", "r")
allbars=json.load(f)
f.close()

###########################################################################
# Comments
"""
abc=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
     'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
     'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
"""