zhmiscellany 6.1.1__py3-none-any.whl → 6.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
zhmiscellany/misc.py CHANGED
@@ -258,441 +258,440 @@ def die_on_key(key='f9', show_message=False):
258
258
  die()
259
259
  zhmiscellany.processing.start_daemon(target=_die_on_key, args=(key,))
260
260
 
261
+ if WIN32_AVAILABLE:
262
+ temp_folder = os.popen(r'echo %TEMP%').read().replace('\n', '')
263
+
264
+ def obfuscate_python(python_code_string, do_not_obfuscate_indent_block_comment='# DNO', remove_prints=True, remove_comments=True, add_lines=True, new_line_ratio=10):
265
+ import keyword
266
+
267
+ obf = python_code_string
268
+ dno_sig = do_not_obfuscate_indent_block_comment
269
+ dno_char = '2LAM67M4'
270
+
271
+ if add_lines:
272
+ remove_comments = True # Sorry, right now it has to be like this, and I'm too lazy to implement this in a better way. Why would you not want to remove comments anyway...
273
+
274
+ if remove_prints or remove_comments:
275
+ lines = obf.split('\n')
276
+ for i, line in enumerate(lines):
277
+ if remove_prints:
278
+ if line.replace(' ', '').startswith('print('):
279
+ j = 0
280
+ for j, char in enumerate(line):
281
+ if char != ' ':
282
+ break
283
+ lines[i] = f'{" "*j}pass'
284
+ has_dno = line.endswith(dno_sig)
285
+ if remove_comments:
286
+ lines[i] = lines[i].split('#')[0]
287
+ if has_dno:
288
+ lines[i] = lines[i] + ' ' + dno_char
289
+ obf = '\n'.join(lines)
290
+ lines = obf.split('\n')
291
+ lines = [line for line in lines if not any([set(line) == set(j) for j in ['', ' ']])]
292
+ obf = '\n'.join(lines)
293
+
294
+ if add_lines:
295
+ # gather reserved strings
296
+ reserved = []
297
+ reserved.extend(keyword.kwlist) # keywords
298
+ reserved.extend(dir(builtins)) # functions/constants
299
+ reserved.extend([attr for attr in dir(object) if attr.startswith('__') and attr.endswith('__')]) # dunders
300
+ reserved.extend([name for name, obj in vars(builtins).items() if inspect.isclass(obj) and issubclass(obj, BaseException)]) # exceptions
301
+ # tokenize file
302
+ base_splits = '\n\\!#$%&()*+,-./:;<=>?@[\]^`{|}~'
303
+ var_splits = base_splits + ' "\''
304
+ token_splits = base_splits + ' _'
305
+ possible_existing_variables = zhmiscellany.string.multi_split(obf, list(var_splits))
306
+ tokens = zhmiscellany.string.multi_split(obf, list(token_splits))
307
+ tokens = [token for token in tokens if all([char in list(string.ascii_letters + string.digits + "_") for char in token])]
308
+ tokens = [token for token in tokens if dno_char not in token]
309
+ tokens = [token for token in tokens if token not in reserved]
310
+ tokens = list(dict.fromkeys(tokens))
311
+ number_tokens = [token for token in tokens if all([char in '1234567890' for char in token])]
312
+ #number_tokens = [token for token in number_tokens if set(token) != set('0')]
313
+ number_tokens = [token for token in number_tokens if not token.startswith('0')]
314
+ all_tkns = copy.deepcopy(tokens)
315
+ for i in number_tokens:
316
+ tokens.remove(i)
317
+ number_tokens = [num for num in number_tokens if len(str(num)) < 10000]
318
+
319
+
320
+ base_rng = random.Random(0.26900750624933856)
321
+
322
+ rngs = {
323
+ 'num_rng': random.Random(base_rng.random()),
324
+ 'var_name_rng': random.Random(base_rng.random()),
325
+ 'str_rng': random.Random(base_rng.random()),
326
+ 'lst_rng': random.Random(base_rng.random()),
327
+ 'new_rng': random.Random(base_rng.random()),
328
+ 'global_rng': random.Random(base_rng.random()),
329
+ 'match_rng': random.Random(base_rng.random()),
330
+ 'create_var_name': random.Random(base_rng.random()),
331
+ 'make_random_number': random.Random(base_rng.random()),
332
+ 'create_string': random.Random(base_rng.random()),
333
+ 'create_list': random.Random(base_rng.random()),
334
+ }
335
+
336
+
337
+ if not number_tokens:
338
+ def make_random_number():
339
+ ends = [10, 100, 1000]
340
+ return rngs['make_random_number'].randint(0, rngs['make_random_number'].choice(ends))
341
+ number_tokens = [make_random_number for i in range(round((len(obf.split('\n'))*new_line_ratio)/10))]
342
+ total_new_lines = len(obf.split('\n'))*new_line_ratio
343
+
344
+ def create_var_name(vars):
345
+ while True:
346
+ var = rngs['create_var_name'].choice(tokens)
347
+ while True:
348
+ if var[0] in list('1234567890'):
349
+ break
350
+ if var not in possible_existing_variables and var not in vars['all']:
351
+ if rngs['create_var_name'].random() > 1/3:
352
+ return var
353
+ var = var + '_' + random.choice(tokens)
261
354
 
262
- temp_folder = os.popen(r'echo %TEMP%').read().replace('\n', '')
355
+ def create_string(nds=None):
356
+ stri = rngs['create_string'].choice(all_tkns)
263
357
 
358
+ if not nds:
359
+ stnds = ['"', "'", '"""', "'''"]
360
+ nds = rngs['create_string'].choice(stnds)
264
361
 
265
- def obfuscate_python(python_code_string, do_not_obfuscate_indent_block_comment='# DNO', remove_prints=True, remove_comments=True, add_lines=True, new_line_ratio=10):
266
- import keyword
267
-
268
- obf = python_code_string
269
- dno_sig = do_not_obfuscate_indent_block_comment
270
- dno_char = '2LAM67M4'
271
-
272
- if add_lines:
273
- remove_comments = True # Sorry, right now it has to be like this, and I'm too lazy to implement this in a better way. Why would you not want to remove comments anyway...
274
-
275
- if remove_prints or remove_comments:
276
- lines = obf.split('\n')
277
- for i, line in enumerate(lines):
278
- if remove_prints:
279
- if line.replace(' ', '').startswith('print('):
280
- j = 0
281
- for j, char in enumerate(line):
282
- if char != ' ':
283
- break
284
- lines[i] = f'{" "*j}pass'
285
- has_dno = line.endswith(dno_sig)
286
- if remove_comments:
287
- lines[i] = lines[i].split('#')[0]
288
- if has_dno:
289
- lines[i] = lines[i] + ' ' + dno_char
290
- obf = '\n'.join(lines)
291
- lines = obf.split('\n')
292
- lines = [line for line in lines if not any([set(line) == set(j) for j in ['', ' ']])]
293
- obf = '\n'.join(lines)
294
-
295
- if add_lines:
296
- # gather reserved strings
297
- reserved = []
298
- reserved.extend(keyword.kwlist) # keywords
299
- reserved.extend(dir(builtins)) # functions/constants
300
- reserved.extend([attr for attr in dir(object) if attr.startswith('__') and attr.endswith('__')]) # dunders
301
- reserved.extend([name for name, obj in vars(builtins).items() if inspect.isclass(obj) and issubclass(obj, BaseException)]) # exceptions
302
- # tokenize file
303
- base_splits = '\n\\!#$%&()*+,-./:;<=>?@[\]^`{|}~'
304
- var_splits = base_splits + ' "\''
305
- token_splits = base_splits + ' _'
306
- possible_existing_variables = zhmiscellany.string.multi_split(obf, list(var_splits))
307
- tokens = zhmiscellany.string.multi_split(obf, list(token_splits))
308
- tokens = [token for token in tokens if all([char in list(string.ascii_letters + string.digits + "_") for char in token])]
309
- tokens = [token for token in tokens if dno_char not in token]
310
- tokens = [token for token in tokens if token not in reserved]
311
- tokens = list(dict.fromkeys(tokens))
312
- number_tokens = [token for token in tokens if all([char in '1234567890' for char in token])]
313
- #number_tokens = [token for token in number_tokens if set(token) != set('0')]
314
- number_tokens = [token for token in number_tokens if not token.startswith('0')]
315
- all_tkns = copy.deepcopy(tokens)
316
- for i in number_tokens:
317
- tokens.remove(i)
318
- number_tokens = [num for num in number_tokens if len(str(num)) < 10000]
319
-
320
-
321
- base_rng = random.Random(0.26900750624933856)
322
-
323
- rngs = {
324
- 'num_rng': random.Random(base_rng.random()),
325
- 'var_name_rng': random.Random(base_rng.random()),
326
- 'str_rng': random.Random(base_rng.random()),
327
- 'lst_rng': random.Random(base_rng.random()),
328
- 'new_rng': random.Random(base_rng.random()),
329
- 'global_rng': random.Random(base_rng.random()),
330
- 'match_rng': random.Random(base_rng.random()),
331
- 'create_var_name': random.Random(base_rng.random()),
332
- 'make_random_number': random.Random(base_rng.random()),
333
- 'create_string': random.Random(base_rng.random()),
334
- 'create_list': random.Random(base_rng.random()),
335
- }
336
-
337
-
338
- if not number_tokens:
339
- def make_random_number():
340
- ends = [10, 100, 1000]
341
- return rngs['make_random_number'].randint(0, rngs['make_random_number'].choice(ends))
342
- number_tokens = [make_random_number for i in range(round((len(obf.split('\n'))*new_line_ratio)/10))]
343
- total_new_lines = len(obf.split('\n'))*new_line_ratio
344
-
345
- def create_var_name(vars):
346
- while True:
347
- var = rngs['create_var_name'].choice(tokens)
348
362
  while True:
349
- if var[0] in list('1234567890'):
350
- break
351
- if var not in possible_existing_variables and var not in vars['all']:
352
- if rngs['create_var_name'].random() > 1/3:
353
- return var
354
- var = var + '_' + random.choice(tokens)
355
-
356
- def create_string(nds=None):
357
- stri = rngs['create_string'].choice(all_tkns)
358
-
359
- if not nds:
363
+ if rngs['create_string'].random() > 1/3:
364
+ stri = stri + ' ' + rngs['create_string'].choice(all_tkns)
365
+ else:
366
+ return nds + stri + nds
367
+
368
+ def create_list(vars, will_run=True):
369
+ lst_str = '['
370
+ elements = []
371
+ end = 2
372
+ if not will_run:
373
+ end = 3
374
+ chz = rngs['create_list'].randint(1, end)
360
375
  stnds = ['"', "'", '"""', "'''"]
361
- nds = rngs['create_string'].choice(stnds)
362
-
363
- while True:
364
- if rngs['create_string'].random() > 1/3:
365
- stri = stri + ' ' + rngs['create_string'].choice(all_tkns)
366
- else:
367
- return nds + stri + nds
368
-
369
- def create_list(vars, will_run=True):
370
- lst_str = '['
371
- elements = []
372
- end = 2
373
- if not will_run:
374
- end = 3
375
- chz = rngs['create_list'].randint(1, end)
376
- stnds = ['"', "'", '"""', "'''"]
377
- nds = rngs['create_list'].choice(stnds)
378
- while True:
379
- if rngs['create_list'].random() > 1/6:
380
- match chz:
381
- case 1:
382
- elements.append(create_string(nds))
383
- case 2:
384
- elements.append(rngs['create_list'].choice(number_tokens))
385
- case 3:
386
- elements.append(rngs['create_list'].choice(vars['all']))
387
- else:
388
- break
389
- lst_str = lst_str + ', '.join(elements)
390
- lst_str = lst_str + ']'
391
- return lst_str
392
-
393
- varis = {
394
- 'added_lines': [],
395
- 'all': [],
396
- 'num': [],
397
- 'str': [],
398
- 'lst': [],
399
- 'fun': [],
400
- }
401
- prev = ''
402
-
403
- rngs['gen_num_var'] = random.Random(base_rng.random())
404
- rngs['gen_str_var'] = random.Random(base_rng.random())
405
- rngs['gen_lst_var'] = random.Random(base_rng.random())
406
- rngs['rand_num'] = random.Random(base_rng.random())
407
- rngs['rand_var'] = random.Random(base_rng.random())
408
- rngs['rand_loop'] = random.Random(base_rng.random())
409
- rngs['rand_num_add'] = random.Random(base_rng.random())
410
- rngs['rand_num_sub'] = random.Random(base_rng.random())
411
- rngs['rand_str'] = random.Random(base_rng.random())
412
- rngs['rand_print'] = random.Random(base_rng.random())
413
- rngs['rand_lst'] = random.Random(base_rng.random())
414
- rngs['add_pass'] = random.Random(base_rng.random())
415
- rngs['add_random_line'] = random.Random(base_rng.random())
416
- rngs['rand_var_add'] = random.Random(base_rng.random())
417
- rngs['rand_var_sub'] = random.Random(base_rng.random())
418
- rngs['gen_other_var'] = random.Random(base_rng.random())
419
- rngs['rand_func'] = random.Random(base_rng.random())
420
- rngs['rand_call_func'] = random.Random(base_rng.random())
421
-
422
- dno_indent = None
423
-
424
- for i, line in enumerate(lines):
425
- indent = 0
426
- for char in line:
427
- if char == ' ':
428
- indent += 1
429
- else:
430
- break
431
- single_indent = 4 if indent % 4 == 0 else 2
432
- varis['indent'] = indent
433
-
434
- if line.endswith(dno_char) or indent == dno_indent:
435
- dno_indent = indent
436
- continue
437
- else:
438
- dno_indent = None
439
-
440
-
441
- def gen_num_var(vars):
442
-
443
- if 1 / 4 > rngs['gen_num_var'].random() and vars['num']:
444
- cvar = rngs['gen_num_var'].choice(vars['num'])
445
- else:
446
- cvar = create_var_name(vars)
447
- vars['num'].append(cvar)
448
- vars['all'].append(cvar)
449
-
450
- return cvar
451
-
452
- def gen_str_var(vars):
453
-
454
- non_num = []
455
- non_num.extend(vars['str'])
456
- non_num.extend(vars['lst'])
457
-
458
- if 1 / 4 > rngs['gen_str_var'].random() and non_num:
459
- cvar = rngs['gen_str_var'].choice(non_num)
460
- else:
461
- cvar = create_var_name(vars)
462
- vars['str'].append(cvar)
463
- vars['all'].append(cvar)
464
-
465
- return cvar
466
-
467
- def gen_lst_var(vars):
468
-
469
- non_num = []
470
- non_num.extend(vars['str'])
471
- non_num.extend(vars['lst'])
376
+ nds = rngs['create_list'].choice(stnds)
377
+ while True:
378
+ if rngs['create_list'].random() > 1/6:
379
+ match chz:
380
+ case 1:
381
+ elements.append(create_string(nds))
382
+ case 2:
383
+ elements.append(rngs['create_list'].choice(number_tokens))
384
+ case 3:
385
+ elements.append(rngs['create_list'].choice(vars['all']))
386
+ else:
387
+ break
388
+ lst_str = lst_str + ', '.join(elements)
389
+ lst_str = lst_str + ']'
390
+ return lst_str
391
+
392
+ varis = {
393
+ 'added_lines': [],
394
+ 'all': [],
395
+ 'num': [],
396
+ 'str': [],
397
+ 'lst': [],
398
+ 'fun': [],
399
+ }
400
+ prev = ''
401
+
402
+ rngs['gen_num_var'] = random.Random(base_rng.random())
403
+ rngs['gen_str_var'] = random.Random(base_rng.random())
404
+ rngs['gen_lst_var'] = random.Random(base_rng.random())
405
+ rngs['rand_num'] = random.Random(base_rng.random())
406
+ rngs['rand_var'] = random.Random(base_rng.random())
407
+ rngs['rand_loop'] = random.Random(base_rng.random())
408
+ rngs['rand_num_add'] = random.Random(base_rng.random())
409
+ rngs['rand_num_sub'] = random.Random(base_rng.random())
410
+ rngs['rand_str'] = random.Random(base_rng.random())
411
+ rngs['rand_print'] = random.Random(base_rng.random())
412
+ rngs['rand_lst'] = random.Random(base_rng.random())
413
+ rngs['add_pass'] = random.Random(base_rng.random())
414
+ rngs['add_random_line'] = random.Random(base_rng.random())
415
+ rngs['rand_var_add'] = random.Random(base_rng.random())
416
+ rngs['rand_var_sub'] = random.Random(base_rng.random())
417
+ rngs['gen_other_var'] = random.Random(base_rng.random())
418
+ rngs['rand_func'] = random.Random(base_rng.random())
419
+ rngs['rand_call_func'] = random.Random(base_rng.random())
420
+
421
+ dno_indent = None
422
+
423
+ for i, line in enumerate(lines):
424
+ indent = 0
425
+ for char in line:
426
+ if char == ' ':
427
+ indent += 1
428
+ else:
429
+ break
430
+ single_indent = 4 if indent % 4 == 0 else 2
431
+ varis['indent'] = indent
472
432
 
473
- if 1 / 4 > rngs['gen_lst_var'].random() and non_num:
474
- cvar = rngs['gen_lst_var'].choice(non_num)
433
+ if line.endswith(dno_char) or indent == dno_indent:
434
+ dno_indent = indent
435
+ continue
475
436
  else:
476
- cvar = create_var_name(vars)
477
- vars['lst'].append(cvar)
478
- vars['all'].append(cvar)
437
+ dno_indent = None
479
438
 
480
- return cvar
481
439
 
482
- def gen_func_var(vars):
483
- cvar = create_var_name(vars)
484
- vars['fun'].append(cvar)
485
- vars['all'].append(cvar)
440
+ def gen_num_var(vars):
486
441
 
487
- return cvar
488
-
489
- def gen_other_var(vars):
490
- cvar = create_var_name(vars)
491
- vars['all'].append(cvar)
492
- return cvar
493
-
494
- while rngs['global_rng'].random() > 1/(new_line_ratio*2) and (not any([prev.endswith(char) for char in list(' ,\\[{(')+reserved])) and (not any([char in line for char in ':'])):
442
+ if 1 / 4 > rngs['gen_num_var'].random() and vars['num']:
443
+ cvar = rngs['gen_num_var'].choice(vars['num'])
444
+ else:
445
+ cvar = create_var_name(vars)
446
+ vars['num'].append(cvar)
447
+ vars['all'].append(cvar)
495
448
 
496
- def rand_num(vars, will_run=True): # var (new/old) to random int
497
- cvar = gen_num_var(vars)
498
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {rngs['rand_num'].choice(number_tokens)}"))
499
449
  return cvar
500
450
 
501
- def rand_var(vars, will_run=False): # var (new/old) to random previous var
502
- if will_run:
503
- raise Exception('This should not be possible')
451
+ def gen_str_var(vars):
504
452
 
505
- if vars['all']:
506
- ev = rngs['rand_var'].choice(vars['all'])
507
- else:
508
- add_random_line(vars, will_run)
509
- return
453
+ non_num = []
454
+ non_num.extend(vars['str'])
455
+ non_num.extend(vars['lst'])
510
456
 
511
- if ev in vars['num']:
512
- cvar = gen_num_var(vars)
513
- elif ev in vars['str']:
514
- cvar = gen_str_var(vars)
515
- elif ev in vars['lst']:
516
- cvar = gen_lst_var(vars)
457
+ if 1 / 4 > rngs['gen_str_var'].random() and non_num:
458
+ cvar = rngs['gen_str_var'].choice(non_num)
517
459
  else:
518
- cvar = gen_other_var(vars)
519
-
520
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {ev}"))
521
- return cvar
460
+ cvar = create_var_name(vars)
461
+ vars['str'].append(cvar)
462
+ vars['all'].append(cvar)
522
463
 
523
- def rand_loop(vars, cvar, will_run=True):
524
- if rngs['rand_loop'].random() > 1/(new_line_ratio/4):
525
- return
526
- end = 1
527
- if cvar in vars['num']:
528
- end = 2
529
- choice = rngs['rand_loop'].randint(1, end)
530
- match choice:
531
- case 1:
532
- vars['added_lines'].append((i, f"{' ' * vars['indent']}while {cvar}:"))
533
- case 2:
534
- vars['added_lines'].append((i, f"{' ' * vars['indent']}for {gen_other_var(vars)} in range(0, {cvar}):"))
535
-
536
- vars['indent'] += single_indent
537
- f = True
538
- while rngs['rand_loop'].random() > 1 / (new_line_ratio * 2) or f:
539
- add_random_line(vars, False)
540
- f = False
541
- vars['indent'] -= single_indent
542
-
543
- def rand_func(vars, will_run=True):
544
- if rngs['rand_func'].random() > 1/(new_line_ratio):
545
- add_random_line(vars, will_run)
546
- return
547
- cvar = gen_func_var(vars)
548
- ev = []
549
- while rngs['rand_func'].random() < 1/3:
550
- ev.append(create_var_name(vars))
551
- ev = ', '.join(ev)
552
- vars['added_lines'].append((i, f"{' ' * vars['indent']}def {cvar}({ev}):"))
553
- vars['indent'] += single_indent
554
- cvars = []
555
- while rngs['rand_func'].random() > 1 / (new_line_ratio * 2) or len([e for e in cvars if e]) == 0:
556
- cvars.append(add_random_line(vars, will_run))
557
- cvars = [e for e in cvars if e]
558
- ev = []
559
- f = True
560
- while rngs['rand_func'].random() < 1/3 or f:
561
- ev.append(rngs['rand_func'].choice(cvars))
562
- f = False
563
- ev = ', '.join(ev)
564
- if rngs['rand_func'].random() > 1/3:
565
- vars['added_lines'].append((i, f"{' ' * vars['indent']}return {ev}"))
566
- vars['indent'] -= single_indent
567
464
  return cvar
568
465
 
569
- def rand_call_func(vars, will_run=True):
570
- if (not vars['fun']) or will_run:
571
- add_random_line(vars, will_run)
572
- return
573
- func = rngs['rand_call_func'].choice(vars['fun'])
574
- ev = []
575
- while rngs['rand_call_func'].random() < 1/3:
576
- ev.append(rngs['rand_call_func'].choice(vars['all']))
577
- ev = ', '.join(ev)
578
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{func}({ev})"))
579
-
580
- def rand_num_add(vars, will_run=True): # var (new/old) to random int + random int
581
- cvar = gen_num_var(vars)
582
- pos1 = rngs['rand_num_add'].choice(number_tokens)
583
- pos2 = rngs['rand_num_add'].choice(number_tokens)
584
- falsy = False
585
- chz = rngs['rand_var_add'].randint(1, 3)
586
- match chz:
587
- case 1:
588
- pos3 = '+'
589
- if not (int(pos1) + int(pos2)): falsy = True
590
- case 2:
591
- pos3 = '-'
592
- if not (int(pos1) - int(pos2)): falsy = True
593
- case 3:
594
- pos3 = '*'
595
- if not (int(pos1) * int(pos2)): falsy = True
596
-
597
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
598
- if falsy:
599
- rand_loop(vars, cvar)
600
- return cvar
466
+ def gen_lst_var(vars):
601
467
 
602
- def rand_var_add(vars, will_run=False): # var (new/old) to random int + random int
603
- if will_run:
604
- raise Exception('This should not be possible')
605
- cvar = gen_num_var(vars)
606
-
607
- chz = rngs['rand_var_add'].randint(1, 2)
608
- match chz:
609
- case 1:pos1 = rngs['rand_var_add'].choice(number_tokens)
610
- case 2:pos1 = rngs['rand_var_add'].choice(vars['all'])
611
-
612
- chz = rngs['rand_var_add'].randint(1, 2)
613
- match chz:
614
- case 1:pos2 = rngs['rand_var_add'].choice(number_tokens)
615
- case 2:pos2 = rngs['rand_var_add'].choice(vars['all'])
616
-
617
- chz = rngs['rand_var_add'].randint(1, 7)
618
- match chz:
619
- case 1:pos3 = '+'
620
- case 2:pos3 = '-'
621
- case 3:pos3 = '/'
622
- case 4:pos3 = '//'
623
- case 5:pos3 = '%'
624
- case 6:pos3 = '*'
625
- case 7:pos3 = '**'
626
-
627
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
628
- return cvar
468
+ non_num = []
469
+ non_num.extend(vars['str'])
470
+ non_num.extend(vars['lst'])
629
471
 
630
- def rand_str(vars, will_run=True): # var (new/old) to random string
631
- cvar = gen_str_var(vars) # impossible for this to be falsy
632
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {create_string()}"))
633
- return cvar
472
+ if 1 / 4 > rngs['gen_lst_var'].random() and non_num:
473
+ cvar = rngs['gen_lst_var'].choice(non_num)
474
+ else:
475
+ cvar = create_var_name(vars)
476
+ vars['lst'].append(cvar)
477
+ vars['all'].append(cvar)
634
478
 
635
- def rand_print(vars, will_run=False): # print 1 random var or 2 random string or 3 random int or 4 random list
636
- if will_run:
637
- raise Exception('This should not be possible')
638
- cvar = gen_str_var(vars)
639
- choice = rngs['rand_print'].randint(1, 4)
640
- match choice:
641
- case 1:
642
- ev = rngs['rand_print'].choice(vars['all'])
643
- case 2:
644
- ev = create_string()
645
- case 3:
646
- ev = rngs['rand_print'].choice(number_tokens)
647
- case 4:
648
- ev = create_list(vars)
649
- vars['added_lines'].append((i, f"{' ' * vars['indent']}print({ev})"))
650
-
651
- def rand_lst(vars, will_run=True): # var (new/old) to random list
652
- lst = create_list(vars, will_run)
653
- cvar = gen_lst_var(vars)
654
- vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {lst}"))
655
- if lst == '[]': # this will miss some but vast majority will be caught
656
- rand_loop(vars, cvar)
657
479
  return cvar
658
480
 
659
- def add_pass(vars, will_run=True): # pass
660
- vars['added_lines'].append((i, f"{' ' * vars['indent']}pass"))
661
-
662
- run_vars = [rand_num, rand_num_add, rand_str, rand_lst, add_pass, rand_func]
663
- all_vars = run_vars + [rand_var, rand_print, rand_var_add, rand_call_func]
481
+ def gen_func_var(vars):
482
+ cvar = create_var_name(vars)
483
+ vars['fun'].append(cvar)
484
+ vars['all'].append(cvar)
664
485
 
665
- def add_random_line(vars, will_run=True):
666
- if will_run:
667
- line_variations = run_vars
668
- else:
669
- line_variations = all_vars
670
- variation = rngs['add_random_line'].choice(line_variations)
671
- cvar = variation(vars, will_run)
672
486
  return cvar
673
487
 
674
- add_random_line(varis)
488
+ def gen_other_var(vars):
489
+ cvar = create_var_name(vars)
490
+ vars['all'].append(cvar)
491
+ return cvar
675
492
 
676
- prev = line
493
+ while rngs['global_rng'].random() > 1/(new_line_ratio*2) and (not any([prev.endswith(char) for char in list(' ,\\[{(')+reserved])) and (not any([char in line for char in ':'])):
677
494
 
678
- varis['added_lines'].reverse()
679
- for line in varis['added_lines']:
680
- lines.insert(line[0], line[1])
681
- obf = '\n'.join(lines)
495
+ def rand_num(vars, will_run=True): # var (new/old) to random int
496
+ cvar = gen_num_var(vars)
497
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {rngs['rand_num'].choice(number_tokens)}"))
498
+ return cvar
499
+
500
+ def rand_var(vars, will_run=False): # var (new/old) to random previous var
501
+ if will_run:
502
+ raise Exception('This should not be possible')
503
+
504
+ if vars['all']:
505
+ ev = rngs['rand_var'].choice(vars['all'])
506
+ else:
507
+ add_random_line(vars, will_run)
508
+ return
509
+
510
+ if ev in vars['num']:
511
+ cvar = gen_num_var(vars)
512
+ elif ev in vars['str']:
513
+ cvar = gen_str_var(vars)
514
+ elif ev in vars['lst']:
515
+ cvar = gen_lst_var(vars)
516
+ else:
517
+ cvar = gen_other_var(vars)
518
+
519
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {ev}"))
520
+ return cvar
521
+
522
+ def rand_loop(vars, cvar, will_run=True):
523
+ if rngs['rand_loop'].random() > 1/(new_line_ratio/4):
524
+ return
525
+ end = 1
526
+ if cvar in vars['num']:
527
+ end = 2
528
+ choice = rngs['rand_loop'].randint(1, end)
529
+ match choice:
530
+ case 1:
531
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}while {cvar}:"))
532
+ case 2:
533
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}for {gen_other_var(vars)} in range(0, {cvar}):"))
534
+
535
+ vars['indent'] += single_indent
536
+ f = True
537
+ while rngs['rand_loop'].random() > 1 / (new_line_ratio * 2) or f:
538
+ add_random_line(vars, False)
539
+ f = False
540
+ vars['indent'] -= single_indent
541
+
542
+ def rand_func(vars, will_run=True):
543
+ if rngs['rand_func'].random() > 1/(new_line_ratio):
544
+ add_random_line(vars, will_run)
545
+ return
546
+ cvar = gen_func_var(vars)
547
+ ev = []
548
+ while rngs['rand_func'].random() < 1/3:
549
+ ev.append(create_var_name(vars))
550
+ ev = ', '.join(ev)
551
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}def {cvar}({ev}):"))
552
+ vars['indent'] += single_indent
553
+ cvars = []
554
+ while rngs['rand_func'].random() > 1 / (new_line_ratio * 2) or len([e for e in cvars if e]) == 0:
555
+ cvars.append(add_random_line(vars, will_run))
556
+ cvars = [e for e in cvars if e]
557
+ ev = []
558
+ f = True
559
+ while rngs['rand_func'].random() < 1/3 or f:
560
+ ev.append(rngs['rand_func'].choice(cvars))
561
+ f = False
562
+ ev = ', '.join(ev)
563
+ if rngs['rand_func'].random() > 1/3:
564
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}return {ev}"))
565
+ vars['indent'] -= single_indent
566
+ return cvar
567
+
568
+ def rand_call_func(vars, will_run=True):
569
+ if (not vars['fun']) or will_run:
570
+ add_random_line(vars, will_run)
571
+ return
572
+ func = rngs['rand_call_func'].choice(vars['fun'])
573
+ ev = []
574
+ while rngs['rand_call_func'].random() < 1/3:
575
+ ev.append(rngs['rand_call_func'].choice(vars['all']))
576
+ ev = ', '.join(ev)
577
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{func}({ev})"))
578
+
579
+ def rand_num_add(vars, will_run=True): # var (new/old) to random int + random int
580
+ cvar = gen_num_var(vars)
581
+ pos1 = rngs['rand_num_add'].choice(number_tokens)
582
+ pos2 = rngs['rand_num_add'].choice(number_tokens)
583
+ falsy = False
584
+ chz = rngs['rand_var_add'].randint(1, 3)
585
+ match chz:
586
+ case 1:
587
+ pos3 = '+'
588
+ if not (int(pos1) + int(pos2)): falsy = True
589
+ case 2:
590
+ pos3 = '-'
591
+ if not (int(pos1) - int(pos2)): falsy = True
592
+ case 3:
593
+ pos3 = '*'
594
+ if not (int(pos1) * int(pos2)): falsy = True
595
+
596
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
597
+ if falsy:
598
+ rand_loop(vars, cvar)
599
+ return cvar
600
+
601
+ def rand_var_add(vars, will_run=False): # var (new/old) to random int + random int
602
+ if will_run:
603
+ raise Exception('This should not be possible')
604
+ cvar = gen_num_var(vars)
682
605
 
683
- lines = obf.split('\n')
684
- for i, line in enumerate(lines):
685
- if line.endswith(dno_char):
686
- lines[i] = line.replace(dno_char, '')
687
- line_char_list = list(lines[i])
688
- if line_char_list:
689
- while line_char_list[-1] == ' ':
690
- line_char_list.pop()
691
- if not line_char_list:
692
- break
693
- lines[i] = ''.join(line_char_list)
694
- obf = '\n'.join(lines)
695
- return obf
606
+ chz = rngs['rand_var_add'].randint(1, 2)
607
+ match chz:
608
+ case 1:pos1 = rngs['rand_var_add'].choice(number_tokens)
609
+ case 2:pos1 = rngs['rand_var_add'].choice(vars['all'])
610
+
611
+ chz = rngs['rand_var_add'].randint(1, 2)
612
+ match chz:
613
+ case 1:pos2 = rngs['rand_var_add'].choice(number_tokens)
614
+ case 2:pos2 = rngs['rand_var_add'].choice(vars['all'])
615
+
616
+ chz = rngs['rand_var_add'].randint(1, 7)
617
+ match chz:
618
+ case 1:pos3 = '+'
619
+ case 2:pos3 = '-'
620
+ case 3:pos3 = '/'
621
+ case 4:pos3 = '//'
622
+ case 5:pos3 = '%'
623
+ case 6:pos3 = '*'
624
+ case 7:pos3 = '**'
625
+
626
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {pos1} {pos3} {pos2}"))
627
+ return cvar
628
+
629
+ def rand_str(vars, will_run=True): # var (new/old) to random string
630
+ cvar = gen_str_var(vars) # impossible for this to be falsy
631
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {create_string()}"))
632
+ return cvar
633
+
634
+ def rand_print(vars, will_run=False): # print 1 random var or 2 random string or 3 random int or 4 random list
635
+ if will_run:
636
+ raise Exception('This should not be possible')
637
+ cvar = gen_str_var(vars)
638
+ choice = rngs['rand_print'].randint(1, 4)
639
+ match choice:
640
+ case 1:
641
+ ev = rngs['rand_print'].choice(vars['all'])
642
+ case 2:
643
+ ev = create_string()
644
+ case 3:
645
+ ev = rngs['rand_print'].choice(number_tokens)
646
+ case 4:
647
+ ev = create_list(vars)
648
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}print({ev})"))
649
+
650
+ def rand_lst(vars, will_run=True): # var (new/old) to random list
651
+ lst = create_list(vars, will_run)
652
+ cvar = gen_lst_var(vars)
653
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}{cvar} = {lst}"))
654
+ if lst == '[]': # this will miss some but vast majority will be caught
655
+ rand_loop(vars, cvar)
656
+ return cvar
657
+
658
+ def add_pass(vars, will_run=True): # pass
659
+ vars['added_lines'].append((i, f"{' ' * vars['indent']}pass"))
660
+
661
+ run_vars = [rand_num, rand_num_add, rand_str, rand_lst, add_pass, rand_func]
662
+ all_vars = run_vars + [rand_var, rand_print, rand_var_add, rand_call_func]
663
+
664
+ def add_random_line(vars, will_run=True):
665
+ if will_run:
666
+ line_variations = run_vars
667
+ else:
668
+ line_variations = all_vars
669
+ variation = rngs['add_random_line'].choice(line_variations)
670
+ cvar = variation(vars, will_run)
671
+ return cvar
672
+
673
+ add_random_line(varis)
674
+
675
+ prev = line
676
+
677
+ varis['added_lines'].reverse()
678
+ for line in varis['added_lines']:
679
+ lines.insert(line[0], line[1])
680
+ obf = '\n'.join(lines)
681
+
682
+ lines = obf.split('\n')
683
+ for i, line in enumerate(lines):
684
+ if line.endswith(dno_char):
685
+ lines[i] = line.replace(dno_char, '')
686
+ line_char_list = list(lines[i])
687
+ if line_char_list:
688
+ while line_char_list[-1] == ' ':
689
+ line_char_list.pop()
690
+ if not line_char_list:
691
+ break
692
+ lines[i] = ''.join(line_char_list)
693
+ obf = '\n'.join(lines)
694
+ return obf
696
695
 
697
696
  _CYAN = '\033[96m'
698
697
  _RESET = '\033[0m'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zhmiscellany
3
- Version: 6.1.1
3
+ Version: 6.1.3
4
4
  Summary: A collection of useful/interesting python libraries made by zh.
5
5
  Home-page: https://discord.gg/ThBBAuueVJ
6
6
  Author: zh
@@ -20,6 +20,7 @@ Requires-Dist: psutil>=0
20
20
  Requires-Dist: kthread>=0
21
21
  Requires-Dist: pillow>=0
22
22
  Requires-Dist: fuzzywuzzy>=0
23
+ Requires-Dist: pyautogui>=0; sys_platform == "linux"
23
24
  Requires-Dist: ray>=0; sys_platform == "win32"
24
25
  Requires-Dist: pywin32>=0; sys_platform == "win32"
25
26
  Requires-Dist: random-header-generator>=0; sys_platform == "win32"
@@ -14,14 +14,14 @@ zhmiscellany/image.py,sha256=qUjxiYpc2VVZp2vwr1vN36O2PVQ7YlMKzhegQ1u4c0M,8198
14
14
  zhmiscellany/list.py,sha256=S8Z85bLJEP9lk2JkGpzUcG6kpRB7a-NWDIHMPiF5bKo,1473
15
15
  zhmiscellany/macro.py,sha256=kKtKYoHLSnBBHyGl8FlnfMaAoraKKSK023VA-mOezO0,27861
16
16
  zhmiscellany/math.py,sha256=btOQTe_GvqP0A7Zz84tmN_c8j1NGe_mKnhmAt40lhLU,2482
17
- zhmiscellany/misc.py,sha256=i4ZZ4ivfSfzjqXPe0etrK9l9zXk-TK6I9HRtts63YHc,30482
17
+ zhmiscellany/misc.py,sha256=llL3ZHD5pxS4RDKLj3gX0k3NpE2mM5g3JVd0k_RvIUg,31979
18
18
  zhmiscellany/netio.py,sha256=VCqlo3ev_iOTTu5sXTZQwsYU0WMbAlOTDRsJ5Dj5-fc,2519
19
19
  zhmiscellany/pastebin.py,sha256=TbZ3DqFYXo5qt5d95ugrofYoptlzKkjXUr7VnEqa6ks,6357
20
20
  zhmiscellany/pipes.py,sha256=zETvWP4PF-PuSzYwR1UCodY4ftNAgmCChb9DUMofXok,4657
21
21
  zhmiscellany/processing.py,sha256=sDKIbzG9TNFyT6yJ4TJL59taG-59_v3CBLekVSLrwgE,10899
22
22
  zhmiscellany/rust.py,sha256=znN6DYNoa_p-braTuDZKvUnXX8reWLFu_dG4fv2vLR0,442
23
23
  zhmiscellany/string.py,sha256=xyqE6V5YF2nieZDcg5ZrXTIrH2D9oDRbZ5vQGz8rPys,4787
24
- zhmiscellany-6.1.1.dist-info/METADATA,sha256=Lnwfs_NU-_rNk2bHx9V1eDc6yK_Hdnl3mmVqDWSxSHI,43769
25
- zhmiscellany-6.1.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
26
- zhmiscellany-6.1.1.dist-info/top_level.txt,sha256=ioDtsrevCI52rTxZntMPljRIBsZs73tD0hI00HektiE,13
27
- zhmiscellany-6.1.1.dist-info/RECORD,,
24
+ zhmiscellany-6.1.3.dist-info/METADATA,sha256=UQtMiCoWBMenj5AXC81dH8HirK5pTFr3FtiPQeUEMIA,43823
25
+ zhmiscellany-6.1.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
26
+ zhmiscellany-6.1.3.dist-info/top_level.txt,sha256=ioDtsrevCI52rTxZntMPljRIBsZs73tD0hI00HektiE,13
27
+ zhmiscellany-6.1.3.dist-info/RECORD,,